两个信号之间的相似性:寻找简单的衡量标准

时间:2013-12-17 21:02:40

标签: matlab signals signal-processing

我在A组有20个信号(时间进程),在B组有20个信号。我想找到一个测量来表明A组与B组不同。例如,我为每个组中的信号运行了xcorr。组。但现在我需要以某种方式比较它们。我试图获取每个xcorr对的最大幅度,这是最大相似度的度量。然后我比较了两组之间的所有这些值,但没有区别。我还可以做些什么?我也可以比较频谱,但后来我又不知道要采用什么频率。 任何建议/参考都非常感谢!

每组我有大约20个信号。那是我的样本。我不知道a-prirori可能有什么区别。在这里,我为每组提供9个样本信号,它们的自相关和信号子集的互相关(组1对组1,组2对组2,组1对组2)。我没有看到任何明显的区别。我也不明白你如何建议比较互相关,我应该采取什么样的高峰?所有信号都被去除了z分数。

enter image description here enter image description here在此输入图片说明 enter image description here enter image description here enter image description here enter image description here enter image description here

2 个答案:

答案 0 :(得分:9)

嗯,这可能是一个过于简单的答案,而且过于复杂,但可能是值得的。

为了比较信号,我们必须建立一些比较它们的标准。这可能是很多事情。如果我们想要看起来视觉上相似的信号,我们执行时域分析。如果我们谈论听起来相似的音频信号,我们关心频率或时频分析。如果信号应该代表噪声,那么信号方差应该是一个很好的衡量标准。一般来说,我们可能希望结合使用各种措施。我们可以用加权索引来做到这一点。

首先让我们建立我们拥有的东西:有两组信号:A组和B组。我们想要一些测量,显示A组与B组不同。信号是去趋势的。

我们在A中采用信号a,在B中采用信号b。我们可以比较的事项列表:

  • 时域相似(静态):在适当的位置和总和。

  • 时域相似(有班次*):取每个信号的fft, 乘以及ifft。 (我相信这相当于matlab的xcorr。)

  • 频域相似(静态**):取每个信号的fft, 乘以和求和。

  • 频域相似(有shift *):将两者相乘 信号并取fft。这将显示信号是否共享相似 光谱形状。

  • 能量的相似性(或不同长度时的功率):将两者平方 信号和各自的和(除以功率的信号长度)。 (以来 信号是去趋势的,这应该是信号变化。)然后 减去并获取信号方差测量的绝对值 相似性。

*(带移位) - 您可以选择对整个相关向量求和以测量总的一般相关性,您可以选择仅对相关向量中超过某个阈值的值求和(就像您期望的回声一样)另一个中的一个信号,或者仅从相关矢量中取最大值(其中,其索引是第二信号中的偏移,其导致与第一信号的最大相关)。此外,如果移的,它需要达到最大相关的量是重要的(即,如果信号是仅当它需要相对小的位移,以达到最大相关的点相似),然后就可以将索引位移的量度。< / p>

**(频域相似性) - 您可能希望掩盖您不关心的部分频谱,例如,如果您只关心更高频率的结构(fs / 4及以上),你可以这样做:

mask = zeros(1,n); mask(n/4):
freq_static = mean(fft(a) .* fft(b) .* mask);

另外,我们可能希望实现循环关联,如下所示:

function c = circular_xcorr(a,b)
c = xcorr(a,b);
mid = length(c) / 2;
c = c(1:mid) + c(mid+1:end);
end

最后,我们选择重要或相关的特征,并创建加权指数。例如:

n = 100;
a = rand(1,n); b = rand(1,n);
time_corr_thresh = .8 * n; freq_corr_thresh = .6 * n;
time_static = max(a .* b);
time_shifted = circular_xcorr(a,b);    time_shifted = sum(time_shifted(time_shifted > time_corr_thresh));
freq_static = max(fft(a) .* fft(b));
freq_shifted = fft(a .* b);     freq_shifted = sum(freq_shifted(freq_shifted > freq_corr_thresh));
w1 = 0; w2 = 1; w2 = .7; w3 = 0;
index = w1 * time_static + w1 * time_shifted + w2 * freq_static + w3 * freq_shifted;

我们为每对信号计算这个指数。

我希望这个信号表征概要有所帮助。评论是否有任何不清楚。

答案 1 :(得分:0)

参考上面布赖恩的回答,我编写了一个 Python 函数来计算时间序列信号的相似度,如下所示;

class Cart extends Model
 {

  protected $fillable = ['products_id','user_id'];
  public $table="cart";

  public function user()
     {
     return $this->belongsTo('App\User');
     }

   public function product()
    {
    return $this->belongsTo('App\Product');
    }

  }