我試圖計算使用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(),有執照的功能,解釋這個問題更詳細的?我看過很多關於這個看似簡單的問題的帖子,但它還沒有解決。