在混响环境中进行说话人定位和自动跟踪是一项具有挑战性但又在众多基于音频的应用中常常需要完成的任务,例如免提手机、语音识别以及电话会议等。前面介绍的使用TDOA进行声源定位方法,在强混响或多路径环境中,互相关函数会出现多个峰值,TDOA 法可能选择了错误的峰值,导致声源位置估计错误,如果计算量允许的情况下,可以考虑更为鲁棒的SRP-PHAT算法。
SRP-PHAT(Steered Response Power with Phase Transform)是一种经典的声源定位算法,广泛应用于多麦克风阵列系统中,用于估计声源的位置。它结合了波束形成思想和相位变换(PHAT)技术,具有鲁棒性强、适应性好等特点,尤其在混响环境和低信噪比下表现良好。SRP-PHAT 的核心思想是:在空间中遍历可能的声源位置,对每一个位置计算波束形成器的输出能量(即 Steered Response Power, SRP),并选择能量最大的点作为估计的声源位置。


信号模型
声源定位的目标是在估计空间中一个或者多个声源的位置,通常在室内场景。假设对于信号s(t)在t时刻单个静态全向的声源在球坐标系中的位置记作

分别表示方位角、仰角和距离。一般对于远场情况下,声源到达麦克风阵列的波视为平面波,因此有无穷多个声源可以产生相同入射角的平面波,因此一般不估计声源距离,而更多关注方位角和俯仰角。

对于拥有M个麦克风的阵列,其中第m个麦克风接收到的信号为

其中h表示房间脉冲响应(Room Impulse Response, RIR),ε表示加性噪声。SRP 采用简化的传播模型,其中混响使用噪声项ε建模,即

可以理解为,第m个麦克风接收到的声源信号,该信号被衰减了 a 倍,延迟了τ秒,并被测量噪声项ε破坏。这里需要注意,该模型假设衰减与频率无关。声源定位算法一般会在时域进行,公式(3)对应的频域表达为

虽然上述定义在概念上很有用,但在实践中,SRP 是使用每个麦克风的L 维样本的帧或向量来计算的。


其中


时间到达延迟

声波从声源到麦克风阵列第m个麦克风的飞行时间(Time of Flight, ToF)可以表示为

如果多个麦克风对应的τ可以准确估计,那么声源位置可以被定位到,这种方法确定声源的方法称为主动声源定位,该系统使用受控和/或已知的源信号,以便可以获取源信号的发射时间。而我们今天要介绍的SRP方法属于被动声源定位的方法,具有更广阔的应用场景。SPR通过麦克风阵列之间的相对延迟来进行被动声源定位,该延迟被称作时间到达延迟(Time Difference of Arrival,TDOA),表示为


当声源和麦克风共线且声源不在麦克风之间时,麦克风对的最大可能TDOA为:


最后,通过确定多个麦克风对产生的双曲线的交点,可以估计声源位置。


SRP-PHAT

两个麦克风之间的相关性可以估计为麦克风信号帧之间互相关的峰值的幅角,一般会使用称为GCC-PHAT的算法,更详细的介绍可以参考使用TDOA进行声源定位,这里直接给出计算公式


其中相位变换(Phase Transform,PHAT)主要通过白化频率成分,从而使相关峰更加尖锐,如下所示。


然而,在混响或噪声环境下,互相关函数可能会出现多个峰值,导致 TDOA 估计和后续基于三角测量的方法变得不可靠。SRP使用将每个互相关值与空间中的候选位点关联起来获得更鲁棒的结果,其计算公式为


可以看出SRP算法为每对麦克风之间GCC-PHAT在不同频率和时间延迟上的求和,在实践中,所使用的频率可能低于奈奎斯特频率,以防止出现空间混叠。SRP所有候选位置的 SRP 函数,并选择产生最大 SRP 值的位置作为估计位置,如下所示声源位置估计为(100°, 60°)。


优化方向

完整的SRP计算量是比较大的,因此SRP-PHAT的优化方向之一就是减少计算量,主要通过减少搜索位置或者并行化来实现;另一个优化方向就是提升算法性能,这部分工作主要通过优化广义互相关函数;此外还可以添加前处理如VAD,或者后处理维纳滤波来进一步提升算法性能。


最后我们模拟下SRP=PHAT的效果,首先创建一个8x8的房间,其中央放置一个4个麦克风的圆形阵列,声源在其正前方,T60设为1.2s,从频谱中发现因为混响导致的拖尾现象已经比较严重了。经过SRP-PHAT计算后,其最大值出现在90°的位置,与声源位置一致。


本文相关代码地址:https://github.com/Ryuk17/SpeechAlgorithms/tree/master/SoundSourceLocalization

参考文献:

[1].https://arxiv.org/pdf/2405.02991

[2].https://en.wikipedia.org/wiki/Steered-response_power

[3].https://pyroomacoustics.readthedocs.io/en/pypi-release/pyroomacoustics.doa.srp.html