-
引言
下圖顯示了兩種不同麥克風設置的靈敏度模式。 左圖顯示了理想的全向麥克風的模式。 它表明麥克風對來自各個方向的信號具有相同的靈敏度。 右圖顯示了聚焦的靈敏度模式,旨在在單個方向上獲得最大靈敏度,而所有其他方向的靈敏度都降低了,目的是創建一種靈敏度模式,從而能夠“監聽”來自單個方向的信號 。
可以通過使用簡單的線性麥克風陣列來實現波束形成。 這種陣列如下所示,在這種情況下,該陣列具有三個麥克風。 顯而易見,波陣面的方向會影響信號到達陣列中每個陣元的時間。 當從-45°到達時,信號首先到達左手麥克風;當從垂直於陣列的方向(稱爲寬邊)到達時,信號同時到達每個麥克風;當從+ 45°到達時,右手麥克風首先接收信號。
如果通過對所有麥克風信號求和來創建陣列的輸出,則當信號來自垂直於陣列的信號源時,將獲得最大輸出幅度; 信號是同時到達的,它們在時間上高度相關並且彼此增強。 或者,如果信號來自非垂直方向,則它們將在不同的時間到達,因此相關性會降低,並導致輸出幅度較小。
-
波束模式
可以使用簡單的計算來確定麥克風陣列對於來自特定方向的信號的靈敏度。 下圖顯示了帶有四個麥克風的陣列。 每個陣列之間的距離爲(以米爲單位)。 從垂直於陣列的角度測量到達角。 下面的等式計算單個頻率f的陣列增益和到達角。 表示聲音的速度,表示麥克風的數量。
注意:該方程式有一些假設; 信號源離陣列足夠遠,因此波前實際上是平坦的,而且信號從信源傳播到麥克風時,信號衰減也沒有考慮到。
下圖顯示了陣列的增益。 將輸出標準化爲從單個麥克風接收的輸出。 因此,在0度的角度(寬邊)下,輸出幅度等效於全向麥克風,從而獲得1(或0 dB)的增益。
波束模式,4個元素,0.2m間距,1kHz 極性形式的波束模式
這些圖的數據是使用以下代碼生成的。 然後使用gnuplot將其繪製。 下面還給出了兩組gnuplot命令,一組用於XY圖,另一組用於極座標圖。
#include <stdio.h>
#include <math.h>
#define ANGLE_RESOLUTION 500 // Number of angle points to calculate
int main(void)
{
int numElements = 4; // Number of array elements
double spacing = 0.2; // Element separation in metres
double freq = 1000.0; // Signal frequency in Hz
double speedSound = 343.0; // m/s
int a;
int i;
// Iterate through arrival angle points
for (a=0 ; a<ANGLE_RESOLUTION ; a++)
{
// Calculate the planewave arrival angle
double angle = -90 + 180.0 * a / (ANGLE_RESOLUTION-1);
double angleRad = M_PI * (double) angle / 180;
double realSum = 0;
double imagSum = 0;
// Iterate through array elements
for (i=0 ; i<numElements ; i++)
{
// Calculate element position and wavefront delay
double position = i * spacing;
double delay = position * sin(angleRad) / speedSound;
// Add Wave
realSum += cos(2.0 * M_PI * freq * delay);
imagSum += sin(2.0 * M_PI * freq * delay);
}
double output = sqrt(realSum * realSum + imagSum * imagSum) / numElements;
double logOutput = 20 * log10(output);
if (logOutput < -50) logOutput = -50;
printf("%d %f %f %f %f\n", a, angle, angleRad, output, logOutput);
}
return 0;
}
執行
gcc -lm -o beamPattern beamPattern.c
./beamPattern > beamPattern.dat
gnuplot
gnuplot> call 'beamPattern.gnuplot'
下面的gnuplot命令可用於生成上面顯示的兩個不同的波束方向圖。
File: beamPattern.gnuplot
reset
unset key
set xlabel "Arrival Angle (degrees)" font "arial,12"
set ylabel "Gain (dB)" font "arial,12"
set grid lc rgbcolor "#BBBBBB"
plot 'beamPattern.dat' u 2:5 w l
File: polar.gnuplot
reset
set angles degrees
set polar
set grid polar 30 lc rgbcolor "#999999"
unset border
unset param
set size ratio 1 1,1
set xtics axis nomirror -50,10
unset ytics
unset key
set style data line
set xrange[-50:50]
set yrange[-50:50]
set rrange[-50:0]
set label 1 "0°" at graph 1.01,0.5 front
set label 2 "180°" at graph -0.01,0.5 right front
set label 3 "-90°" at graph 0.5,-0.03 center front
set label 4 "90°" at graph 0.5,1.03 center front
plot 'beamPattern.dat' u 2:5
-
頻率響應
上一節中的靈敏度圖計算是針對單個頻率計算的。 在處理寬帶源(例如語音)時,計算陣列的頻率響應非常重要。 下圖顯示了陣列在0到10000Hz頻率範圍內的頻率響應。 最引人注意的功能是增益最大值,其中陣列的輸出等於垂直源方向的輸出。 這些被稱爲光柵波瓣,將在下面進行解釋。 它們的效果是定向濾波的損失。 從非垂直方向到達的信號源將使其在頻帶中到達陣列的輸出。
另一個有趣的特徵是低頻缺乏方向性。
下面顯示了用於生成該圖的數據的代碼。 還給出了gnuplot命令。
File: freqResp.c
#include <stdio.h>
#include <math.h>
#define FREQ_RESOLUTION 500 // Number of freq points to calculate
#define ANGLE_RESOLUTION 500 // Number of angle points to calculate
int main(void)
{
int numElements = 4; // Number of array elements
double spacing = 0.2; // Element separation in metre
double speedSound = 343.0; // m/s
int f, a, i;
// Iterate through arrival angle points
for (f=0 ; f<FREQ_RESOLUTION ; f++)
{
double freq = 10000.0 * f / (FREQ_RESOLUTION-1);
for (a=0 ; a<ANGLE_RESOLUTION ; a++)
{
// Calculate the planewave arrival angle
double angle = -90 + 180.0 * a / (ANGLE_RESOLUTION-1);
double angleRad = M_PI * (double) angle / 180;
double realSum = 0;
double imagSum = 0;
// Iterate through array elements
for (i=0 ; i<numElements ; i++)
{
// Calculate element position and wavefront delay
double position = i * spacing;
double delay = position * sin(angleRad) / speedSound;
// Add Wave
realSum += cos(2.0 * M_PI * freq * delay);
imagSum += sin(2.0 * M_PI * freq * delay);
}
double output = sqrt(realSum * realSum + imagSum * imagSum) / numElements;
double logOutput = 20 * log10(output);
if (logOutput < -50) logOutput = -50;
printf("%f %f %f\n", angle, freq, logOutput);
}
printf("\n");
}
return 0;
gcc -lm -o freqResp freqResp.c ./freqResp > freqResp.dat gnuplot gnuplot> call 'freqResp.gnuplot'
File: freqResp.gnuplot
reset
set xlabel "Arrival Angle (degrees)" font "arial,8"
set ylabel "Frequency (Hz)" font "arial,8"
set zlabel "Gain (dB)" font "arial,8"
set grid lc rgbcolor "#BBBBBB"
set xrange[-90:90]
set yrange[0:10000]
set zrange[-40:0]
unset key
set view 30,56,0.98
splot 'freqResp.dat' u 1:2:3 with pm3d
-
麥克風間距和數量
通過檢查“波束圖”部分的延遲和方程,可以發現波束形成器的性能取決於陣列元素的間距和數量。 下表說明更改這些參數如何影響波束形成器的空間濾波性能。
-
光柵波瓣
下圖是一個間隔爲0.2m,頻率爲4kHz的4元素陣列的波束方向圖。 該圖顯示了一些額外的瓣,其增益與主瓣匹配,這些被稱爲光柵瓣。 光柵波瓣通常是不需要的,因爲它們會導致陣列從主波瓣以外的方向拾取信號而不會衰減。
當信號波前必須在陣列元件之間傳播的額外距離是信號波長的倍數時,就會出現光柵波瓣。 在這種情況下,每個元素接收的信號高度相關,並且不會發生信號衰減。 如下右圖所示。
對於具有等距元素的一維線性陣列,光柵波瓣的位置易於計算。 l是單元間距,c是聲速,f是信號頻率,n是選擇光柵波瓣的整數。
-
轉向
到目前爲止,陣列靈敏度模式的主瓣已經固定在一個方向上。 垂直於數組。 波束形成陣列的強大功能是無需物理移動陣列即可電子控制波束模式的能力。 這可以通過在每個陣列元素上增加一個延遲級來簡單地實現。 下圖說明了此配置,該配置爲Delay-Sum體系結構命名。
這個想法非常簡單,在每個麥克風上增加一個延遲,以使來自特定方向的信號在求和之前先對齊。 通過控制這些陣列,可以控制主瓣方向。