Numpy FFT 结果不符合预期
我使用了 fft.fft(data)
这个函数,并把结果画出来,原本我期待能看到我在数据中给出的频率。
我本来想看到50赫兹的结果,但却得到了奇怪的东西。
import numpy as np
import math as m
import matplotlib.pyplot as plt
data=[]
for x in range(1000):
data.append(m.sin(2*m.pi*50*0.001*x))
plt.plot(np.fft.fft(data)/len(data))
plt.show()
我该怎么做才能看到50赫兹的结果呢?
非常感谢!
2 个回答
0
这个问题其实更适合去DSP的问答网站提问(https://dsp.stackexchange.com/)。
你现在做的两件事导致了奇怪的结果:
你在对真实数据进行复杂到复杂的快速傅里叶变换(FFT),这会让你的信号在奈奎斯特频率附近出现镜像(这叫做厄米对称)。
你在处理和绘制复杂的输出,而不是傅里叶的幅度或功率。(Matplotlib不太能处理复杂数,所以显示出来的效果很糟糕。)
试试这个方法:
plt.plot(abs(np.fft.rfft(data))/(len(data)/2))
4
你需要在你的图表中指定x轴。
首先,创建数据:
import numpy as np
import matplotlib.pyplot as plt
t = np.linspace(0, 1, 1000)
data = np.sin(2*np.pi*50*t)
接下来,获取频率:
f = np.fft.fftfreq(len(data), t[1]-t[0]) # length of data, and dt
然后绘制fft的幅度和频率的关系图:
data_fft = np.abs(np.fft.fft(data)) / len(data)
plt.plot(f, data_fft)