Matplotlib 如何正确绘制信号的FFT频谱

Matplotlib 如何正确绘制信号的FFT频谱

在本文中,我们将介绍如何使用Matplotlib在Python中绘制信号的FFT频谱,并确保其正确地标记频率。

阅读更多:Matplotlib 教程

什么是FFT?

快速傅里叶变换(FFT)是一种将时间域信号转换为频域信号的方法。它将信号分解成一系列频率成分,并显示它们的幅度和相位。FFT广泛用于信号处理、音频处理和图像处理中。

使用Matplotlib绘制FFT图形

首先,我们需要导入numpy和matplotlib库:

import numpy as np
import matplotlib.pyplot as plt
Python

接下来,我们需要创建一个示例信号。在这个例子中,我们使用一个包含两个不同频率的正弦波的信号:

Fs = 1000  # 采样率
t = np.arange(0, 1, 1.0/Fs)  # 时间轴
f1, f2 = 50, 120  # 两个不同的频率
x = np.sin(2*np.pi*f1*t) + 0.5*np.sin(2*np.pi*f2*t)
Python

然后,我们需要应用FFT函数来计算信号的频谱:

X = np.fft.fft(x)  # 使用FFT函数计算频谱
Python

最后,我们可以使用Matplotlib来绘制FFT图形:

fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(8, 6))
ax1.plot(t, x)
ax1.set_xlabel('时间 (秒)')
ax1.set_ylabel('幅度')
f1, f2 = np.abs(np.fft.fftfreq(x.size, t[1]-t[0])[:x.size//2])
X_mag = np.abs(X)[:x.size//2] / x.size * 2  # 去除直流分量
ax2.plot(f1, X_mag)
ax2.set_xlabel('频率 (Hz)')
ax2.set_ylabel('幅度')
plt.show()
Python

这将显示一个包含两个子图的图形,其中第一个子图包含原始信号的时域图形,第二个子图包含该信号的FFT频谱。

如何正确标记FFT图形的频率?

通常,Matplotlib将x轴标记为与索引(也称为bins)相关的数值,而对于FFT频谱,这些数字代表频率的bin数。 然而,我们希望x轴标记显示实际的频率值。为此,我们需要使用numpy中的fftfreq函数来计算实际频率值,并将其用作x轴标记。

f1, f2 = np.abs(np.fft.fftfreq(x.size, t[1]-t[0])[:x.size//2])
Python

此函数需要两个参数:FFT信号的大小(即x.size)和采样周期的大小(即t[1]-t[0],在这种情况下为0.001秒)。 这将返回一个具有FFT信号中所有正频率值的Numpy数组。 使用np.abs函数只需取正值,并使用[:x.size//2]来去除负频率和直流分量。

总结

在本文中,我们介绍了如何使用Matplotlib在Python中绘制信号的FFT频谱,并确保正确标记频率。我们只需要使用numpy.fft.fft函数来计算FFT,然后使用numpy.fft.fftfreq函数计算实际的频率值,并将其用作x轴标记。 有了这些工具,我们现在能够更轻松地分析和可视化信号的频率成分。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册