GCC-PHAT算法

GCC-PHAT是一个计算AOA的算法。

这里的AOA是指信号入射到与阵列垂直的线的夹角。
画个图做个示意:

GCC-PHAT算法
这里AB为两个microphone, 虚线为入射信号,这里计算AOA的前提是信号是平面波,即两个虚线是平行的。
那么AOA即为θ\theta, 范围为[-90,90]. 与AB垂直时,角度为0.

这里AB的距离为L,τ\tau 为到达时间差,c为声音速度。

假设到达两个microphone的信号为:
GCC-PHAT算法

  1. 用cross-correlation计算τ\tau
    GCC-PHAT算法
  2. 计算AOAβ\beta
    GCC-PHAT算法
    这里有一个问题,就是当信噪比低时用cross-correlation直接计算得到的D不是太准。那么有一种方法,就是可以用PSD去做一个weight,效果会好很多。

我们知道信号相关与PSD是一个傅里叶变换对,那么先求PSD:

  1. 求PSD
    GCC-PHAT算法
  2. normalize PSD,再做傅里叶变换得到weight后的相关
    GCC-PHAT算法
    3.求D
    GCC-PHAT算法
    实践证明这种方式效果更好。需要注意的是,这里得到的只是AOA, 并不是对于平面上的旋转角和仰角。这个角的名字叫broadside angle of arrival, 三个角中,知道两个才能求另外一个,详情可以看这里

只有两个microphone只能求AOA,但是三个不共线的microphone就可以求其他的角度了。

对于任意一对麦克风k,j,有:
GCC-PHAT算法
这里u是信号传播的单位向量。通过三对麦克风我们就可以求出u, 当然,如果你的麦克风数量更多,可以用最小二乘算出更精确的值;那么最后就可以求出旋转角和仰角:
GCC-PHAT算法
这里α 是旋转角, θ 是仰角。

最后聊一下AOA的精度:
前面有
GCC-PHAT算法
也就是说β=arcsin(cτL)\beta=arcsin(\frac{c\tau}{L})

那么τ\tau最小为1f\frac{1}{f}, 那么

β=arcsin(cLf)\beta=arcsin(\frac{c}{Lf})

这里取c=340m/s, L=0.065m,f=44100Hz,得到

β=6.812\beta=6.812°

参考:Generalized cross-correlation