【问题标题】:Algorithm to Match Time Dependent (1D) Signals匹配时间相关 (1D) 信号的算法
【发布时间】:2010-11-19 11:35:36
【问题描述】:

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

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

【问题讨论】:

    标签: algorithm statistics signal-processing signals


    【解决方案1】:

    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称为滞后域。

    如果x1x2 通过时间偏移相关,则互相关函数将在与偏移对应的滞后处达到峰值。例如,如果您有x1 = sin[wn]x2 = sin[wn + phi],那么两个频率相同但相位不同的正弦波,则互相关函数的峰值将在相移对应的滞后处达到。

    如果x2x1 的缩放版本,则互相关也将缩放。您可以通过除以sqrt(sum(x1^2)*sum(x2^2))将函数归一化为相关系数,并通过取绝对值将其带入0..1(Matlab的那一行有这些操作)。

    更一般地说,以下是互相关的好/坏的摘要。

    互相关适用于确定一个信号是否与另一个信号线性相关,即 if
    x2(t) = sum{n = 0..K-1}(A_n * x1(t + phi_n))
    其中x1(t)x2(t) 是有问题的信号,A_n 是比例因子,phi_n 是时间偏移。这意味着:

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

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

    对于x1x2 是周期性的特殊情况,答案的原始部分中的相移信息适用。

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

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

    【讨论】:

    • 这个问题并不完全清楚,但如果 oort 想要测量形状相同性(而不是同相性),那么互相关不是最优的:给定一个基本信号s_b 和两个测试信号 t_1、t_2,不太适合判断哪个测试信号最像基础信号。
    • 我正在寻找一种可以衡量形状相同度的函数。什么更适合?
    • @oort:看看我的答案有几个选择。这些比互相关更复杂,但它们确实直接涉及形状相似性问题。
    • 熵与互相关有什么好处吗?
    【解决方案2】:

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

    这听起来像你要找的吗?

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

    【讨论】:

      【解决方案3】:

      Dynamic Time Warping 是一种您可以使用的方法,如果应该通过在不同位置加快和减慢时间来匹配信号。

      【讨论】:

        【解决方案4】:

        一般解决方案:您可以将数据分箱成直方图,并使用卡方检验或 Kolomogrov 检验。

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

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

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


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

        【讨论】:

          【解决方案5】:

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

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

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

          【讨论】:

          • 对某些类型的输入来说这不是一个坏建议,但实际上你给 OP 留下了同样的问题:两者与光谱的比较。
          • dmckee:除了傅立叶变换后的信号可以逐点进行比较而没有移位。顺便说一句,“光谱”是原始信号的错误术语,因为这意味着 x 轴上的能量(或等效度量)。
          【解决方案6】:

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

          您的信号实际上是一个有序对列表(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。或许你可以针对z 绘制y

          Comparing: [(y0,z0), (y1,z1), (y2,z2), (y3,z3), ...]
          

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

          【讨论】:

            猜你喜欢
            • 2019-04-17
            • 2011-09-02
            • 2017-06-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-11-04
            • 2019-09-12
            相关资源
            最近更新 更多