【问题标题】:In matlab, speed up cross correlation在matlab中,加速互相关
【发布时间】:2014-04-19 14:54:14
【问题描述】:

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

非常感谢

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

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

【问题讨论】:

  • 为什么不xcorr?还是conv?这些功能会自动移动窗口。但是,结果没有像corrcoef 那样标准化。但是您可以对此进行纠正
  • 您是否尝试过使用normxcorr2?它适用于 2D 数据,但我想它也应该适用于时间序列。

标签: performance matlab cross-correlation


【解决方案1】:

我可以想到两种加快速度的方法。

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

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

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

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

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

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

【讨论】:

  • 谢谢。好点。 Matlab 是否使用 FFT 进行互相关?不知道。
【解决方案2】:

您的问题似乎是互相关的教科书示例。因此,没有充分的理由使用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 的实现已经使用了离散傅里叶变换,因此除非遇到异常情况,否则再次编写频域互相关代码将是浪费时间。

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

【讨论】:

  • 感谢您的澄清。虽然我不知道 ZSCORE,但我已经对数据进行了去趋势化处理,并将其除以标准差。感兴趣的信号和相干噪声都是由移动源产生的。因此,两者的最终长度都随着时间而变化。源越远,信号就越拉伸。我知道“xcorr”的“滞后”输出。在这种情况下,我认为这无助于解决问题。
猜你喜欢
  • 1970-01-01
  • 2012-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-11
  • 1970-01-01
  • 2015-04-21
相关资源
最近更新 更多