11

我想知道是否有人可以向我指出一种用于比较时间相关信号的算法/技术。理想情况下,该假设算法将 2 个信号作为输入并返回一个数字,该数字将是信号之间的相似度百分比(0 表示 2 个信号在统计上不相关,1 表示它们完全匹配)。

当然,我意识到我的请求存在问题,即我不确定如何在比较这两个信号的情况下正确定义“相似性”,所以如果有人也能指出我正确的方向(至于我应该查找/知道的内容等),我也会很感激。

4

6 回答 6

14

互相关函数是经典的信号处理解决方案。如果您可以访问 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称为滞后域。

如果x1x2通过时间偏移相关,则互相关函数将在与偏移相对应的滞后处达到峰值。例如,如果你有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_nphi_n

  1. 如果一个信号是另一个信号的时移版本,(phi_n <> 0 for some n)则互相关函数将非零。
  2. 如果一个信号是另一个信号的缩放版本,(A_n <> 0 for some n)则互相关函数将非零。
  3. 如果一个信号是另一个信号的缩放和时移版本的组合(两者A_n都是phi_n非零),则互相关函数将非零。请注意,这也是线性滤波器的定义。

更具体地说,假设x1是宽带随机信号。让x2=x1. 现在归一化的互相关函数在 g=0 时正好为 1,而在其他任何地方都接近 0。现在让x2成为 的(线性)过滤版本x1。互相关函数在 附近将是非零的g=0。非零部分的宽度将取决于滤波器的带宽。

对于特殊情况x1答案x2的原始部分中的相移信息适用。

互相关在哪里如果两个信号不是线性相关,则无济于事。例如,不同频率的两个周期信号不是线性相关的。也不是在不同时间从宽带随机过程中抽取两个随机信号。形状相似但时间索引不同的两个信号也不是 - 这就像不相等的基频情况。

在所有情况下,标准化互相关函数并查看最大值将告诉您信号是否潜在线性相关 - 如果数字较低,例如低于 0.1,我会很乐意宣布它们不相关。比这更高,我会更仔细地研究它,绘制归一化和非归一化的互相关函数并查看结构。周期性互相关意味着两个信号都是周期性的,并且明显较高的互相关函数g=0意味着一个信号是另一个信号的滤波版本。

于 2009-08-14T02:12:01.687 回答
1

一般解决方案:您可以将数据放入直方图并使用卡方检验或科洛莫格罗夫检验。

两者都明确旨在估计两个分布代表来自相同下属分布的随机样本的机会(即:在统计数据中具有相同的形状)。

我不知道 ac 的实现,但ROOT提供了两者的 c++ 实现:

我相信文档也指向一些论文。


我认为CERNLIB在 fortran77 中提供了这两种算法,您可以将其链接到 c。翻译 ROOT 代码可能更容易。

于 2009-08-14T02:04:37.167 回答
1

您可以尝试快速傅立叶变换(在 Wikipedia 中查找 FFT,有用于执行转换的开源库)。

FFT 会将您的数据从时域(即 1 秒、2 秒、3 秒、4 秒……的脉冲)转换为频域数据(即每秒一个脉冲)。

然后,您可以更轻松地比较频率及其相对强度。这对你来说应该是朝着正确方向迈出的一步。

于 2009-08-14T02:09:06.293 回答
1

如果应该通过加快和减慢不同位置的时间来匹配信号,则可以使用动态时间扭曲方法。

于 2009-09-04T18:30:54.913 回答
0

您并没有过多地谈论信号是什么,以及“相同性”的衡量标准对您来说是否有意义。但是,如果信号是同相的(也就是说,您想逐个瞬间比较两个信号,并且不会考虑任何时间延迟),那么我建议您查看 Pearson 的相关器。如果两个信号相同,则为 1,如果它们完全不同,则为 0,如果它们有点押韵,则为介于两者之间。作为一个额外的优势,Pearson's 不在乎信号是否以不同的方式放大,(除非一个信号是另一个信号的倒数,它会给你一个 -1 的结果)。

这听起来像你要找的吗?

http://en.wikipedia.org/wiki/Pearson_product-moment_correlation_coefficient

于 2010-09-24T14:16:31.457 回答
0

我不知道信号处理,所以这是一个猜测..:

您的信号有效地是有序对的列表,(x,y)时间xy幅度在哪里?如果是这样,那么也许你可以扔掉时间坐标——例如:

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), ...]

或计算各种相关系数之一。

于 2009-08-13T23:03:17.090 回答