2017-02-22 28 views
0

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

ответ

0

Matlab's new Phased Array Toolbox позволяет вам использовать функцию GCCPHAT на ваших сигналах.

timeDelay = gccphat([Y1(span),Y2(span),Y3(span),Y4(span),Y5(span),Y6(span),Y7(span)],Y0(span),FS); 

timeDelay variable будет иметь 7 значений относительно частоты дискретизации FS.

0

Ваш код и gccphat() Matlab отличается от извлечения фазы. Пока вы реализовали общий подход, чтобы разделить по величине, они вычисляют экспоненту угла. Избегая поэтому числовых вопросов, связанных с делением на 0 в:

c = R./abs (R);

Смежные вопросы