matlab 两个信号之间的相似性:寻找简单的度量

flvlnr44  于 2023-01-31  发布在  Matlab
关注(0)|答案(2)|浏览(709)

我有20个信号(时间进程),B组有20个信号。我想找到一个指标来表明A组与B组的不同。例如,我对每组内的信号运行了xcorr。但现在我需要以某种方式进行比较。我尝试获取每个xcorr对的最大幅度,也就是最大相似度的一种度量,然后我把两组的这些值都比较了一下,没有差别,那我还能怎么办呢,我还可以比较频谱,但我又不知道该取什么频率仓。任何建议/参考都非常感谢!
每组中有大约20个信号。这些是我的样本。我事先不知道可能有什么不同。这里我带来每组的9个样本信号,它们的信号子集的自相关和互相关(第1组对第1组,第2组对第2组,第1组对第2组)。我没有看到任何明显的差异。我也不明白您提出如何比较交叉相关性,我应该取哪些峰值?所有的信号都被去趋势化和z值化。

jq6vz3qz

jq6vz3qz1#

好吧,这可能是一个过于简单的答案,一个过于复杂的措施,但也许它的价值。
为了比较信号,我们必须建立一些标准来比较它们。这可能涉及很多方面。如果我们希望信号看起来相似,我们就进行时域分析。如果我们谈论的是听起来相似的音频信号,我们就关心频率或时频分析。如果信号应该代表噪声,那么信号方差应该是一个很好的度量。2一般来说,我们可能希望使用各种度量的组合。3我们可以用加权指数来做这件事。
首先,让我们建立我们所拥有的:存在两组信号:集合A和集合B。我们需要显示集合A与集合B不同的一些度量。信号被去趋势化。
我们取A中的信号a和B中的信号B。我们可以比较的事情列表如下:

***时域相似度(静态):**原地相乘求和。
***时域中的相似性(带移位 *):**对每个信号进行FFT、相乘和ifft(我认为这相当于matlab的xcorr)。
*频域相似性(静态):**对每个信号进行FFT,相乘,求和。
***频域相似性(移位 *):**将两个信号相乘并进行FFT。这将显示信号是否具有相似的频谱形状。
***能量(或功率,如果长度不同)的相似性:**求两个信号的平方并求和(并除以信号长度以得到功率)。(由于信号被去趋势化,这应该是信号方差。)然后相减并取绝对值以用于信号方差相似性的测量。

  • (带移位)--可以选择对整个相关向量求和以测量总的一般相关,可以选择仅对相关向量中超过某个阈值的值求和(就好像期望一个信号在另一个信号中的回声),或者仅从相关向量中取最大值(其中其索引是导致与第一信号的最大相关的第二信号中的移位)。而且,如果达到最大相关所花费的移位量是重要的(即如果信号仅在达到最大相关点所花费的移位相对较小时才是相似的),那么你可以加入一个指数位移的测量值。
    **(频域相似性)--您可能希望屏蔽不关心的频谱部分,例如,如果您只关心更高频率的结构(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;

我们为每对信号计算该指数。
我希望这个信号特征的概述能有所帮助。如果有什么不清楚的地方请评论。

vwhgwdsa

vwhgwdsa2#

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

def compute_similarity(ref_rec,input_rec,weightage=[0.33,0.33,0.33]):
    ## Time domain similarity
    ref_time = np.correlate(ref_rec,ref_rec)
    inp_time = np.correlate(ref_rec,input_rec)
    diff_time = abs(ref_time-inp_time)
    
    ## Freq domain similarity
    ref_freq = np.correlate(np.fft.fft(ref_rec),np.fft.fft(ref_rec)) 
    inp_freq = np.correlate(np.fft.fft(ref_rec),np.fft.fft(input_rec))
    diff_freq = abs(ref_freq-inp_freq)
    
    ## Power similarity
    ref_power = np.sum(ref_rec**2)
    inp_power = np.sum(input_rec**2)
    diff_power = abs(ref_power-inp_power)
    
    return float(weightage[0]*diff_time+weightage[1]*diff_freq+weightage[2]*diff_power)

相关问题