matlab - 两个信号之间的相似性 : looking for simple measure

标签 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

最佳答案

嗯,这可能是一个过于简单的答案,也可能是一个过于复杂的衡量标准,但也许它是有值(value)的。

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

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

我们在 A 中获取信号 a,在 B 中获取信号 b。我们可以比较的事物列表:

  • 时域相似性(静态):原地相乘和求和。

  • 时域相似性(带偏移*):对每个信号取 fft, 相乘,ifft。 (我相信这相当于 matlab 的 xcorr。)

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

  • 频域相似性(带偏移*):将两者相乘 发出信号并采取 fft。这将显示信号是否具有相似性 光谱形状。

  • 能量(或功率,如果长度不同)相似:将两者平方 信号并对每个信号求和(并除以信号长度以获得功率)。 (自从 信号被去趋势化,这应该是信号方差。)然后 减去信号方差的测量值并取绝对值 相似度。

* (with shift) -- 你可以选择对整个相关向量求和来测量总的一般相关性,你可以选择只对相关向量中超过某个阈值的值求和(就好像你期望回声一个信号在另一个信号中),或者只是从相关向量中取最大值(其中它的索引是导致与第一个信号最大相关的第二个信号的偏移)。此外,如果达到最大相关性所需的偏移量很重要(即,如果信号仅在需要相对较小的偏移量以达到最大相关点时才相似),那么您可以合并索引位移的度量。

**(频域相似性)——您可能想要屏蔽您不关心的部分频谱,例如,如果您只关心更高频率的结构(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;

我们为每对信号计算该索引。

我希望这个信号表征概述对您有所帮助。如果有任何不清楚的地方,请发表评论。

关于matlab - 两个信号之间的相似性 : looking for simple measure,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20644599/

相关文章:

image - 将 Microsoft Paint 与 Matlab 代码结合使用

MATLAB:需要制作 4D 图(3D + Color/Color)

Python:防止信号传播到子线程

c - 从捕获浮点异常返回

c# - 没有从 Exocortex FFT 获得预期的输出

python - 在 Python 中将自相关计算为滞后函数

matlab - 如何在 MATLAB 编辑器中禁用代码分析器警告?

c++ - Sigaction 的替代方案

java - java中的简单带通滤波器

matlab - Matlab 中的数值问题 : Same input, 相同的代码 -> 不同的输出?