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 last minima.
Then, I compute the FFT.
Code:
import numpy as np
from matplotlib import pyplot as plt
# The list of a periodic something
L = [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]
# Round because there is a slight variation around actually equals values: 2.762, 2.761 or 1.508, 1.507
L = [round(elt, 1) for elt in L]
minima = min(L)
min_id = L.index(minima)
start = L.index(minima)
stop = L[::-1].index(minima)
L = L[start:len(L)-stop]
fft = np.fft.fft(np.asarray(L))/len(L)
fft = fft[range(int(len(L)/2))]
plt.plot(abs(fft))
I know how much time I have between 2 points of my list (i.e. the sampling frequency, in this case 190 Hz). I thought that the fft should give me a spike at the value corresponding to the number of point in a period, , thus giving me the number of point and the period.
Yet, that is not at all the output I observed:
My current guess is that the spike at 0 corresponds to the mean of my signal and that this little spike around 7 should have been my period (although, the repeating pattern only includes 5 points).
What am I doing wrong? Thanks!
See Question&Answers more detail:
os