音频开发_Microphone Array Beamforming_Wave Summation

本章原文出自http://www.labbookpages.co.uk/audio/beamforming/waveSum.html

波求和

此页面是添加正弦信号所涉及的数学的基本概述。这构成了分析波束形成器空间响应的核心部分。


波传播与求和

下图描绘了典型的,尽管简化的麦克风阵列波束成形设置。从扬声器传播的波前将在不同时间到达麦克风,这个属性是阵列空间滤波能力的本质。在模拟阵列的空间滤波性能时,有必要计算麦克风信号在不同信号源位置或角度的总和。

波求和设置

基于扬声器和麦克风位置,可以首先计算波前行进的距离,然后对于给定的声速,波前离开扬声器并到达每个麦克风所花费的时间。有关在2D和3D中计算这些延迟时间的更全面描述,请查看“ 延迟计算”页面。

下图显示了100Hz的“源波”,表示离开扬声器的信号。该图还显示了“麦克风1处的信号”“麦克风2处的信号”。可以清楚地看到由源信号传播到麦克风引起的延迟。最后显示阵列的'输出'(两个麦克风信号的总和)。由于传播时间的不同,输出的幅度为1.825,而不是幅度为源波的两倍(有两个麦克风)。

注意:尚未考虑信号从扬声器传播到麦克风时的衰减。

波总和


使用相量计算幅度

计算组合麦克风信号(阵列输出)幅度的简单方法是使用相量。下图显示了如何计算两个信号之间的相位差。波的一个周期对应于360°,给定10ms的周期,2.305ms的延迟对应于82.975°的相移。

相位计算

两个麦克风信号的相位计算如下所示。

麦克风相位计算

相量图提供了表示正弦波的幅度和相位的方法。它们还提供了添加波形的图形方法。三个相量图表示两个麦克风信号和阵列的输出。相量长度对应于波的幅度,角度对应于相位。这些被绘制为复合轴上的矢量。通过添加矢量非常容易地实现相量求和,所得到的矢量表示求和波。

相量波的总和

对矢量求和的最简单方法是将它们从极坐标(幅度和相位)转换为它们的笛卡尔坐标(实数和虚数)。然后,可以从两个麦克风矢量的总和容易地计算输出矢量。

极地笛卡尔转换

计算求和波幅度的最后一步是使用毕达哥拉斯定理计算求和矢量的长度,如下所示。

相量和振幅

简化表格

通过组合上述阶段,可以导出以下公式,用于基于频率,行进距离和声速来计算波的复数表示。要对波的集合求和,只需计算每个波的实部和虚部,然后使用毕达哥拉斯定理计算最终振幅。

简化的矢量计算

以下c代码执行上述两个麦克风设置的波求和计算。

文件: waves.c

#include <stdio.h> 
#include <math.h>

int main(void)
{
   双相位,距离,延迟;

   double freq = 100.0 ;            // Hz    
   double speedSound = 343.0 ;      // 女士

   //麦克风1 
   距离= sqrt(0.25 * 0.25 + 0.75 * 0.75);
   delay = distance / speedSound;
   double re1 = cos(2.0 * M_PI * freq * delay);
   double im1 = sin(2.0 * M_PI * freq * delay);
   phase = 180 * atan2(im1,re1)/ M_PI ;
   printf(“Mic1  - 距离:%。4f ,延迟:%。4f ,相位:%。3f ,[ %。3f %.3f ] \ n ”,距离,延迟* 1000,相位,re1,im1); 

   //麦克风2 
   距离= sqrt(1.00 * 1.00 + 0.75 * 0.75);
   delay = distance / speedSound;
   double re2 = cos(2.0 * M_PI * freq * delay);
   double im2 = sin(2.0 * M_PI * freq * delay);
   phase = 180 * atan2(im2,re2)/ M_PI ;
   printf(“Mic2  - 距离:%。4f ,延迟:%。4f ,相位:%。3f ,[ %。3f %.3f ] \ n ”,距离,延迟* 1000,相位,re2,im2); 

   //输出
   double re = re1 + re2;
   double im = im1 + im2;
   double amp = sqrt(re * re + im * im);
   phase = 180 * atan2(im,re)/ M_PI ;
   printf(“输出 - 幅度:%。3f ,相位:%。3f ,[ %。3f %.3f ] \ n ”,amp,phase,re,im); 

   返回 0 ;
}

可以使用以下命令编译和执行代码。

> gcc -Wall -lm -o waves waves.c
 > ./waves

输出显示麦克风的极性和笛卡尔形式以及输出信号。

Mic1  - 距离:0.7906,延迟:2.3049,相位:82.975,[0.122 0.992]
Mic2  - 距离:1.2500,延迟:3.6443,相位:131.195,[ -  0.659 0.752]
输出 - 幅度:1.826,相位:107.085,[ -  0.536 1.745]

欧拉公式表示法

波的复杂表示可以使用欧拉公式以更紧凑的形式呈现。下面的等式显示了欧拉公式以及它如何适用于表示频率f的波。

欧拉公式

对于具有d的延迟的波,等式采用如下所示的形式。可以看出这与上面的相量分析部分中使用的方程式相匹配。

欧拉公式


线性阵列示例

指数形式在波束形成文献中很流行。下面是一个线性阵列的简单示例。每个数组元素之间的距离为1米。对于以声速c从角度θ到达的频率f的平面波,使用以下等式计算阵列输出。

线性阵列

欧拉的代表

使用下面的相量和指数方法计算线性阵列的输出幅度。

文件: array1.c

#include <stdio.h> 
#include <math.h>

int main(void)
{
   int numElements = 4 ;            //数组元素的数量
   double spacing = 0.75 ;          //元件隔离在仪表
   双角= 30.0 ;            从宽边//度
   双 FREQ = 100.0 ;            //信号频率,单位为Hz 
   double speedSound = 343.0 ;      // 女士

   int i;
   double realSum = 0 ;
   double imagSum = 0 ;

   //迭代通过数组元素
   为(I = 0 ; I <包含numElements;我++)
   {
      //计算元素位置和波前延迟
      双位置= i *间距;
      double delay = position * sin(M_PI * angle / 180)/ speedSound;

      printf(“ %3d” )位置:%f ,延迟:%e \ n “,i,位置,延迟);

      //添加Wave 
      realSum + = cos(2.0 * M_PI * freq * delay);
      imagSum + = sin(2.0 * M_PI * freq * delay);
   }

   double output = sqrt(realSum * realSum + imagSum * imagSum);
   printf(“输出幅度:%。3f [ %f ,%f ] \ n ”,输出,realSum,imagSum);

   返回 0 ;
}

文件: array2.c

#include <stdio.h> 
#include <math.h> 
#include <gsl / gsl_complex.h> 
#include <gsl / gsl_complex_math.h>

int main(void)
{
   int numElements = 4 ;            //数组元素的数量
   double spacing = 0.75 ;          //元件隔离在仪表
   双角= 30.0 ;            从宽边//度
   双 FREQ = 100.0 ;            //信号频率,单位为Hz 
   double speedSound = 343.0 ;      // 女士

   int i;
   gsl_complex total;
   GSL_SET_COMPLEX(总,0,0);
   gsl_complex comp;

   //迭代通过数组元素
   为(I = 0 ; I <包含numElements;我++)
   {
      //计算元素位置和波前延迟
      双位置= i *间距;
      double delay = position * sin(M_PI * angle / 180)/ speedSound;

      printf(“ %3d” )位置:%f ,延迟:%e \ n “,i,位置,延迟);

      //计算指数形式 
      comp.dat [ 0 ] = 0 ;                              // Real 
      comp.dat [ 1 ] = 2.0 * M_PI * freq * delay;      //想象 
      gsl_complex w = gsl_complex_exp(comp);        //指数

      //添加Wave 
      total = gsl_complex_add(total,w);           //累积
   }

   double output = gsl_complex_abs(total);
   printf(“输出幅度:%。3f [ %f ,%f ] \ n ”,输出,total.dat [ 0 ],total.dat [ 1 ]);

   返回 0 ;
}

可以使用以下命令编译和执行代码。

> gcc -Wall -lm -o array1 array1.c
 > ./array1
 > gcc -Wall -lm -lgsl -o array2 array2.c
 > ./array2

两个程序的输出是相同的,因为它们都在计算相同的东西,尽管方式略有不同。输出显示每个数组元素的物理位置(以米为单位)和波前延迟(相对于第一个麦克风)。求和信号的幅度也以其复杂的表示形式显示。

0)位置:0.000000,延迟:0.000000e + 00
1)位置:0.750000,延迟:1.093294e-03
2)位置:1.500000,延迟:2.186589e-03
3)位置:2.250000,延迟:3.279883e-03
输出幅度:2.912 [1.498204,2.4917171]

页面修订

修订号日期细节
1.12011/9/3修正了线性阵列示例部分中的等式。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值