使用互相关查找两个信号的时移

时间:2017-01-05 19:13:49

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

我有两个相互关联的信号,并且由两个不同的测量设备同时捕获。 由于两次测量不是时间同步的,因此我们想要计算它们之间的小时间延迟。另外,我需要知道哪个信号是主要信号。

可以假设以下内容:

  • 没有或只有非常少的噪音
  • 算法的速度不是问题,只是准确性和稳健性
  • 以高采样率(> 10kHz)捕获信号几秒钟
  • 预期时间延迟< 0.5秒

我为此目的使用 - 交叉相关。 任何有关如何在Python中实现它的建议都非常感激。

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

2 个答案:

答案 0 :(得分:3)

答案 1 :(得分:0)

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)

对于有噪声的信号,通常首先应用带通滤波器。对于谐波噪声,可以通过识别和消除频谱中存在的频率尖峰来消除。