Estimating small time shift between two time series

后端 未结 6 1935
野性不改
野性不改 2021-01-30 23:04

I have two time series, and i suspect that there is a time shift between them, and i want to estimate this time shift.

This question has been asked before in: Find phase

6条回答
  •  春和景丽
    2021-01-30 23:47

    One of the links you provided has the right idea (in fact I am doing pretty much the same thing here)

    import numpy as np
    import matplotlib.pyplot as plt
    from scipy.signal import correlate
    
    a,b, N = 0, 10, 1000        #Boundaries, datapoints
    shift = -3                  #Shift, note 3/10 of L = b-a
    
    x = np.linspace(a,b,N)
    x1 = 1*x + shift
    time = np.arange(1-N,N)     #Theoritical definition, time is centered at 0
    
    y1 = sum([np.sin(2*np.pi*i*x/b) for i in range(1,5)])
    y2 = sum([np.sin(2*np.pi*i*x1/b) for i in range(1,5)])
    
    #Really only helps with large irregular data, try it
    # y1 -= y1.mean()
    # y2 -= y2.mean()
    # y1 /= y1.std()
    # y2 /= y2.std()
    
    cross_correlation = correlate(y1,y2)
    shift_calculated = time[cross_correlation.argmax()] *1.0* b/N
    y3 = sum([np.sin(2*np.pi*i*(x1-shift_calculated)/b) for i in range(1,5)])
    print "Preset shift: ", shift, "\nCalculated shift: ", shift_calculated
    
    
    
    plt.plot(x,y1)
    plt.plot(x,y2)
    plt.plot(x,y3)
    plt.legend(("Regular", "Shifted", "Recovered"))
    plt.savefig("SO_timeshift.png")
    plt.show()
    

    This has the following output:

    Preset shift:  -3
    Calculated shift:  -2.99
    

    enter image description here

    It might be necessary to check

    1. Scipy Correlate
    2. Time Delay Analaysis

    Note that the the argmax() of the correlation shows the position of the alignment, it has to be scaled by the length of b-a = 10-0 = 10 and N to get the actual value.

    Checking the source of correlate Source it is not entirely obvious what the imported function from sigtools behaves. For large datasets circular correlation (via Fast Fourier Transforms) is much faster than the straight-forward method. I suspect this is what is implemented in sigtools but I cannot tell for sure. A search for the file in my python2.7 folder only returned the compiled C pyd file.

提交回复
热议问题