回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我有一个周期信号,我想找出周期。
<a href="https://i.stack.imgur.com/OG5ZM.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/OG5ZM.png" alt="Raw signal"/></a></p>
<p>由于存在边界效应,我首先去掉边界,通过观察第一个和最后一个极小值保持N个周期。在</p>
<p><a href="https://i.stack.imgur.com/47LJc.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/47LJc.png" alt="Signal"/></a></p>
<p>然后,计算FFT。在</p>
<p>代码:</p>
<pre><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))
</code></pre>
<p>我知道在列表的2个点之间有多少时间(即采样频率,在本例中为190赫兹)。我认为fft应该给我一个峰值,对应于一个周期内的点数,从而得到点数和周期。
然而,这根本不是我观察到的结果:</p>
<p><a href="https://i.stack.imgur.com/ixgGj.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/ixgGj.png" alt="FFT"/></a></p>
<p>我目前的猜测是0处的峰值对应于我信号的平均值,7左右的这个小峰值应该是我的周期(尽管,重复模式只包括5个点)。在</p>
<p>我做错什么了?谢谢!在</p>