我试图计算使用MATLAB的GCC-PHAT两个声信号之间的时间延迟估计。然而,用fft/ifft编码GCC-PHAT仍然具有挑战性,其中时间延迟估计总是为零。我花了数小时搜索,但尚未成功。我的代码用两个正弦波如下的简单例子来演示。GCC-PHAT在MATLAB(仍具挑战)
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(),有执照的功能,解释这个问题更详细的?我看过很多关于这个看似简单的问题的帖子,但它还没有解决。