Find period of a signal out of the FFT

后端 未结 3 1046
感情败类
感情败类 2021-01-06 16:03

I have a periodic signal I would like to find the period.

Since there is border effect, I first cut out the border and keep N periods by looking at the first and la

3条回答
  •  北荒
    北荒 (楼主)
    2021-01-06 16:54

    Your data is correct, it's just that you are not preprocessing it correctly:

    1. The first giant peak is the DC/average value of your signal. If you subtracted it before taking the DFT, it would disappear
    2. Not windowing the signal before taking the DFT will produce ringing in the DFT spectrum, lowering the peaks and raising the "non-peaks".

    If you include these two steps, the result should be more as you expect:

    import numpy as np
    import scipy.signal
    
    from matplotlib import pyplot as plt
    
    L = np.array([2.762, 2.762, 1.508, 2.758, 2.765, 2.765, 2.761, 1.507, 2.757, 2.757, 2.764, 2.764, 1.512, 2.76, 2.766, 2.766, 2.763, 1.51, 2.759, 2.759, 2.765, 2.765, 1.514, 2.761, 2.758, 2.758, 2.764, 1.513, 2.76, 2.76, 2.757, 2.757, 1.508, 2.763, 2.759, 2.759, 2.766, 1.517, 4.012])
    L = np.round(L, 1)
    # Remove DC component
    L -= np.mean(L)
    # Window signal
    L *= scipy.signal.windows.hann(len(L))
    
    fft = np.fft.rfft(L, norm="ortho")
    
    plt.plot(L)
    plt.figure()
    plt.plot(abs(fft))
    

    You will note that you will see a peak at around 8, and another one at twice that, 16. This is also expected: A periodic signal is always periodic after n*period samples, where n is any natural number. In your case: n*8.

提交回复
热议问题