我试图了解 matlab 中的互相关(主要是 xcorr)是如何工作的。这是示例代码:
t = -4*pi:0.1:4*pi;
y1 = sin(t*pi);
y2 = sin(t*pi - 0.7*pi);
[acor,lag] = xcorr(y1,y2,50);
[~,I] = max(abs(acor));
lagDiff = lag(I)
答案是:
3
现在将 delta t 乘以 3,得到 (0.1*3),时滞为 0.3,而真正的答案是 0.7*3.14,大约为 2.2 我无法弄清楚我做错了什么
提前致谢
最佳答案
你有两处错误:
- 您不应在最大化中使用
abs
。 0.7*3.14
是真正的相位滞后,而不是真正的时间滞后。真正的时间滞后是-0.7
(另请注意减号)。
让我详细阐述这两点。
您需要使用
[~,I] = max(acor)
即删除
abs
。使用abs
,您可能会发现信号给出非常大的负相关性的滞后,这不是您想要的。通过此修改,您将获得
I=44
和lagDiff=-7
。现在,根据您对
t
的定义,您的采样周期为0.1
。因此结果lagDiff=-7
(在样本中)对应于-0.7
秒。您对真实答案的推理不正确。真正的答案不是
0.7*3.14
,而是-0.7
。要了解原因,请注意您的定义y2 = sin(t*pi - 0.7*pi);
相当于
y2 = sin((t-0.7)*pi);
比较
y1 = sin(t*pi);
很明显,
y2
是y1
,时间提前了0.7
秒;或延迟-0.7
秒。
综上所述,不带abs
的代码给出的结果与真实答案一致:-0.7
秒。
关于matlab - matlab中的新手互相关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28006565/