gpt4 book ai didi

matlab - 衡量两个不同(矢量)信号的相似度

转载 作者:太空宇宙 更新时间:2023-11-03 19:25:18 31 4
gpt4 key购买 nike

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

enter image description here

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

xcov(s1, s2, 0, 'coeff') ----> 0.2153

然而,从这两个信号来看,我们可以看出它们非常相似。事实上,如果仅从样本(50->信号的结尾)取两个信号的互协方差,结果非常好:

   xcov(s1(50:280), s2(50:280), 0, 'coeff') ----> 0.9666

所以我猜问题是由于样本 25 附近的大跳跃(在红色信号中)造成的。

我的问题是:

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

非常感谢。非常感谢您的帮助!

最佳答案

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

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

s1_robust = [s1(1) cumsum(sign(diff(s1)).*min(abs(diff(s1)),1))];

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

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

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)));

关于matlab - 衡量两个不同(矢量)信号的相似度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32243918/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com