查找两个时间序列之间的时间滞后

信息处理 matlab 傅里叶变换 时频
2022-01-26 15:53:51

我正在尝试使用 MATLAB 查找 t = [0,1000] 上的两个时间序列之间的时间滞后(没关系)。第一个时间序列只是 t^2。第二个是 (t-15)^2,当然,它向右移动了 15 个单位(例如,秒)。我的方法是找到互相关(使用 FFT 计算),然后使用其中的最大值来确定适当的时移。出于某种原因,我一直得到的答案是 0,这没有任何意义。谁能告诉我我做错了什么?谢谢!

如图所示,我使用 FFT 计算了互相关(所有代码都在 MATLAB 中;注意 fft 是快速傅里叶变换函数,ifft 是快速傅里叶逆变换函数):

t = [1:1000];
a = t.^2;
b = (t-15).^2;

if (length(a) < length(b))
  c = [zeros(1,length(b)-1) a zeros(1,length(b)-length(a))]; 
  d = [b zeros(1,length(b)-1)]; 
else 
  c = [zeros(1,length(a)-1) a]; 
  d = [b zeros(1,length(a)-length(b)+length(a)-1)]; 
end

c_fft = fft(c); 
d_fft = fft(d);

cross_spectral_density = c_fft.*conj(d_fft);
cross_correlations = ifft(cross_spectral_density);

[max_xcorr shift_idx] = max(abs(cross_correlations)); 
shift = shift_idx - max(length(a),length(b));
1个回答

我对为什么会发生这种情况没有很好的解释,除了二次信号可能是非平稳的,因为它们的平均值正在变化(或无界)。

如果我做一些事情来确保平均值是有界的(而不是改变),例如:

a = sin(t.^2);
b = sin((t-15).^2);

或者

a = rem(a,100);
b = rem(b,100);

然后我得到正确答案:15 个样本。

这是我使用第一个时发生的情况:

在此处输入图像描述

这是我使用第二个时发生的情况:

在此处输入图像描述

两个修改后的信号都会产生相同(正确)的延迟估计。

Scilab在下面生成它的代码。我还修改了您的零填充等,因为它似乎过于复杂。


代码如下

// 25867
t = [1:1000]; 
a = (t.^2); 
b = ((t-15).^2);
a = a - fix(a/200)*200; 
b = b - fix(b/ 200)*200;

c = [a zeros(1,length(b) - 1)];
d = [b zeros(1,length(a) - 1)];

mu = mean([mean(c) mean(d)])

c_fft = fft(c - mu); 
d_fft = fft(d - mu);

cross_spectral_density = c_fft.*conj(d_fft); 
cross_correlations = fftshift(ifft(cross_spectral_density));
xc = xcorr(c- mu,d- mu,length(t)-1);

[max_xcorr shift_idx] = max(abs(cross_correlations)); 
shift = shift_idx - max(length(a),length(b));

clf;
subplot(211);
plot(a);
plot(b,'r');
subplot(212)
plot(cross_correlations);
plot(xc,'g:')
plot(shift_idx,cross_correlations(shift_idx),'r.')
xtitle('Delay is ' + string(shift))