天天看點

音頻開發_Microphone Array Beamforming_Wave Summation波求和

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

波求和

此頁面是添加正弦信号所涉及的數學的基本概述。這構成了分析波束形成器空間響應的核心部分。

  • 波傳播與求和
  • 使用相量計算幅度
  • 歐拉公式表示法
  • 線性陣列示例

波傳播與求和

下圖描繪了典型的,盡管簡化的麥克風陣列波束成形設定。從揚聲器傳播的波前将在不同時間到達麥克風,這個屬性是陣列空間濾波能力的本質。在模拟陣列的空間濾波性能時,有必要計算麥克風信号在不同信号源位置或角度的總和。

音頻開發_Microphone Array Beamforming_Wave Summation波求和

基于揚聲器和麥克風位置,可以首先計算波前行進的距離,然後對于給定的聲速,波前離開揚聲器并到達每個麥克風所花費的時間。有關在2D和3D中計算這些延遲時間的更全面描述,請檢視“ 延遲計算”頁面。

下圖顯示了100Hz的“源波”,表示離開揚聲器的信号。該圖還顯示了“麥克風1處的信号”和“麥克風2處的信号”。可以清楚地看到由源信号傳播到麥克風引起的延遲。最後顯示陣列的'輸出'(兩個麥克風信号的總和)。由于傳播時間的不同,輸出的幅度為1.825,而不是幅度為源波的兩倍(有兩個麥克風)。

注意:尚未考慮信号從揚聲器傳播到麥克風時的衰減。

音頻開發_Microphone Array Beamforming_Wave Summation波求和

使用相量計算幅度

計算組合麥克風信号(陣列輸出)幅度的簡單方法是使用相量。下圖顯示了如何計算兩個信号之間的相位差。波的一個周期對應于360°,給定10ms的周期,2.305ms的延遲對應于82.975°的相移。

音頻開發_Microphone Array Beamforming_Wave Summation波求和

兩個麥克風信号的相位計算如下所示。

音頻開發_Microphone Array Beamforming_Wave Summation波求和

相量圖提供了表示正弦波的幅度和相位的方法。它們還提供了添加波形的圖形方法。三個相量圖表示兩個麥克風信号和陣列的輸出。相量長度對應于波的幅度,角度對應于相位。這些被繪制為複合軸上的矢量。通過添加矢量非常容易地實作相量求和,所得到的矢量表示求和波。

音頻開發_Microphone Array Beamforming_Wave Summation波求和

對矢量求和的最簡單方法是将它們從極坐标(幅度和相位)轉換為它們的笛卡爾坐标(實數和虛數)。然後,可以從兩個麥克風矢量的總和容易地計算輸出矢量。

音頻開發_Microphone Array Beamforming_Wave Summation波求和

計算求和波幅度的最後一步是使用畢達哥拉斯定理計算求和矢量的長度,如下所示。

音頻開發_Microphone Array Beamforming_Wave Summation波求和

簡化表格

通過組合上述階段,可以導出以下公式,用于基于頻率,行進距離和聲速來計算波的複數表示。要對波的集合求和,隻需計算每個波的實部和虛部,然後使用畢達哥拉斯定理計算最終振幅。

音頻開發_Microphone Array Beamforming_Wave Summation波求和

以下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的波。

音頻開發_Microphone Array Beamforming_Wave Summation波求和

對于具有d的延遲的波,等式采用如下所示的形式。可以看出這與上面的相量分析部分中使用的方程式相比對。

音頻開發_Microphone Array Beamforming_Wave Summation波求和

線性陣列示例

指數形式在波束形成文獻中很流行。下面是一個線性陣列的簡單示例。每個數組元素之間的距離為1米。對于以聲速c從角度θ到達的頻率f的平面波,使用以下等式計算陣列輸出。

音頻開發_Microphone Array Beamforming_Wave Summation波求和
音頻開發_Microphone Array Beamforming_Wave Summation波求和

使用下面的相量和指數方法計算線性陣列的輸出幅度。

檔案: 

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.1 2011/9/3 修正了線性陣列示例部分中的等式。

繼續閱讀