Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 测量两个不同的(矢量)信号相似性_Matlab_Signals_Signal Processing_Similarity - Fatal编程技术网

Matlab 测量两个不同的(矢量)信号相似性

Matlab 测量两个不同的(矢量)信号相似性,matlab,signals,signal-processing,similarity,Matlab,Signals,Signal Processing,Similarity,我很难找到一种比较(测量)两个不同信号之间相似性的好方法。我不想找出一个信号到另一个信号的时间延迟,但我想看看它们之间有什么相似之处。 例如,我有以下两个信号,比如s1和s2。这两个信号看起来非常相似,但是在一个信号中有一个突然的跳跃,这导致信号的第二部分(也是主信号)与第一部分相比有一个偏移 当我使用互协方差和互相关时,结果很差,即: xcov(s1, s2, 0, 'coeff') ----> 0.2153 然而,看看这两个信号,我们可以看到它们非常相似。事实上,如果仅从样本(50

我很难找到一种比较(测量)两个不同信号之间相似性的好方法。我不想找出一个信号到另一个信号的时间延迟,但我想看看它们之间有什么相似之处。 例如,我有以下两个信号,比如s1和s2。这两个信号看起来非常相似,但是在一个信号中有一个突然的跳跃,这导致信号的第二部分(也是主信号)与第一部分相比有一个偏移

当我使用互协方差和互相关时,结果很差,即:

xcov(s1, s2, 0, 'coeff') ----> 0.2153
然而,看看这两个信号,我们可以看到它们非常相似。事实上,如果仅从样本(50->信号末尾)中获取两个信号的互协方差,结果非常好:

   xcov(s1(50:280), s2(50:280), 0, 'coeff') ----> 0.9666
所以我猜问题是由于样本25(红色信号中)附近的大跳跃造成的

我的问题是:

  • 如何克服上述问题
  • 互协方差(相关)是衡量两个信号之间相似性的好方法吗
  • 还有别的办法吗

非常感谢。我真的很感谢你的帮助

您可以计算这两条曲线之间的面积。如果面积较小,则曲线相似;如果面积较大,则曲线不太相似


编辑:为了处理曲线“跳跃”和DC偏移情况,在进行对齐后,应计算两条曲线之间的面积。

您可能还应该研究稳健的相关系数。有相当多的文献和研究。然而,当我重新创建您的信号时,我可能已经为您找到了解决方案。由于信号非常稳定,除了某一点外,还有一个简单的技巧

我们可以用
s1=[s1(1)cumsum(diff(s1))]重新创建信号。从这里开始,想法很简单。我们想忽略这个大跳跃。因此,我们必须限制
diff(s1)
的最大值。通过以下方式完成:

s1_robust=[s1(1)总和(符号(差值(s1)).*min(绝对值(差值(s1)),1))]

我在
min(s1,1)
部分任意选择了1。您可能希望将其设置为信号标准偏差的某个因子

这是我用来分析你的问题的完整代码


根据您的数据,我强烈建议您使用频域(例如使用DFT)。在频域中的比较应该发现两个建议信号之间的相似性。

你会考虑测量信号的梯度之间的相似性吗?你可以用移动平均滤波器来计算一个短距离内的平均值吗?然后从信号EN中减去,然后检查相似性吗?如果你认为跳转是一个离群值,你可以尝试像RANSAC那样的离群值去除方法(只是一个想法……)我想你无论如何都可以使用一种移动平均滤波器,来检查信号的小部分之间的相似性。可能会删除每个部分的平均值以克服跳跃问题,然后对每个部分使用互相关。谢谢@A。维瑟:我尝试过了,它给出了一个更有希望的结果。只是想知道,有没有其他方法来比较两个不同信号之间的相似性?因为对我来说,互相关是一种最简单的方法,但它并不能反映真正的相似性。因为即使我只比较信号的一小部分,我也需要知道它们应该有多小,否则我认为这不会给出好的结果。谢谢@Hesham Eraqui。我不这么认为,首先,跳跃会造成严重的结果差异。此外,由于噪声或直流偏移,两条曲线之间的面积可能比它假设的要大得多。
clc, clear all, close all

signal = cos([0:0.1:20]);
s1 = signal + rand(1,201);
s2 = signal + rand(1,201);
s2(50:end) = s2(50:end)-8;

s1_robust = [s1(1) cumsum(sign(diff(s1)).*min(abs(diff(s1)),1))];
s2_robust = [s2(1) cumsum(sign(diff(s2)).*min(abs(diff(s2)),1))];
corr        = corrcoef(s1,s2)
corr_robust = corrcoef(s1_robust,s2_robust)

 figure
 plot(s1);
 hold on;
 plot(s2);

 figure
 plot(cumsum(sign(diff(s1)).*min(abs(diff(s1)),1)));
 hold on;
 plot(cumsum(sign(diff(s2)).*min(abs(diff(s2)),1)));