在matlab中,加速互相关

时间:2014-03-14 10:49:16

标签: performance matlab cross-correlation

我有一个很长的时间序列,里面有一些重复和相似的信号(不完全是周期性的)。时间序列的长度约为60000个样本。为了识别信号,我取出其中一个,长度大约为1000个样本,然后沿着我的时间序列数据样本移动它,并计算互相关系数(在Matlab中:corrcoef)。如果此值高于某个阈值,则匹配。 但这是极其缓慢的(使用' for循环'移动窗口)。 有没有办法加快速度,或者Matlab中已经有了一些机制呢?

非常感谢

已编辑:添加有关使用' xcorr'的信息代替:

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

enter image description here

2 个答案:

答案 0 :(得分:0)

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

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

2)问问自己你真正关心的模板形状是什么。你真的需要非常高的频率,还是你真的需要更低的频率?如果您可以重新对模板进行采样并发出信号,使其不再包含您不关心的任何频率,那么它将使处理速度大大加快。采取的步骤包括

  • 确定您关注的最高频率
  • 过滤您的数据,以阻止更高的频率
  • 以较低的采样频率重新采样结果数据

现在将其与大小为2的力量的模板结合起来

你可能会发现this link有趣的阅读。

如果以上任何一项有帮助,请告诉我们!

答案 1 :(得分:0)

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

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

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

  3. xcorr的实现已经使用Discere Fourier Transform,所以除非你有异常情况,否则再次编码频域互相关将是浪费时间。

  4. 最后,关于术语的评论:关联两个信号之间的相应时间点是明确的相关性。这是corrcoef的作用(它的名称代表相关系数,没有'互相关'那里)。互相关是移动其中一个信号并计算每个滞后的相关系数的结果。