Performance 在matlab中,加速互相关

Performance 在matlab中,加速互相关,performance,matlab,cross-correlation,Performance,Matlab,Cross Correlation,我有一个很长的时间序列,其中有一些重复和类似的信号(不完全是周期性的)。时间序列的长度约为60000个样本。为了识别信号,我取出其中一个样本,长度约为1000个样本,并将其沿timeseries数据逐样本移动,然后计算互相关系数(在Matlab:corrcoef中)。如果此值高于某个阈值,则存在匹配。 但这是极其缓慢的(使用“for loop”移动窗口)。 有没有一种方法可以加速这个过程,或者Matlab中已经有了一些机制来实现这个过程 非常感谢 已编辑:添加了有关改用“xcorr”的信息: 如

我有一个很长的时间序列,其中有一些重复和类似的信号(不完全是周期性的)。时间序列的长度约为60000个样本。为了识别信号,我取出其中一个样本,长度约为1000个样本,并将其沿timeseries数据逐样本移动,然后计算互相关系数(在Matlab:corrcoef中)。如果此值高于某个阈值,则存在匹配。 但这是极其缓慢的(使用“for loop”移动窗口)。 有没有一种方法可以加速这个过程,或者Matlab中已经有了一些机制来实现这个过程

非常感谢

已编辑:添加了有关改用“xcorr”的信息:

如果我使用'xcorr',或者至少是我使用它的方式,我会得到错误的图片。查看数据(第一个图),有两种类型的重复信号。一个由红色矩形标记,而另一个具有更大振幅(这是相干噪声)的由黑色矩形标记。我对第一种感兴趣。第二个图显示了我正在寻找的信号,放大了。 如果我使用'xcorr',我会得到第三个图。正如你所看到的,'xcorr'给了我错误的信号(事实上,我的信号和相干噪声之间有很高的互相关)。 但是使用“corrcoef”并移动窗口,我得到了最后一个正确的图。 使用“xcorr”时可能会出现规范化问题,但我不知道


我可以想出两种方法来加快速度

1) 让你的模板长1024个元素。突然之间,可以使用FFT进行关联,这比DFT或每个位置的逐元素乘法要快得多

2) 问问自己,你真正关心的模板形状是什么。你真的需要非常高的频率,还是你真的想要较低的频率?如果你可以重新采样模板和信号,使其不再包含任何你不关心的频率,这将使处理速度大大加快。步骤采取的措施包括

  • 确定您关心的最高频率
  • 过滤数据,以阻止更高的频率
  • 以较低的采样频率对结果数据重新采样
现在将其与大小为2的幂的模板组合

你可能会发现有趣的阅读


让我们知道上述任何一项是否有帮助!

您的问题似乎是一个教科书上的互相关示例。因此,除了使用
xcorr
之外,没有任何好的理由使用任何解决方案。一些技术评论:

  • xcorr假设平均值已从两个交叉相关信号中移除。此外,默认情况下,它不会缩放信号的标准偏差。这两个问题都可以通过对两个信号进行z评分来解决:
    c=xcorr(zscore(longSig,1),zscore(shortSig,1));c=c/n;
    其中
    n
    是较短信号的长度,应产生与滑动窗口方法相同的结果

  • xcorr的输出是根据滞后来排序的,滞后可以在第二个输出参数(
    [c,lags]=xcorr(..
    )中获得。始终通过
    绘图(lags,c)
    )来绘制xcorr结果。我建议尝试使用合成信号来验证您是否理解如何解释此图表

  • xcorr的实现已经使用了Discere Fourier变换,因此,除非您有异常情况,否则重新编码频域互相关将是浪费时间


  • 最后,对术语进行评论:将两个信号之间的对应时间点关联起来就是简单的相关性。
    corrcoef
    就是这样做的(它的名字代表相关系数,这里没有“互相关”)。互相关是移动其中一个信号并计算每个滞后的相关系数的结果。

    为什么不
    xcorr
    ?或
    conv
    ?这些函数会自动移动窗口。但是,结果不会像
    corrcoef
    那样标准化。但是您可以对此进行纠正。您是否尝试使用
    normxcorr2
    ?它用于2D数据,但我认为它也适用于时间序列。谢谢。好的方面。Matlab是否使用FFT进行互相关?我不知道。感谢澄清。虽然我不知道ZSCORE,但我已经对数据进行了去趋势处理,并将数据除以其标准偏差。感兴趣的信号和co相干噪声是由移动源产生的。因此,两者的长度随着时间的推移而变化。源越远,信号就越拉长。我知道“xcorr”的“滞后”输出。在这种情况下,我认为这无助于解决问题。