2017-02-22 430 views
0

我試圖計算使用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=100Hztdelay=0.01f=50Hztdelay=0.01

誰能誰成功地解決了Matlab的GCC-PHAT或已知的gccphat(),有執照的功能,解釋這個問題更詳細的?我看過很多關於這個看似簡單的問題的帖子,但它還沒有解決。

回答

0

Matlab的新型相控陣工具箱允許你使用GCCPHAT功能上的信號。

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

timeDelay變量相對於採樣頻率FS有7個值。

0

您的代碼和Matlab的gccphat()的不同相位的提取。雖然你已經實現了一般方法,除以數量級,他們計算角度的指數。避免與被0除在相關數值因此問題:

C = R./ABS(R);