【问题标题】:Find time shift of two signals using cross correlation使用互相关查找两个信号的时移
【发布时间】:2017-05-20 11:01:46
【问题描述】:

我有两个相互关联的信号,它们同时被两个不同的测量设备捕获。 由于这两个测量值不是时间同步的,因此我想计算它们之间的一小段时间延迟。此外,我需要知道哪个信号是领先的。

可以假设如下:

  • 不存在或仅存在非常少的噪音
  • 算法的速度不是问题,只有准确性和鲁棒性
  • 以高采样率 (>10 kHz) 捕获信号数秒
  • 预计时间延迟

我想为此目的使用交叉相关。 非常感谢任何关于如何在 Python 中实现它的建议。

如果我应该提供更多信息以便找到最合适的算法,请告诉我。

【问题讨论】:

  • 也许你会在这里得到更好的支持:dsp.stackexchange.com
  • @ppasler 感谢您的提示,但我对算法和可用的 Python 代码而不是信号处理理论更感兴趣。
  • 我让syncstart 使用基于 fft 的开始相关性同步两个录音。

标签: python python-2.7 signal-processing lag cross-correlation


【解决方案1】:

A popular approach:时移是最大互相关系数对应的滞后。下面是一个例子:

import matplotlib.pyplot as plt
from scipy import signal
import numpy as np


def lag_finder(y1, y2, sr):
    n = len(y1)

    corr = signal.correlate(y2, y1, mode='same') / np.sqrt(signal.correlate(y1, y1, mode='same')[int(n/2)] * signal.correlate(y2, y2, mode='same')[int(n/2)])

    delay_arr = np.linspace(-0.5*n/sr, 0.5*n/sr, n)
    delay = delay_arr[np.argmax(corr)]
    print('y2 is ' + str(delay) + ' behind y1')

    plt.figure()
    plt.plot(delay_arr, corr)
    plt.title('Lag: ' + str(np.round(delay, 3)) + ' s')
    plt.xlabel('Lag')
    plt.ylabel('Correlation coeff')
    plt.show()

# Sine sample with some noise and copy to y1 and y2 with a 1-second lag
sr = 1024
y = np.linspace(0, 2*np.pi, sr)
y = np.tile(np.sin(y), 5)
y += np.random.normal(0, 5, y.shape)
y1 = y[sr:4*sr]
y2 = y[:3*sr]

lag_finder(y1, y2, sr)

在噪声信号的情况下,通常首先应用带通滤波器。在谐波噪声的情况下,可以通过识别和去除频谱中存在的频率尖峰来去除它们。

【讨论】:

  • 变量sr是什么?
  • @connor449 sampling rate
  • 谢谢。我每秒有 125 次观察,那么我应该将 sr 设置为 125 吗?
【解决方案2】:

Numpy 具有满足您需求的函数correlatehttps://docs.scipy.org/doc/numpy/reference/generated/numpy.correlate.html

【讨论】:

  • 感谢您的提示。我决定使用如下所示的下坡单纯形算法:Estimating small time shift between two time series
  • @Rickson 您可以发布带有代码示例的解决方案并接受该答案。
  • 上述链接中@Hooked提供的代码我基本都用过了。
猜你喜欢
  • 2014-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-04
  • 2010-11-20
  • 2019-04-17
相关资源
最近更新 更多