Numpy FFT 结果不符合预期

2 投票
2 回答
1708 浏览
提问于 2025-04-18 02:12

我使用了 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/)。

你现在做的两件事导致了奇怪的结果:

  1. 你在对真实数据进行复杂到复杂的快速傅里叶变换(FFT),这会让你的信号在奈奎斯特频率附近出现镜像(这叫做厄米对称)。

  2. 你在处理和绘制复杂的输出,而不是傅里叶的幅度或功率。(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)

fft

撰写回答