How to use the cross-spectral density to calculate the phase shift of two related signals

前端 未结 3 582
一个人的身影
一个人的身影 2021-02-01 08:54

I\'ve two signals, from which I expect that one is responding on the other, but with a certain phase shift.

Now I would like to calculate the coherence or the normalize

3条回答
  •  梦谈多话
    2021-02-01 09:19

    I am not sure, where the phase variable was calculated in the answer of @Mattijn.

    You can calculate the phase shift from the angle between the real and the imaginary part of the cross-spectral density.

    from matplotlib import mlab
    
    # First create power sectral densities for normalization
    (ps1, f) = mlab.psd(s1, Fs=1./dt, scale_by_freq=False)
    (ps2, f) = mlab.psd(s2, Fs=1./dt, scale_by_freq=False)
    plt.plot(f, ps1)
    plt.plot(f, ps2)
    
    # Then calculate cross spectral density
    (csd, f) = mlab.csd(s1, s2, NFFT=256, Fs=1./dt,sides='default', scale_by_freq=False)
    fig = plt.figure()
    ax1 = fig.add_subplot(1, 2, 1)
    # Normalize cross spectral absolute values by auto power spectral density
    ax1.plot(f, np.absolute(csd)**2 / (ps1 * ps2))
    ax2 = fig.add_subplot(1, 2, 2)
    angle = np.angle(csd, deg=True)
    angle[angle<-90] += 360
    ax2.plot(f, angle)
    
    # zoom in on frequency with maximum coherence
    ax1.set_xlim(9, 11)
    ax1.set_ylim(0, 1e-0)
    ax1.set_title("Cross spectral density: Coherence")
    ax2.set_xlim(9, 11)
    ax2.set_ylim(0, 90)
    ax2.set_title("Cross spectral density: Phase angle")
    
    plt.show()
    
    fig = plt.figure()
    ax = plt.subplot(111)
    
    ax.plot(f, np.real(csd), label='real')
    ax.plot(f, np.imag(csd), label='imag')
    
    ax.legend()
    plt.show()
    

    The power spectral density of the two signals to be correlated: The power spectral density of the two signals to be correlated

    The coherence and the phase of the two signals (zoomed in to 10 Hz): The coherence and the phase of the two signals (zoomed in to 10 Hz)

    And here the real and imaginary(!) part of the cross spectral density: real and imaginary part of the cross spectral density

提交回复
热议问题