2017-02-22 450 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);