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

use*_*969 7 matlab signals signal-processing

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

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

在此输入图像描述在此输入图像描述在此输入图像描述 在此输入图像描述 在此输入图像描述 在此输入图像描述 在此输入图像描述 在此输入图像描述

Bri*_*ian 10

嗯,这可能是一个过于简单的答案,太复杂的措施,但也许它的价值.

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

首先让我们建立我们所拥有的:有两组信号:设置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);
Run Code Online (Sandbox Code Playgroud)

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

function c = circular_xcorr(a,b)
c = xcorr(a,b);
mid = length(c) / 2;
c = c(1:mid) + c(mid+1:end);
end
Run Code Online (Sandbox Code Playgroud)

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

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;
Run Code Online (Sandbox Code Playgroud)

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

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

  • 这个帖子很古老。你还在追吗?您描述的方法与我需要做的非常接近,但我对信号分析和 Matlab 的熟悉程度不如你们中的任何一个。万一,你能帮我提供一个链接,更完整地解释如何加权互相关和来自 FFT 的频率,最好是在 Matlab、R 或 python 中使用一些代码? (2认同)

Iva*_*van 9

参考上面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)
Run Code Online (Sandbox Code Playgroud)