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
Your data is correct, it's just that you are not preprocessing it correctly:
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
.