Delay Sum波束形成

  • 引言

下图显示了两种不同麦克风设置的灵敏度模式。 左图显示了理想的全向麦克风的模式。 它表明麦克风对来自各个方向的信号具有相同的灵敏度。 右图显示了聚焦的灵敏度模式,旨在在单个方向上获得最大灵敏度,而所有其他方向的灵敏度都降低了,目的是创建一种灵敏度模式,从而能够“监听”来自单个方向的信号 。

可以通过使用简单的线性麦克风阵列来实现波束形成。 这种阵列如下所示,在这种情况下,该阵列具有三个麦克风。 显而易见,波阵面的方向会影响信号到达阵列中每个阵元的时间。 当从-45°到达时,信号首先到达左手麦克风;当从垂直于阵列的方向(称为宽边)到达时,信号同时到达每个麦克风;当从+ 45°到达时,右手麦克风首先接收信号。

如果通过对所有麦克风信号求和来创建阵列的输出,则当信号来自垂直于阵列的信号源时,将获得最大输出幅度; 信号是同时到达的,它们在时间上高度相关并且彼此增强。 或者,如果信号来自非垂直方向,则它们将在不同的时间到达,因此相关性会降低,并导致输出幅度较小。

  • 波束模式

可以使用简单的计算来确定麦克风阵列对于来自特定方向的信号的灵敏度。 下图显示了带有四个麦克风的阵列。 每个阵列之间的距离为l(以米为单位)。 从垂直于阵列的角度测量到达角。 下面的等式计算单个频率f的阵列增益和到达角\thetac表示声音的速度,N表示麦克风的数量。

注意:该方程式有一些假设; 信号源离阵列足够远,因此波前实际上是平坦的,而且信号从信源传播到麦克风时,信号衰减也没有考虑到。

下图显示了阵列的增益。 将输出标准化为从单个麦克风接收的输出。 因此,在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体系结构命名。

这个想法非常简单,在每个麦克风上增加一个延迟,以使来自特定方向的信号在求和之前先对齐。 通过控制这些阵列,可以控制主瓣方向。

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值