Я пытаюсь вычислить оценку временной задержки между двумя акустическими сигналами с использованием GCC-PHAT на MATLAB. Тем не менее, все еще сложно кодировать GCC-PHAT с fft/ifft, где оценка временной задержки всегда равна нулю. Я потратил часы на поиски в Google, но пока не добился успеха. Мой код демонстрируется на простом примере с двумя синусоидальными волнами следующим образом.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
.
Может ли кто-нибудь, кто успешно разрешил GCC-PHAT на Matlab или известном gccphat(), лицензированной функции, объяснить более подробно об этой проблеме? Я видел много сообщений, связанных с этой, казалось бы, легкой проблемой, но она пока еще не решена.