Performance 在matlab中,加速互相关
我有一个很长的时间序列,其中有一些重复和类似的信号(不完全是周期性的)。时间序列的长度约为60000个样本。为了识别信号,我取出其中一个样本,长度约为1000个样本,并将其沿timeseries数据逐样本移动,然后计算互相关系数(在Matlab:corrcoef中)。如果此值高于某个阈值,则存在匹配。 但这是极其缓慢的(使用“for loop”移动窗口)。 有没有一种方法可以加速这个过程,或者Matlab中已经有了一些机制来实现这个过程 非常感谢 已编辑:添加了有关改用“xcorr”的信息: 如果我使用'xcorr',或者至少是我使用它的方式,我会得到错误的图片。查看数据(第一个图),有两种类型的重复信号。一个由红色矩形标记,而另一个具有更大振幅(这是相干噪声)的由黑色矩形标记。我对第一种感兴趣。第二个图显示了我正在寻找的信号,放大了。 如果我使用'xcorr',我会得到第三个图。正如你所看到的,'xcorr'给了我错误的信号(事实上,我的信号和相干噪声之间有很高的互相关)。 但是使用“corrcoef”并移动窗口,我得到了最后一个正确的图。 使用“xcorr”时可能会出现规范化问题,但我不知道Performance 在matlab中,加速互相关,performance,matlab,cross-correlation,Performance,Matlab,Cross Correlation,我有一个很长的时间序列,其中有一些重复和类似的信号(不完全是周期性的)。时间序列的长度约为60000个样本。为了识别信号,我取出其中一个样本,长度约为1000个样本,并将其沿timeseries数据逐样本移动,然后计算互相关系数(在Matlab:corrcoef中)。如果此值高于某个阈值,则存在匹配。 但这是极其缓慢的(使用“for loop”移动窗口)。 有没有一种方法可以加速这个过程,或者Matlab中已经有了一些机制来实现这个过程 非常感谢 已编辑:添加了有关改用“xcorr”的信息: 如
我可以想出两种方法来加快速度 1) 让你的模板长1024个元素。突然之间,可以使用FFT进行关联,这比DFT或每个位置的逐元素乘法要快得多 2) 问问自己,你真正关心的模板形状是什么。你真的需要非常高的频率,还是你真的想要较低的频率?如果你可以重新采样模板和信号,使其不再包含任何你不关心的频率,这将使处理速度大大加快。步骤采取的措施包括
- 确定您关心的最高频率
- 过滤数据,以阻止更高的频率
- 以较低的采样频率对结果数据重新采样
让我们知道上述任何一项是否有帮助!您的问题似乎是一个教科书上的互相关示例。因此,除了使用
xcorr
之外,没有任何好的理由使用任何解决方案。一些技术评论:
c=xcorr(zscore(longSig,1),zscore(shortSig,1));c=c/n;
其中n
是较短信号的长度,应产生与滑动窗口方法相同的结果[c,lags]=xcorr(..
)中获得。始终通过绘图(lags,c)
)来绘制xcorr结果。我建议尝试使用合成信号来验证您是否理解如何解释此图表最后,对术语进行评论:将两个信号之间的对应时间点关联起来就是简单的相关性。
corrcoef
就是这样做的(它的名字代表相关系数,这里没有“互相关”)。互相关是移动其中一个信号并计算每个滞后的相关系数的结果。为什么不xcorr
?或conv
?这些函数会自动移动窗口。但是,结果不会像corrcoef
那样标准化。但是您可以对此进行纠正。您是否尝试使用normxcorr2
?它用于2D数据,但我认为它也适用于时间序列。谢谢。好的方面。Matlab是否使用FFT进行互相关?我不知道。感谢澄清。虽然我不知道ZSCORE,但我已经对数据进行了去趋势处理,并将数据除以其标准偏差。感兴趣的信号和co相干噪声是由移动源产生的。因此,两者的长度随着时间的推移而变化。源越远,信号就越拉长。我知道“xcorr”的“滞后”输出。在这种情况下,我认为这无助于解决问题。