通过互相关获得滞后?

时间:2016-09-05 19:38:58

标签: python numpy scipy signal-processing

让我们说有两个信号:

import numpy
dt = 0.001

t_steps = np.arange(0, 1, dt)
a_sig = np.sin(2*np.pi*t_steps*4+5)
b_sig = np.sin(2*np.pi*t_steps*4)

我想移动第一个信号以匹配第二个信号。我知道这可以使用互相关来完成,正如Matlab所证明的那样,但我如何用SciPy实现这一点。

2 个答案:

答案 0 :(得分:8)

this Wikipedia article中所定义,信号之间的滞后由互相关的argmax给出。因此,以下代码会将b_sig移至a_sig阶段,以最大限度地减少错误。

from scipy.signal import correlate

lag = np.argmax(correlate(a_sig, b_sig))
c_sig = np.roll(b_sig, shift=int(np.ceil(lag)))

答案 1 :(得分:1)

请先查看一些示例。假设我们已经在单元测试课中。

# Autocorrelation.
y1 = [1, 1, 0, 0, 1, -1, -1]
corr, lag = util.cross_corr(y1, y1)
self.assertEqual(lag, 0)

y1 = [1, 1, 0 ,1, -1, -1]
y2 = [1, 0, 1, 0, 0, 2]
corr, lag = util.cross_corr(y1, y2)
self.assertEqual(lag, -2)

这是我的代码。

def cross_corr(y1, y2):
  """Calculates the cross correlation and lags without normalization.

  The definition of the discrete cross correlation is in:
  https://www.mathworks.com/help/matlab/ref/xcorr.html

  Args:
    y1, y2: Should have the same length.

  Returns:
    max_corr: Maximum correlation without normalization.
    lag: The lag in terms of the index.
  """
  if len(y1) != len(y2):
    raise ValueError('The lengths of the inputs should be the same.')

  y1_auto_corr = np.dot(y1, y1) / len(y1)
  y2_auto_corr = np.dot(y2, y2) / len(y1)
  corr = correlate(y1, y2, mode='same')
  # The unbiased sample size is N - lag.
  unbiased_sample_size = correlate(
      np.ones(len(y1)), np.ones(len(y1)), mode='same')
  corr = corr / unbiased_sample_size / np.sqrt(y1_auto_corr * y2_auto_corr)
  shift = len(y1) // 2

  max_corr = np.max(corr)
  argmax_corr = np.argmax(corr)
  return max_corr, argmax_corr - shift