我想知道是否有人可以向我指出一种用于比较时间相关信号的算法/技术。理想情况下,该假设算法将 2 个信号作为输入并返回一个数字,该数字将是信号之间的相似度百分比(0 表示 2 个信号在统计上不相关,1 表示它们完全匹配)。
当然,我意识到我的请求存在问题,即我不确定如何在比较这两个信号的情况下正确定义“相似性”,所以如果有人也能指出我正确的方向(至于我应该查找/知道的内容等),我也会很感激。
我想知道是否有人可以向我指出一种用于比较时间相关信号的算法/技术。理想情况下,该假设算法将 2 个信号作为输入并返回一个数字,该数字将是信号之间的相似度百分比(0 表示 2 个信号在统计上不相关,1 表示它们完全匹配)。
当然,我意识到我的请求存在问题,即我不确定如何在比较这两个信号的情况下正确定义“相似性”,所以如果有人也能指出我正确的方向(至于我应该查找/知道的内容等),我也会很感激。
互相关函数是经典的信号处理解决方案。如果您可以访问 Matlab,请参阅 XCORR 函数。max(abs(xcorr(Signal1, Signal2, 'coeff')))
会专门为您提供您正在寻找的东西,并且 Python 中也存在等价物。
互相关假设您正在寻找的“相似性”是两个信号之间线性关系的度量。具有时间索引的实值有限长度信号的定义n = 0..N-1
是:
C[g] = sum{m = 0..N-1} (x1[m] * x2[g+m])
g
从-N..N
(在该范围之外,总和内的乘积为 0)。
尽管您要了一个数字,但该功能非常有趣。函数域g
称为滞后域。
如果x1
和x2
通过时间偏移相关,则互相关函数将在与偏移相对应的滞后处达到峰值。例如,如果你有x1 = sin[wn]
和x2 = sin[wn + phi]
,那么两个相同频率和不同相位的正弦波,互相关函数将在对应于相移的滞后处达到峰值。
如果x2
是 的缩放版本x1
,则互相关也将缩放。您可以通过除以将函数归一化为相关系数,并通过取绝对值sqrt(sum(x1^2)*sum(x2^2))
将其带入(Matlab 的那一行具有这些操作)。0..1
更一般地说,以下是互相关好/坏的总结。
互相关适用于确定一个信号是否与另一个信号线性相关,即如果
x2(t) = sum{n = 0..K-1}(A_n * x1(t + phi_n))
所讨论的信号是否
在哪里x1(t)
,是否是比例因子,是否是时间偏移。其含义是:x2(t)
A_n
phi_n
(phi_n <> 0 for some n)
则互相关函数将非零。 (A_n <> 0 for some n)
则互相关函数将非零。 A_n
都是phi_n
非零),则互相关函数将非零。请注意,这也是线性滤波器的定义。更具体地说,假设x1
是宽带随机信号。让x2=x1
. 现在归一化的互相关函数在 g=0 时正好为 1,而在其他任何地方都接近 0。现在让x2
成为 的(线性)过滤版本x1
。互相关函数在 附近将是非零的g=0
。非零部分的宽度将取决于滤波器的带宽。
对于特殊情况x1
答案x2
的原始部分中的相移信息适用。
互相关在哪里如果两个信号不是线性相关,则无济于事。例如,不同频率的两个周期信号不是线性相关的。也不是在不同时间从宽带随机过程中抽取两个随机信号。形状相似但时间索引不同的两个信号也不是 - 这就像不相等的基频情况。
在所有情况下,标准化互相关函数并查看最大值将告诉您信号是否潜在线性相关 - 如果数字较低,例如低于 0.1,我会很乐意宣布它们不相关。比这更高,我会更仔细地研究它,绘制归一化和非归一化的互相关函数并查看结构。周期性互相关意味着两个信号都是周期性的,并且明显较高的互相关函数g=0
意味着一个信号是另一个信号的滤波版本。
您可以尝试快速傅立叶变换(在 Wikipedia 中查找 FFT,有用于执行转换的开源库)。
FFT 会将您的数据从时域(即 1 秒、2 秒、3 秒、4 秒……的脉冲)转换为频域数据(即每秒一个脉冲)。
然后,您可以更轻松地比较频率及其相对强度。这对你来说应该是朝着正确方向迈出的一步。
如果应该通过加快和减慢不同位置的时间来匹配信号,则可以使用动态时间扭曲方法。
您并没有过多地谈论信号是什么,以及“相同性”的衡量标准对您来说是否有意义。但是,如果信号是同相的(也就是说,您想逐个瞬间比较两个信号,并且不会考虑任何时间延迟),那么我建议您查看 Pearson 的相关器。如果两个信号相同,则为 1,如果它们完全不同,则为 0,如果它们有点押韵,则为介于两者之间。作为一个额外的优势,Pearson's 不在乎信号是否以不同的方式放大,(除非一个信号是另一个信号的倒数,它会给你一个 -1 的结果)。
这听起来像你要找的吗?
http://en.wikipedia.org/wiki/Pearson_product-moment_correlation_coefficient
我不知道信号处理,所以这是一个猜测..:
您的信号有效地是有序对的列表,(x,y)
时间x
和y
幅度在哪里?如果是这样,那么也许你可以扔掉时间坐标——例如:
Signal 1: [(x0,y0), (x1,y1), (x2,y2), (x3,y3), ...]
Signal 2: [(x0,z0), (x1,z1), (x2,z1), (x3,z3), ...]
扔掉时间:
Signal 1: [y0, y1, y2, y3, ...]
Signal 2: [z0, z1, z2, z3, ...]
然后你可以相互比较振幅,也许是通过寻找相关性。也许你可以策划y
反对z
:
Comparing: [(y0,z0), (y1,z1), (y2,z2), (y3,z3), ...]
或计算各种相关系数之一。