MATLAB上的GCC-PHAT(仍然具有挑战性)

时间:2017-02-22 22:45:33

标签: matlab fft ifft cross-correlation

我正在尝试使用MATLAB上的GCC-PHAT计算两个声学信号之间的时间延迟估计。然而,用fft / ifft编码GCC-PHAT仍然具有挑战性,其中时间延迟估计总是为零。我花了几个小时谷歌搜索但尚未成功。我的代码在一个带有两个正弦波的简单例子中演示如下。

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()的人都可以解释这个问题吗?我看过许多关注这个看似简单的问题的帖子,但它还没有解决。

3 个答案:

答案 0 :(得分: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个值。

答案 1 :(得分:0)

你的代码和Matlab的gccphat()在提取阶段方面有所不同。虽然您已经实现了一般方法,但除以幅度,它们计算角度的指数。因此,避免与除以0相关的数值问题:

C = R. / ABS(R);

答案 2 :(得分:0)

您可以在加权函数中添加一个常数因子,以避免在分母较小时放大误差,例如c = c ./(abs(R)+ a); a可以是常数