GCC-PHAT(广义互相关)总是在延迟=0 处达到真实音频信号的峰值

信息处理 fft 离散信号 卷积 互相关 延迟
2022-02-08 02:55:58

我研究了 GCC-PHAT 算法来估计 2 个麦克风的音频信号的 TDOA。

这是我的 MATLAB 实现:

function cc = freq_xcorr_phat(x,y)
  n = length(x)+length(y)-1;
  X = fft(x,n);
  Y = fft(y,n);
  R = X.*conj(Y);
  R = exp(1i*angle(R));
  cc = ifft(R);
endfunction

我使用模拟立体声音频信号(其中通道 1 是真实的音频录制,通道 2 是具有特定采样延迟的通道 1,在本例中为 7 个采样)来测试此功能。结果 GCC-PHATcc绘制在下面,我们可以看到它显示了预期的结果,峰值位于-7

在此处输入图像描述

但是,当我使用真正的立体声音频信号(通道 2 延迟 15 个样本)来测试此功能时,结果 GCC-PHAT 图变得很奇怪。我们可以看到它在 处有一个峰值-15,但在 处的峰值0更强:

在此处输入图像描述

问题是:

为什么第二个情节0达到峰值并且比峰值更强-15这对我来说没有意义。

ps

  1. 剧情其实是中间部分fftshift(cc)
  2. 我的问题可能与这个问题有关。
  3. 真正的立体声音频信号是从嵌入式系统 (MCU) 录制的。
1个回答

我认为这是因为信号的直流偏移。您提供的时域或频域图可能有助于确认您的疑问。以下是建议

1.尝试根据您感兴趣的信号频段在FFT之前过滤信号

2.用整个信号的平均值减去信号(这是找到直流偏移的一个合理技巧),或者如果你知道的话,直接减去直流偏移。

与直流偏移相比,您的信号必须具有较小的摆动幅度,从而使“0”点相关性的幅度大于实际延迟。