如何使用FFT找到方波的频率

时间:2016-07-22 12:20:54

标签: python numpy scipy fft

在FFT(第二)图中,与其他频率相比,我期望在频率= 1.0时有更大的峰值,因为它是以5Hz采样的1 Hz方波信号。

我是初学者,可能在这里遗漏了一些傻事 这就是我所做的:

import numpy as np
from matplotlib import pyplot as plt
from scipy import signal
t500 = np.linspace(0,5,500,endpoint=False)
s1t500 = signal.square(2*np.pi*1.0*t500)

第一幅图显示1 Hz方波在5Hz下采样5秒:

t5 = np.linspace(0,5,25,endpoint=False)
t5 = t5 + 1e-14
s1t5 = signal.square(2.0*np.pi*1.0*t5)
plt.ylim(-2,2); plt.plot(t500,s1t500,'k',t5,s1t5,'b',t5,s1t5,'bo'); plt.show()

1 Hz Square Wave sampled at 5Hz

在第二个图中,我预计f = 1 Hz时的幅度大于f = 2时的幅度。我错过了什么吗?

y1t5 = np.fft.fft(s1t5)
ff1t5 = np.fft.fftfreq(25,d=0.2)
plt.plot(ff1t5,y1t5); plt.show()

FFT for 1 Hz Square Wave sampled at 5Hz

1 个答案:

答案 0 :(得分:4)

似乎你错过了傅里叶变换在复杂空间中产生函数(或DFT / FFT中的数字序列)这一事实:

>>> np.fft.fft(s1t5)
[ 5. +0.j          0. +0.j          0. +0.j          0. +0.j          0. +0.j
  5.-15.38841769j  0. +0.j          0. +0.j          0. +0.j          0. +0.j
  5. +3.63271264j  0. +0.j          0. +0.j          0. +0.j          0. +0.j
# and so on

要查看地块上的振幅频谱,请应用np.absoluteabs

>>> np.absolute(np.fft.fft(s1t5))
[  5.           0.           0.           0.           0.          16.18033989
   0.           0.           0.           0.           6.18033989   0.           0.
   0.           0.           6.18033989   0.           0.           0.           0.
   16.18033989  0.           0.           0.           0.        ]

否则只显示实部。