Get lag with cross-correlation?

前端 未结 1 969
再見小時候
再見小時候 2020-12-29 15:34

Let\'s say have have two signals:

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         


        
相关标签:
1条回答
  • 2020-12-29 15:48

    See some examples first. Assume we are in unit tests class already.

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

    here is my code.

    import numpy as np    
    
    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 = np.correlate(y1, y2, mode='same')
      # The unbiased sample size is N - lag.
      unbiased_sample_size = np.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
    
    0 讨论(0)
提交回复
热议问题