本章原文出自http://www.labbookpages.co.uk/audio/beamforming/delaySum.html
延迟和波束形成
本页介绍了使用麦克风阵列进行波束成形的技术,作为创建聚焦“波束状”灵敏度模式的方法。描述了最简单的波束形成架构,即延迟求和波束形成器。
介绍
下图显示了两种不同麦克风设置的灵敏度模式。左侧的图表显示了理想的全向麦克风的模式。它表明麦克风对来自所有方向的信号具有相同的灵敏度。右手图像显示了聚焦灵敏度模式,旨在实现单一方向的最大灵敏度,而所有其他方向的灵敏度降低,目标是创建灵敏度模式,从而“监听”来自单一方向的信号。
可以通过使用简单的麦克风线性阵列来实现波束形成效果。下面说明这种阵列,在这种情况下阵列具有三个麦克风。很容易看出波前产生的方向对信号遇到阵列中每个元素的时间有影响。当从-45°到达时,信号首先到达左手麦克风,当从垂直于阵列(称为宽边)到达时,信号同时到达每个麦克风,当从+ 45°时,右手麦克风首先接收信号。
如果通过对所有麦克风信号求和来创建阵列的输出,则当信号源自垂直于阵列的源时,实现最大输出幅度; 信号同时到达,它们在时间上高度相关并相互加强。或者,如果信号源自非垂直方向,则它们将在不同时间到达,因此相关性较小并且将导致较小的输出幅度。
有关计算信号到达阵列的到达时间差异的完整介绍,请参阅延迟计算页面。
波束图形
可以使用简单的计算来确定麦克风阵列对来自特定方向的信号的灵敏度。下图显示了一个带有四个麦克风的阵列。每个阵列之间的距离为l(以米为单位)。到达角是从垂直于阵列测量的。下面的等式计算单个频率f的阵列增益 和到达角θ。c表示声速,N表示 麦克风的数量。
Wave Summation页面提供了有关如何推导出该等式的完整说明。
注意:等式做了一些假设; 信号源离阵列足够远,波阵面实际上是平坦的,也没有考虑信号在从信号源传播到麦克风时的衰减。
阵列的增益如下图所示。输出被标准化为将从单个麦克风接收的输出。因此,在0度(宽边)的角度下,输出幅度相当于全向麦克风,导致增益为1(或0 dB)。
波束图形,4个元素,0.2m间距,1kHz | 极形式的波束图形 |
这些图的数据是使用下面的代码生成的。然后使用gnuplot绘制。下面还给出了两组gnuplot命令,一组用于XY图,另一组用于极坐标图。
文件: beamPattern.c
#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命令可用于生成上面显示的两个不同的波束图模式。
文件: 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
文件: 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命令。
文件: 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'
文件: 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
麦克风间距和数量
从波数图形部分检查延迟和方程表明,波束形成器的性能取决于阵列元素的间距和数量。下表说明了如何更改这些参数会影响波束成形器的空间滤波性能。
5个元素,0.04m间距,0.2m孔径 | 15个元素,0.04米间距,0.6米孔径 | 25个元素,0.04米间距,1米孔径 | |
5个元素,0.08米间距,0.4米孔径 | 15个元素,0.08米间距,1.2米孔径 | 25个元素,0.08米间距,2米孔径 | |
5个元件,0.16m间距,0.8m孔径 | 15个元件,0.16m间距,2.4m孔径 | 25个元素,0.16m间距,4m孔径 |
光栅Lobes
下面是4个元件阵列的波数图形,频率为4kHz,间距为0.2m。该图显示了一些增益与主瓣相匹配的额外波瓣,这些波瓣称为栅瓣。光栅波瓣通常是不需要的,因为它们会使阵列从主波瓣以外的方向拾取信号而不会衰减。
当信号波前必须在阵列元件之间传播的额外距离是信号波长的倍数时,发生光栅波瓣。在这种情况下,每个元件接收的信号高度相关,并且不会发生信号衰减。这在右下图中说明。
对于具有等间距元件的一维线性阵列,栅瓣的位置易于计算。l是元素间距,c是声速, f是信号频率,n是选择光栅波瓣的整数。
|
操舵
到目前为止,阵列灵敏度模式的主瓣已经固定在一个方向上; 垂直于阵列。波束形成阵列的一个强大功能是能够电子控制波束图案而无需物理移动阵列。这可以通过向每个阵列元素添加延迟级来简单地实现。下图说明了此配置,它为Delay-Sum架构提供了名称。
这个想法非常简单,为每个麦克风添加延迟,使得来自特定方向的信号在它们相加之前对齐。通过控制这些阵列,可以控制主瓣方向。
在“ 分数延迟”页面上描述了一种实现延迟阶段的方法。
页面修订
修订号 | 日期 | 细节 |
---|---|---|
1.1 | 2011/9/3 | 在梁图案部分修正了等式。 |
1.2 | 2012年10月10日 | 修正频率响应图上的轴标签。 |