matlab中的新手互相关

newbie cross-correlation in matlab

我想了解 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 我不知道我在做什么错

提前致谢

你有两处错误:

  1. 你不应该在最大化中使用 abs
  2. 0.7*3.14 是真正的 phase 滞后,而不是真正的 time 滞后。真正的时间滞后是 -0.7(另请注意减号)。

让我详细说明这两点。

  1. 您需要使用

    [~,I] = max(acor)
    

    即去掉abs。使用 abs 您可能会发现信号产生非常大的 相关性的滞后,这不是您想要的。

    通过此修改,您将获得 I=44lagDiff=-7

    现在,根据您对 t 的定义,您的采样周期为 0.1。因此结果 lagDiff=-7(以样本为单位)对应于 -0.7 秒。

  2. 您对正确答案的推理不正确。真正的答案不是 0.7*3.14,而是 -0.7。要了解原因,请注意您的定义

    y2 = sin(t*pi - 0.7*pi);
    

    等同于

    y2 = sin((t-0.7)*pi);
    

    比较

    y1 = sin(t*pi);
    

    很明显y2y1时间提前了0.7秒;或延迟 -0.7 秒。

综上所述,不带abs的代码给出的结果符合正确答案:-0.7秒。