延迟求和波束成形:在 C 中实现转向

信息处理 声音的 声音 波束成形 本土化
2022-01-28 03:51:07

我目前正在尝试了解延迟和求和波束成形的工作原理。我发现这个网站很好地解释了这种技术的过程,其中提供了以下 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;
}

波束成形通过转向我们想要收听的方向来工作。由于上面的代码计算了 -90 到 90 度的延迟,我认为它正在转向来自 -90 到 90 度的声波。

但是当一直到同一个网站时,它说“到目前为止,阵列灵敏度模式的主瓣已经固定在一个方向;垂直于阵列。”

从那句话中,我推断出上面的 C 代码根本没有转向?如果没有,我该如何实施?

2个回答

该代码正在计算一个线性阵列的光束模式,它是单一频率的响应。您可能会注意到没有实际的传感器数据被求和或延迟。

该模式定义在从 -90 到 90 的所有角度上,并将有一个主瓣。

基本上有两种控制波束的方法,通过在单个频率上乘以相位或通过在时域中实际延迟信号,通常使用 N 点插值,其中 N 很小。

对于 4 个元素,50000 条观察方向实在是太多了。

您需要为麦克风添加延迟: double delay = position * sin(angleRad) / speedSound + micdelay[i];