终于进入正戏了,前述点缀太多以至于我一度怀疑我在干嘛。
废话不多说了,麦克风阵列,用一系列的麦克风组合达成“空间采样”的目的,阵列里的许多原理概念,其实同数字信号处理里的很多概念很类似,比如混叠、加窗等。这很好理解,毕竟都是采样,只不过一个是对空间,一个是对时间罢了。
用于声学的麦克风阵列,其实很多都借鉴于天线、雷达,用以实现信号检测、降噪、达波方向估计等,并且可以利用阵列中不同采样点接受到信号的相位信息控制波束的指向从而完成定向信息接受(波束成形技术,Beamforming)。
其实波束形成或者阵列的玩法,本质上是操作阵列输入信号的滤波器,对于一类固定滤波器系数的阵列来说,无论输入信号或者噪声信号是啥样的(统计特征),其滤波器系数雷打不动,此类波束形成叫Fixed Beamforming,固定波束形成好比传统数字信号处理里面的经典滤波器;可以联想到,现代数字信号里面有一类自适应滤波器,对应的,阵列里就有相应的Adaptive Beamforming,其滤波器的系数是跟随着噪声场的变化而变化的。
此外,阵列根据形状不同还分为线阵、环针、中心阵等,为了便于理解,我们先从一维的Fixed Beamforming开始着手研究uniform linear arrays,由此普适情况推导其他也不会是什么难事。
首先远场平面波假设,有一线阵由M个麦克风等间距组成,声速为c,则阵列在处理入射信号的旋转向量(Steering Vector,翻译的有点生硬啊)为:
其中theta为入射角, 为入射角等于0时两个麦克风之间的时延,f代表频率。
假设信号从theta 入射,见上图,则接受到的信号
其中 v为噪声,前半部分为我们想要的信号,进而接受信号的功率谱密度:
其中 为信号的方差,
为噪声的相关系数矩阵。
Fixed Beamforming过程中我们最终求解都是为了降低其他方向的噪声而不失真的提取到目标信号。
上述提到阵列信号处理无非就是对每个接受信号乘以滤波器的系数在求和,在频域表现则是直接频谱相乘再相加:
是最终输出信号,
是阵列的在频率等于f时候的滤波器系数,
是我们想要的信号,
则是残留噪声。
在Fixed beamforming中我们想要保留想要的信号不失真,则在 中,我们要求
即可满足。
固定波束形成中所提到的性能指标都是关于频率的函数,即提到以下指标时要注明所讨论的频率。
阵列的输出信噪比比上阵列的输入信噪比,推导过程不上了,公式为:
,其中 是噪声的空间相关系数矩阵。
当噪声是白噪声时,空间中不同的任意两点的相关系数为0,所以上述 是主对角为1,其余全为0 的单位阵。上述Array Gain可以写成:
可以证明WNG最大值为M,即阵列中麦克风的个数,
则是考虑阵列工作于扩散声场,因此可同理写为:
所以,关于任意beamforming的讨论,只要得到阵列的滤波器系数,其他(三指标)的自然都迎刃而解了。
开篇已经提及了,这里面的采样混叠其实和数字信号采样混叠道理是一样一样的,这里作一下推导演绎。
空间发生混叠,即阵列分不清信号来自哪个方向了,也就是存在两个不同的 theta, 满足 , 观察steering vector,可以得到:
此时steering vector中的任一项是满足在两个角度下相等的,所以,此时发生了混叠。由基本三角函数定理
关于麦克风阵列的基本概念写完了,很多公式令人眼花缭乱,其实麦克风阵列问题归根而言只不过在不同约束条件下求解不同的滤波器系数,比如使得Directivity Index最大的MaxDF阵列,比如使得WNG最大的Delay and Sum,搞明白了以上公式间的关系自然不会觉得这些公式难懂。
另外,这些公式敲起来确实非常麻烦,下面再叙写不同麦克风阵列时,也尽量避免不必要的公式,主要以通过Python编程仿真的一系列图片为主,这样大家看起来也不会脑阔疼,在编程实现不同算法时,也会加深对不同阵列算法的理解。下一篇就搞一搞阵列里最简单的Fixedbeam吧。。
参考:Benesty/Cochen/Jingdong chen的Fundametals of Signal Enhancement and Array Signal Processing