考虑正弦波单个周期的 FFT:
>>> t = np.linspace(0, 2*np.pi, 100)
>>> x = np.sin(t)
>>> f = np.fft.rfft(x)
>>> np.round(np.abs(f), 0)
array([ 0., 50., 1., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0.])
FFT 返回一个复数数组,给出频率的幅度和相位。假设您只对幅度感兴趣,我习惯于np.abs
获取每个频率的幅度,并使用 将其四舍五入为最接近的整数np.round(__, 0)
。您可以在索引处看到尖峰,1
表明发现了一个周期等于样本数的正弦波。
现在让波浪更复杂一点
>>> x = np.sin(t) + np.sin(3*t) + np.sin(5*t)
>>> f = np.fft.rfft(x)
>>> np.round(np.abs(f), 0)
array([ 0., 50., 1., 50., 0., 48., 4., 2., 2., 1., 1.,
1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 0.,
0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0.])
我们现在看到与我们的输入相对应的指标 1、3 和 5 处的尖峰。n
周期为和n/3
的正弦波n/5
(其中 n 为输入样本数)。
编辑
这是傅里叶变换的一个很好的概念解释:http: //betterexplained.com/articles/an-interactive-guide-to-the-fourier-transform/