Find time shift of two signals using cross correlation

后端 未结 2 965
孤街浪徒
孤街浪徒 2021-01-02 23:18

I have two signals which are related to each other and have been captured by two different measurement devices simultaneously. Since the two measurements are not time synchr

2条回答
  •  悲哀的现实
    2021-01-03 00:08

    A popular approach: timeshift is the lag corresponding to the maximum cross-correlation coefficient. Here is how it works with an example:

    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)
    

    In the case of noisy signals, it is common to apply band-pass filters first. In the case of harmonic noise, they can be removed by identifying and removing frequency spikes present in the frequency spectrum.

提交回复
热议问题