【发布时间】:2026-01-08 16:45:02
【问题描述】:
我正在尝试在 MATLAB 上使用 GCC-PHAT 计算两个声学信号之间的时间延迟估计。然而,使用 fft/ifft 对 GCC-PHAT 进行编码仍然具有挑战性,其中时间延迟估计始终为零。我花了几个小时在谷歌上搜索,但还没有成功。我的代码在一个带有两个正弦波的简单示例中演示,如下所示。
Fs = 8000;
dt = 1/Fs;
f1 = 100;
tdelay = 0.002;
t3 = (0:dt:(1)-dt)';
x = cos(2*pi*f1*t3);
y = cos(2*pi*f1*(t3-tdelay));
n=2*length(x)-1;
N=2^nextpow2(n);
xfft = fft(x,N);
yfft = fft(y,N);
df=Fs/N;
sampleIndex = -N/2:N/2-1;
f=sampleIndex*df;
R=xfft.*conj(yfft);
c=R./abs(R);
ic=fftshift(ifft(c));
figure; plot(f,ic)
[~,ind]=max(abs(ic));
lagDiff=f(ind);
timeDiff=lagDiff/Fs;
我知道 GCC-PHAT 可以由 R 编码,它的工作原理如本文https://dsp.stackexchange.com/questions/31956/gcc-phat-generalized-cross-correlation-matlab 中所述
但是,R 代码并不健壮,在某些情况下会失败。例如,对于上述链接中的代码,f=100Hz 和tdelay=0.01 或f=50Hz 和tdelay=0.01 的结果是错误的。
任何在 Matlab 上成功解决 GCC-PHAT 或知道 gccphat()(一个许可函数)的人能否更详细地解释这个问题?看到很多帖子关注这个看似简单的问题,但还是没有解决。
【问题讨论】:
标签: matlab fft ifft cross-correlation