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)
我们为每对信号计算这个指数.
我希望这个信号表征概要有所帮助.评论是否有任何不清楚.
参考上面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)