声源定位算法5----SRP-PHAT(1)

在前面的专栏里面我介绍了包括CBF,MUSIC,MVDR,CLEAN-SC等算法原理以及实现。这篇文章我将介绍SRP-PHAT。

1. 算法概述

SRP-PHAT 是阵列声源定位中一种经典的宽带定位方法,其全称为 Steered Response Power with Phase Transform ,即带相位变换加权的引导响应功率算法

该算法的核心思想是:对于空间中的每一个候选点,先根据阵列几何计算该点对应的各麦克风对理论时延差,再利用这些理论时延差去评估各通道对的相位一致性,并将所有通道对的结果累加,最终把累加值最大的点作为声源位置。

与传统延时求和波束形成不同,SRP-PHAT 并不直接对各通道信号做相干叠加,而是通过 GCC-PHAT 来衡量通道对之间的时延匹配程度,因此在噪声和混响环境下通常具有更好的鲁棒性。

2. 基本思想

设空间中某个候选点为 r,第 m 个麦克风的位置为 rm​,则该候选点到第 m 个麦克风的传播时延为

对于麦克风 m 和 n,该候选点对应的理论时延差为

如果候选点接近真实声源位置,那么这个理论时延差就会接近真实到达时间差,此时该麦克风对在对应时延处的相关响应会较大。若对所有麦克风对都出现这种情况,则说明该候选点与真实声源位置较为一致,因此其空间响应值也会更大。

因此,SRP-PHAT 的本质就是:

在空间中寻找一个点,使得该点对应的理论时延关系能够最大程度匹配所有麦克风对的实际时延关系。

3. GCC-PHAT

设第 m 个和第 n 个通道的频域信号分别为,则它们的互功率谱为

PHAT 加权定义为

对应的 GCC-PHAT 函数为

PHAT 加权的作用是去除互谱的幅值信息,仅保留相位信息,从而减弱频谱起伏、通道增益差异和部分混响效应对时延估计的影响。

4. SRP-PHAT 的标准表达

对于空间中的候选点 r,SRP-PHAT 的空间响应定义为

最终的声源位置估计为

这两个公式就是 SRP-PHAT 最核心的数学表达。

第一个式子表示:对每一个候选点,取出所有麦克风对在该点理论时延差处的 GCC-PHAT 值,并累加成空间响应。

第二个式子表示:在整个扫描空间中寻找响应最大的点,将其作为声源位置估计。

5. SRP-PHAT 的两种等价实现方式

SRP-PHAT 在实现上通常有两种等价形式。

5.1 方式一:频域直接累加

将 GCC-PHAT 的定义代入空间响应表达式,可得

离散形式下可写为

这种方式的特点是:对每个候选点,直接在频域根据理论时延差进行相位补偿并累加。

5.2 方式二:先算 GCC-PHAT,再取理论时延点的值

另一种实现方式是,先对每个麦克风对计算 GCC-PHAT 曲线

然后对每个候选点 r,直接在 处取值并累加:

5.3 两种方式的关系

这两种实现方式本质等价。因为 GCC-PHAT 本身就是 PHAT 加权互谱的逆傅里叶变换,所以"先在频域做相位补偿再累加"和"先求 GCC-PHAT 再在理论时延处取值"只是运算顺序不同,本质上表达的是同一个空间响应量。

6. 算法物理意义

SRP-PHAT 的物理意义可以概括为一句话:

如果某个候选点是真实声源位置,那么由该点计算得到的理论时延差将与各麦克风对的真实时延差一致,因此这些麦克风对在对应时延处的 GCC-PHAT 响应会同时较大,最终使该点的空间响应取得峰值。

因此,SRP-PHAT 并不是在直接比较哪个点"能量最大",而是在比较哪个点最符合全阵列的时延一致性关系

7. SRP-PHAT 的特点

SRP-PHAT 的主要优点在于:

  1. 适用于宽带声源定位;

  2. 对噪声和混响具有较好的鲁棒性;

  3. 不依赖特征值分解,工程实现相对直接;

  4. 能够综合利用全部麦克风对的信息。

它的局限性主要在于:

  1. 需要进行空间扫描,计算量较大;

  2. 网格过密时开销明显增加;

  3. 多声源和强混响情况下可能出现伪峰;

  4. 理论时延往往不是整数采样点,通常需要插值处理。

8. 总结

SRP-PHAT 是一种基于空间扫描和时延一致性匹配的宽带声源定位方法。它通过对各麦克风对的互谱进行 PHAT 加权,构造 GCC-PHAT 函数,再根据候选点的理论时延差对各通道对响应进行取值和累加,最终以空间响应最大的点作为声源位置估计。

从实现角度看,SRP-PHAT 有两种等价写法:一种是在频域中直接进行相位补偿并累加;另一种是先计算 GCC-PHAT,再在理论时延处取值并累加。

从本质上讲,SRP-PHAT 关注的不是单纯的能量叠加,而是:

哪个空间位置最能同时满足所有麦克风对的相位时延关系。

下篇文章讲解SRP-PHAT算法的仿真实现。

相关推荐
To_OC5 小时前
LC 994 腐烂的橘子:人人都说是 BFS 入门题,我却写了三遍才过
javascript·算法·leetcode
金銀銅鐵8 小时前
[Python] 扩展欧几里得算法
python·数学·算法
To_OC11 小时前
LC 200 岛屿数量:经典 DFS 入门题,我第一次写居然连方向都搞错了
javascript·算法·leetcode
To_OC1 天前
LC 128 最长连续序列:别上来就排序,O (n) 解法才是这题的灵魂
javascript·算法·leetcode
05Kevin2 天前
lk每日冒险题--数据结构6.27
算法
To_OC2 天前
从一次栈溢出报错说起,我把递归彻底扒明白了
javascript·算法·程序员
千纸鹤安安2 天前
千问Qwen-AgentWorld来了:一个语言模型搞定七大Agent场景,GPT-5.4都输了
算法
七牛开发者2 天前
MCP 到底是什么?为什么 Agent 都想接上它
算法·aigc·agent