我正在尝试使用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=100Hz
和tdelay=0.01
或f=50Hz
和tdelay=0.01
的结果都是错误的。
任何在Matlab上成功解决GCC-PHAT或知道gccphat()的人都可以解释这个问题吗?我看过许多关注这个看似简单的问题的帖子,但它还没有解决。
答案 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可以是常数