首先,声源定位一定是一个阵列信号处理的系统,因为只有一个麦克风接收声音我们是不可能得到声音的方向信息的。利用麦克风阵列可以实现声源到达方向估计(direction-of-arrival estimation),也称为DOA估计。DOA估计的其中一种方法是计算到达不同阵元间的时间差来进行处理的,这一篇博客主要讲的也就是这一种方法中的一个经典算法:MVDR。
而波束形成又是什么呢?在进行声源定位的时候其实也进行了波束形成的过程。波束形成就是令该系统对某些方向的声波具有所需相应的过程。通俗的讲就是说,DOA只是找到了声源来的方向,而波束形成就是进一步把这一个方向的声音从麦克风接收到的声音中滤出来,所以,波束形成也可称为一种空间滤波器。
麦克风阵列的形式多种多样,我们可以设计成不同样式,在算法层面只需要改变参数即可。常见的阵列有线阵、圆阵、矩形阵、空间阵等等,阵的形状也顾名思义。需要注意的是,对于线阵,我们得不到除阵所在平面之外的信息,所以我们只能估计一个一维的角度,如图:
除了这个平面以外的信息我们无从得知。
而对于平面阵或空间阵来说,我们能够得到更高维的信息。下文将从线阵和圆阵两种阵型来展开分析,其他阵型方法类似。
根据声源和麦克风阵列距离的远近,可将声场模型分为两种:近场模型和远场模型。近场模型将声波看成球面波,它考虑麦克风阵元接收信号间的幅度差;远场模型则将声波看成平面波,它忽略各阵元接收信号间的幅度差,近似认为各接收信号之间是简单的时延关系。显然远场模型是对实际模型的简化,极大地简化了处理难度。一般语音增强方法就是基于远场模型。
近场模型和远场模型的划分没有绝对的标准,一般认为声源离麦克风阵列中心参考点的距离远大于信号波长时为远场;反之,则为近场。设均匀线性阵列相邻阵元之间的距离(又称阵列孔径)为D=n*d,n为阵列间距个数,一般是M-1;声源最高频率语音的波长(即声源的最小波长)为λmin,如果声源到阵列中心的距离大于 2 d 2 λ m i n \frac{2d^2}{\lambda_{min}} λmin2d2,则为远场模型,否则为近场模型,如下图所示。
顾名思义,窄带就是单一频率或者频宽很窄的信号,而宽带就频带很宽的信号,相对来说,我们实际信号都是宽带的。
MVDR是一个自适应波束形成算法,按照波束形成的思想,我们想要去获得声源方向(即声强最强方向)的声音,而抑制其他方向的声音。
下来就是算法具体实现部分了。我分讨论均匀线阵然后迁移至圆阵。
首先说明一下,我们假设入射信号为窄带信号。
如图,均匀线阵间距为d,入射角为 θ i \theta_i θi,那么该阵列接收到的信号一般表示为:
X ( t ) = A S ( t ) + N ( t ) X(t)=AS(t)+N(t) X(t)=AS(t)+N(t)
我们先给出了公式,然后再来解释:
X即为接收到的信号,他是时间的函数,读者应该也能够猜出,N是加性噪声。在这里,S是第一个麦克风接收到的原始信号,而A被称为阵列流型向量,有时也被称为导向向量,顾名思义,他与入射方向有关。设阵列中一共有M个麦克风,则:
A = [ 1 , e − j ω τ 2 , e − j ω τ 3 , . . . , e − j ω τ M ] A=[1,e^{-j\omega\tau_2},e^{-j\omega\tau_3},...,e^{-j\omega\tau_M}] A=[1,e−jωτ2,e−jωτ3,...,e−jωτM]
这个公式有信号处理基础的小伙伴应该不难理解,其中 τ \tau τ为信号入射的时间差, ω \omega ω为信号的角频率。
根据几何关系,易知,均匀线阵中 τ n = n d s i n θ c \tau_n=\frac{ndsin\theta}{c} τn=cndsinθ,c为波速,这里取声速340。
对于多声源的情况,S与A变变成了矩阵,假设有N个声源:
更一般地,如果是宽带的情况,那就对应不同频率, ω \omega ω有不同的取值。
以上便是麦克风的输出模型,我们将其变换到频域:
y ( ω ) = a s ( ω ) + v ( ω ) y(\omega)=as(\omega)+v(\omega) y(ω)=as(ω)+v(ω)
设计一个滤波器 w ( ω ) w(\omega) w(ω),令:
z ( ω ) = w H ( ω ) y ( ω ) z(\omega)=w^H(\omega)y(\omega) z(ω)=wH(ω)y(ω)
令 a s = x as=x as=x,则 z = w H x + w H v z=w^Hx+w^Hv z=wHx+wHv,由于讨论窄带,我们省去 ω \omega ω
从频域来看,我们希望所需要的方向( θ \theta θ)的信号无失真地完整输出,那么要限制: w H a ( θ ) = 1 w^Ha(\theta)=1 wHa(θ)=1
又令自相关函数:
Φ x x = E [ x x H ] \Phi_{xx}=E[xx^H] Φxx=E[xxH]
根据自相关函数的性质可得:
Φ y y = Φ x x + Φ v v \Phi_{yy}=\Phi_{xx}+\Phi_{vv} Φyy=Φxx+Φvv
Φ z z = w H Φ x x w + w H Φ v v w = w H Φ y y w \Phi_{zz}=w^H\Phi_{xx}w+w^H\Phi_{vv}w=w^H\Phi_{yy}w Φzz=wHΦxxw+wHΦvvw=wHΦyyw
作为一个滤波器,我们想做的便是最小化噪声的影响,即:
m i n ( w H Φ y y w ) min(w^H\Phi_{yy}w) min(wHΦyyw)
故优化问题可以表达为:
m i n ( w H Φ y y w ) , s . t . w H a ( θ ) = 1 min(w^H\Phi_{yy}w),s.t.w^Ha(\theta)=1 min(wHΦyyw),s.t.wHa(θ)=1
通过拉格朗日乘子法解该优化问题可得:
w = Φ y y − 1 a ( θ ) a H ( θ ) Φ y y − 1 a ( θ ) (1) w=\frac{\Phi_{yy}^{-1}a(\theta)}{a^H(\theta)\Phi_{yy}^{-1}a(\theta)}\tag1 w=aH(θ)Φyy−1a(θ)Φyy−1a(θ)(1)
而其功率谱可表示为:
P ( θ ) = w H Φ y y w = 1 a H ( θ ) Φ y y − 1 a ( θ ) (2) P(\theta)=w^H\Phi_{yy}w=\frac{1}{a^H(\theta)\Phi_{yy}^{-1}a(\theta)}\tag2 P(θ)=wHΦyyw=aH(θ)Φyy−1a(θ)1(2)
实际中,由于自相关函数不好计算,常用协方差矩阵代替:
Φ y y ≈ R = 1 N y H y \Phi_{yy}\approx R=\frac{1}{N}y^Hy Φyy≈R=N1yHy
到此,功率谱与波束形成的系数已经推导完毕。
根据这个功率谱(公式2),我们可以通过扫描遍历空间所有的 θ \theta θ来找到功率最强的方向,即为声源方向,同时可以根据公式(1)提取出声源方向的信号。
其实道理都相同,推导过程这里略去,对于二维圆阵,我们要估计的就是 θ \theta θ和 ϕ \phi ϕ两个,那么公式就拓展变成了:
P ( θ , ϕ ) = 1 a H ( θ , ϕ ) R − 1 a ( θ , ϕ ) (3) P(\theta,\phi)=\frac{1}{a^H(\theta,\phi)R^{-1}a(\theta,\phi)}\tag3 P(θ,ϕ)=aH(θ,ϕ)R−1a(θ,ϕ)1(3)
同理,这里的a也就是在 θ , ϕ \theta,\phi θ,ϕ这个方向上的阵列流型向量,公式相同:
A = [ 1 , e − j ω τ 2 , e − j ω τ 3 , . . . , e − j ω τ M ] A=[1,e^{-j\omega\tau_2},e^{-j\omega\tau_3},...,e^{-j\omega\tau_M}] A=[1,e−jωτ2,e−jωτ3,...,e−jωτM]
只是这里时延的计算不一样了。
事实上,我们可以固定一点O,计算所有麦克风距离O点的距离,把这个距离上的时延作为该麦克风的时延(反正都是相对的值,O点选哪都没关系)。自然地,我们选O为坐标原点,那么在直角坐标系下:
τ = k ⃗ H r ⃗ \tau=\vec k^H\vec r τ=kHr
其中 k ⃗ \vec k k为声音到达的方向的单位向量, r ⃗ \vec r r为该阵的位置向量。
后面的计算想必大家就都会了~
本篇博客讲述了一些声源定位的基本概念以及经典MVDR波束形成算法。其他一些基础的波束形成算法与MVDR也有相近的地方,在下一篇博客中,我将讲述另一种波束形成算法——MUSIC算法以及这两种算法的Python代码实现方式。