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

too*_*e21 7 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中比较两个信号?

谢谢!

Pet*_*ete 9

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

如果用"相似"表示"相关频率响应",那么,那么,你比游戏领先一步!

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

与此同时,您使用freq-domain相关性的想法也不错.但你也可以考虑一下

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

或任何数量的其他型号......

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


jst*_*arr 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
Run Code Online (Sandbox Code Playgroud)

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