Steer Vector

最近陆续有了一些看了本博客的读者加微信讨论一些问题,我才发现原来自己挂的这个玩意竟然是有人看的。为什么这么说呢,因为从本站点挂到云上起,我就没有在任何社交平台上公开过本博客的链接,即使是github上host的repo我也是设置成私有的状态,所以访客们能够来到这个站点,看来是google在背后起作用了。从内容上说,本站点上的东西并不全面,很多时候是自己看了或者接触了点新的东西,心血来潮想写点什么。所以这里面就存在一个问题,我最初的接触或者理解可能是肤浅的,所以写下的东西未必准确到位,存在误导读者的风险。这也是我不想把这里的内容发布到公共平台上的原因之一。如果看官有什么问题的话,可以加我微信讨论,这一点上我还是非常欢迎的(当然伸手党等人除外)。

四月份之后我到微软这边实习,手上的工作都比较熟悉,没有接触到什么新的或者有意思的东西,所以也一直没有更新文章,这次就说一个之前频繁提到过的概念,导向向量(steer vector)。在这篇文章中,我会把它和前面几篇博客的内容关联到一起,更加系统的理一遍。

导向向量是在多通道语音信号处理中经常出现的一个概念,从我的接触上说,主要集中在波束形成,声源定位里面。它描述的是声源到每个麦克风处的延时(如果不考虑信号衰减的话),通常将其表示为

其中$M$表示阵列个数,$\theta$为声源方位(DoA,暂时不考虑俯仰角),$\omega$为角频率。在平面波的建模下,通常我们会选一个参考麦克风,只需要计算相对时延即可。$\theta$的范围取决于阵列的结构,一般线阵就是0到$\pi$,圆阵拓展到$2\pi$。

Beamformer

MVDR有几种表达式,其中一种里面有一个对steer_vector的显式依赖,所以传统signal的方法里面,都需要借助一个SSL(Sound/Speech Source Localization)模块用于声源定位得到$\theta$。目前常用的mask-based的方法,使用PCA的方法就可以直接做估计,免去了对SSL的依赖,这部分内容之前的博客已经说过,这里就不做赘述。固定波束的话,从使用的角度来说,需要已知说话人的方位,然后选取这个方向上的beam。从设计的角度说,一般预先在空间划分若干个区域,之后基于这些区域指向的方位上的导向向量进行设计,我所知道的两种设计方法都是如此:

  1. LSB (Least-square beamformer)
    LSB思想是借助最优化方法(加上白噪声增益的约束),求解出满足beampattern(也就是MSE)的最优变量作为beam weight。

  2. SDB (Super-directive beamformer)
    设计公式和MVDR类似,使用oracle的steer vector,noise的协方差矩阵使用一些常见噪声声场的理论值(比如diffused noise field)

其实还有一个最简单的beamformer,延时相加(DS, Delay and Sum),steer vector直接就构成beam的权值(这里再加一个理论常识,拥有$M$个麦克风的阵列最理想情况下,使用DS beamformer可以拿到$M$dB的信噪比提升)。

Beam Pattern其实就是beamformer在每个方向上频率响应的一种表示,事先计算出若干组steer vector,做beamforming之后画出频率响应($T \times F$的矩阵)就行。前段时间遇到一个问题比较有意思,感觉可以用来当做面试题考察一下信号基础。我拿到一个设计好的fixed beamformer,但是不知道每个beam的指向了,问如何还原出这个信息?其实定义好坐标系,画出beam pattern就一目了然了。比如下图给出了编号为7,8,12,13四个beam的beam pattern,它们的指向依次为120,140,220和240度方向。

Localization

我所接触到的定位算法和steer vector相关的(还有一些子空间方法比如MUSIC之类的没有细看)基本都是一个样式,就是formulate成下面的问题:

简单来说就是用观测信号$\mathbf{y}$和每个方向上的导向向量计算一个$\mathcal{F}(\cdot)$,最大者对应角度就是定位的结果。由于每个麦克风的空间位置不同,因此定向声到达每个麦克风处会形成相应的延迟,空间信息由此产生。延迟是直接和相位相关的(时移在频域中体现为相移),所以我们说spatial的时候,基本都在说相位。这里面还存在一些小问题,其一,相位它是周期的,也就是我们可以从相对距离或者时延推出相位差,但是从相位差不能导出唯一的时延迟或者距离,比方说如果麦克风的间距大于一半波长的时候(所谓的空间混叠)。其二就是相位的绝对值没有什么意义,这也就是单通道中一般很少研究相位这个概念,即使有,比如Group Delay这种还是相对值(一阶差分)。多通道中可以利用的主要是通道信号之间的相位差(IPD,Inter-channal Phase Difference)这个信息。

之前一篇博客也提到过,在短时傅里叶分析中的每个的sub-band上,同向声源能量占比高的TF-bin上观测到的相位差彼此接近,所以这是一个可以帮助做分离/增强的区分性信息。从steer vector中我们可以算出该方向上的声源可被观测到的理想情况下的(oracle)的相移,所以如果观测值和理论值越接近,那么该声源属于此方向上的概率就越高。由此可以将上述定位表达式进一步表示为:

$\angle \mathbf{y}_i - \angle \mathbf{y}_j$就是IPD。注意一下,此表达式其实和下面的等价,其中$\mathcal{R}(\cdot)$表示取实部。 GCC/SRP-PHAT一般这么写,但是不太直观,不方便理解,比如为什么取实部之类的意义不明确。

其中

知道了基本的定位原理就可以反向利用角度信息。angle/directional feature就是在$\theta$已知的情况下,选取若干麦克风pair按照上面的方法计算出$T \times F$的特征矩阵(免去累加的过程)。和oracle相移越接近的TF bin上,特征的值越大。实际数据上在房间混响不严重,说话人的夹角比较大的情况下,angle feature是一个比较鲁棒的特征,对于分离或者增强模型的帮助也很大。

再看一下$\theta_\text{SSL}$的表达式,在假设说话人方位不变的情况下,就对整个句子上的每个TF-bin做一个加和,通过$\arg\max$得到DoA的估计值。如果想观测DoA的时变信息,那么可以只在频率轴上做累加,保留时间轴,得到的$T \times D$的矩阵就是所谓的angular spectrogram,这个东西我也在之前的文章中展现过,给出一个比较理想的的样例如下。如果不止一个说话人,还可以通过speaker的TF-mask做weight,从而估计出每一个说话人的角度。

Conclusion

最后简单的小结一下。我这篇文章没有介绍新的概念,主要借着steer vector把之前说过的beamformer,spatial feature,SSL算法等从一个统一的角度又过了一遍。这些东西呢,一开始也没有理解的十分到位,后面随着做东西的时间长了,反复想了几次,才发现它们背后逻辑的统一性。前端signal的东西有意思的地方主要就是集中在它背后的逻辑性的,当然我接触的只是冰山一角。借着面试时候某大佬和我说过一句话做结束:有很多work后人在复现的时候,都不需要任何signal的背景和知识就可以玩起来,但是在最开始我们做的时候,是一定有着对这些东西比较深刻的见解和认知的。否则路子那么多,你怎么能保证你这么做一定能work呢?