我想知道是否有人能指出我用于比较时间相关信号的算法/技术。理想情况下,这个假设算法将输入2个信号作为输入,并返回一个数字,即信号之间的百分比相似度(0表示2个信号在统计上不相关,1表示它们是完美匹配)。
当然,我意识到我的要求存在问题,即我不确定如何在比较这两个信号的情况下正确定义“相似性”,所以如果有人也能指出我正确的方向(至于我应该查看/知道的等等),我也很感激。
答案 0 :(得分:14)
cross-correlation function是经典的信号处理解决方案。如果您可以访问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
对于某些数量的n都不为零),则互相关函数将为非零。请注意,这也是线性过滤器的定义。为了更具体,假设x1
是宽带随机信号。让x2=x1
。现在,归一化的互相关函数在g = 0时恰好为1,在其他地方接近0。现在让x2
成为x1
的(线性)过滤版本。互相关函数在g=0
附近将为非零。非零部分的宽度取决于滤波器的带宽。
对于x1
和x2
是特殊情况的特殊情况,答案原始部分的相移信息适用。
如果两个信号不是线性相关的,那么互相关将无助。例如,不同频率的两个周期信号不是线性相关的。在不同时间也不是从宽带随机过程中提取的两个随机信号。两个信号的形状相似但时间索引也不同 - 这就像不相等的基频情况一样。
在所有情况下,对互相关函数进行归一化并查看最大值将告诉您信号是否与线性相关 - 如果数字较低,如0.1以下,我会很自然地宣布它们不相关。高于此,我会更仔细地研究它,绘制标准化和非标准化的互相关函数并查看结构。周期性互相关意味着两个信号都是周期性的,并且在g=0
附近明显更高的互相关函数意味着一个信号是另一个信号的过滤版本。
答案 1 :(得分:1)
一般解决方案:您可以将数据分成直方图并使用卡方检验或Kolomogrov检验。
两者都明确用于估计两个分布代表相同下属分布的随机样本的可能性(即:在统计中具有相同的形状)。
我不知道我的头脑中的c实现,但ROOT提供了两者的c ++实现:
我相信文档也指向了一些论文。
我认为CERNLIB在fortran77中提供了两种算法,您可以链接到c。翻译ROOT代码可能更容易。
答案 2 :(得分:1)
您可以尝试快速傅里叶变换(在维基百科中查找FFT,有用于执行转换的开源库)。
FFT会将您的数据从时域(即1s,2s,3s,4s的脉冲......)转换为频域数据(即每秒脉冲)。
然后,您可以更轻松地比较频率及其相对强度。它应该是朝着正确方向迈出的一步。
答案 3 :(得分:1)
Dynamic Time Warping是一种方法。
答案 4 :(得分:0)
我不知道信号处理,所以这是猜测..:
您的信号是否实际上是有序对(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, ...]
然后你可以通过寻找correlation来比较振幅。也许您可以针对y
:
z
Comparing: [(y0,z0), (y1,z1), (y2,z2), (y3,z3), ...]
或者计算各种相关系数之一。
答案 5 :(得分:0)
你不是很清楚信号是什么,以及“同一性”的衡量标准对你有意义。但是,如果信号是同相的(也就是说,你想要瞬间比较两个信号,并且不会考虑任何时间延迟),那么我建议你看看Pearson的相关器。如果两个信号相同,它给出的值为1,如果它们完全不相似则为0,如果它们有点押韵,则为两者之间的值。作为一个额外的优势,Pearson并不关心信号是否以不同方式放大(除非一个信号与另一个信号相反,否则它会得到-1的结果)。
这听起来像你在找什么?
http://en.wikipedia.org/wiki/Pearson_product-moment_correlation_coefficient