在Matlab中比较两个信号的最佳方法

时间:2013-01-17 18:57:41

标签: matlab compare signal-processing similarity

我在matlab中发出了一个信号,我想与另一个信号进行比较(称为y和z)。我正在寻找的是一种分配两个信号相似程度的值或百分比的方法。

我试图使用corrcoef,但是我的值很差(corrcoef(y,z) = -0.1141),但是当我看到彼此叠加的两个图的FFT时,我会直观地说它们非常类似。看看两个信号幅度的FFT曲线看起来更有希望:corrcoef(abs(fft(y)),abs(fft(z))) = 0.9955,但我不确定这是否是最好的方法,因为这两个信号是纯粹的表格似乎没有相关性。

有人建议如何在Matlab中比较两个信号吗?

谢谢!

2 个答案:

答案 0 :(得分:9)

如果没有更清楚地定义“类似”的含义,那么这个问题就无法回答。

如果“相似”的意思是“相关的频率响应”,那么,你就比游戏领先一步了!

通常,定义适当的度量标准是高度特定于应用程序的;您需要回答为什么您想知道这两个信号有多相似,以了解如何衡量它们的相似程度。他们会输入同一个系统吗?它们是否需要通过相同的算法检测?

与此同时,您使用频率域相关性的想法也不错。但你也可以考虑

http://en.wikipedia.org/wiki/Dynamic_time_warping

或各种统计模型下时间序列的可能性:

http://en.wikipedia.org/wiki/Hidden_Markov_model http://en.wikipedia.org/wiki/Autoregressive_model http://en.wikipedia.org/wiki/Autoregressive%E2%80%93moving-average_model

或任何其他型号......

我应补充一点:一般来说,两个时间序列之间的相关系数是时间序列相似性的一个非常差的度量,除非在非常特殊的情况下(例如,相位没有变化)

答案 1 :(得分:7)

Pete是对的,你需要在进一步发展之前定义相似性的概念。您可能会发现归一化的最大互相关幅度对于您的环境来说是有用的相似概念,但是:

norm_max_xcorr_mag = @(x,y)(max(abs(xcorr(x,y)))/(norm(x,2)*norm(y,2)));
x = randn(1, 200); y = randn(1, 200); % two random signals 
norm_max_xcorr_mag(x,y)

ans = 0.1636

y = [zeros(1, 30), 3.*x]; % y is delayed, multiplied version of x
norm_max_xcorr_mag(x,y)

ans = 1

这种相似性概念类似于两个序列的死记硬背相关,但对时间延迟不变。