如何在matplotlib中将正弦波的FFT居中?

信息处理 fft Python 麻木的
2022-02-02 08:28:58

我想使用 matplotlib 绘制正弦波的 FFT,并且我想在正弦波所属的频率处绘制一条线。

这是我的代码

import numpy as np
import matplotlib.pyplot as plt


f = 3
t = np.arange(-np.pi, np.pi, 0.01)
y = np.sin(2*np.pi*f*t)


plt.subplot(2, 1, 1)
plt.plot(t, y)


ft = np.fft.fft(y)

plt.subplot(2, 1, 2)
plt.plot(ft.real)

plt.show()

而且,这是上述代码的输出。

快速傅里叶变换

我想将 FFT 绘制为一条线,这条线将在给定的正弦波频率处笔直向上。假设,如果我将两个 20Hz 和 40Hz 的正弦波加在一起,sine(2*pi*20*t) + sine(2*pi*40*t)那么它们的 FFT 应该在 20Hz 和 30Hz 处有两条直线。

如何修复我的代码以获得我想要的?我在 StackOverflow 上看到了很多问题,但我不明白。任何帮助,将不胜感激。

1个回答

你有两个峰,因为它是正确的结果。傅里叶变换用一系列复指数函数而不是(实)正弦函数分解信号。单频正弦波可以写成

sin(ω0t)=exp(jω0t)exp(jω0t)2j
因此,两个峰值代表正频率的幅度ω0和负频率ω0, 分别。如果您只需要正频率分量,只需将负结果丢弃为

ft = np.fft.fft(y)[:nfft//2]

其中是 FFT 大小,如果未指定nfft,则等于长度。y