在 Python 中绘制快速傅立叶变换(FFT)

Shivam Arora 2023年1月30日 2021年10月2日
  1. 使用 Python scipy.fft 模块进行快速傅立叶变换
  2. 使用 Python numpy.fft 模块进行快速傅立叶变换
在 Python 中绘制快速傅立叶变换(FFT)

在这篇 Python 教程文章中,我们将了解快速傅立叶变换并在 Python 中绘制它。

傅里叶分析将函数作为周期性分量的集合并从这些分量中提取这些信号。当函数及其变换都与离散部分交换时,则表示为傅立叶变换。

FFT 主要与计算算法一起工作以提高执行速度。滤波算法、乘法、图像处理是它的一些应用。

使用 Python scipy.fft 模块进行快速傅立叶变换

在快速傅立叶变换中要衡量的最重要的一点之一是我们只能将其应用于时间戳一致的数据。scipy.fft 模块将给定的时域转换为频域。长度为 N 序列 x[n] 的 FFT 由 fft() 函数计算。

例如,

from scipy.fftpack import fft  
import numpy as np  
x = np.array([4.0, 2.0, 1.0, -3.0, 1.5])  
y = fft(x)  
print(y)  

输出:

[5.5       -0.j         6.69959347-2.82666927j 0.55040653+3.51033344j
 0.55040653-3.51033344j 6.69959347+2.82666927j]

我们还可以使用噪声信号,因为它们需要大量计算。例如,我们可以使用 numpy.sin() 函数来创建一个正弦序列并绘制它。为了绘制系列,我们将使用 Matplotlib 模块。

请参考以下示例。

import scipy.fft
import matplotlib.pyplot as plt
import numpy as np


N = 500
T = 1.0 / 600.0
x = np.linspace(0.0, N*T, N)
y = np.sin(60.0 * 2.0*np.pi*x) + 0.5*np.sin(90.0 * 2.0*np.pi*x)
y_f = scipy.fft.fft(y)
x_f = np.linspace(0.0, 1.0/(2.0*T), N//2)

plt.plot(x_f, 2.0/N * np.abs(y_f[:N//2]))
plt.show()

python scipy fft 示例

请注意,scipy.fft 模块建立在 scipy.fftpack 模块之上,具有更多附加功能和更新的功能。

使用 Python numpy.fft 模块进行快速傅立叶变换

numpy.fft 的工作原理类似于 scipy.fft 模块。scipy.fftnumpy.fft 导出一些功能。

处理二维数组时,numpy.fft 被认为更快。实现是一样的。

例如,

import matplotlib.pyplot as plt
import numpy as np

N = 500
T = 1.0 / 600.0
x = np.linspace(0.0, N*T, N)
y = np.sin(60.0 * 2.0*np.pi*x) + 0.5*np.sin(90.0 * 2.0*np.pi*x)
y_f = np.fft.fft(y)
x_f = np.linspace(0.0, 1.0/(2.0*T), N//2)

plt.plot(x_f, 2.0/N * np.abs(y_f[:N//2]))
plt.show()

python numpy fft 示例