Scipy 快速傅里叶变换 (FFT)
SciPy 中的 快速傅里叶变换 (FFT) 是一种强大的算法,旨在高效计算 离散傅里叶变换 (DFT) 及其逆变换,与标准 DFT 相比,大幅降低了计算成本。
这使得信号能够在时域和频域之间进行转换,从而支持各种类型的信号和数据分析。
SciPy 中的快速傅里叶变换
SciPy 的 scipy.fft 模块提供了一系列函数,用于执行一维、二维甚至多维 FFT。主要函数 scipy.fft.fft 用于计算输入数组的一维 FFT,而 scipy.fft.ifft 通过将频域数据转换回时域来计算 逆 FFT。
对于由实数组成的数据集,我们可以使用 scipy.fft.rfft 和 scipy.fft.irfft,这些是优化的版本,仅处理正频率,从而减少计算时间和内存使用。
对于更复杂的数据,诸如 scipy.fft.fftn 和 scipy.fft.ifftn 等函数将这些功能扩展到多维数组,这在图像处理等任务中特别有用。
SciPy 的 FFT 函数还提供了灵活性,支持归一化、轴指定和零填充等功能。此外,scipy.fft.fftshift 和 scipy.fft.ifftshift 可用于将零频分量移到中心或移回边缘,从而有助于频谱可视化。
快速傅里叶变换(FFT)的关键特性
这些特性使 FFT 成为信号处理、图像分析和音频处理等多种应用中的一种多功能且强大的工具。以下是快速傅里叶变换(FFT)的关键特性 −
- 效率: FFT 通过将离散傅里叶变换 (DFT) 的计算复杂度从 O(N)2 显著降低到 O(N log N),从而使处理大型数据集的速度大大提高。
- 信号分析: FFT 将时域信号转换为频域表示,从而能够分析信号中不同的频率分量。
- 逆 FFT (IFFT): 逆 FFT 函数可以从频域分量重建原始时域信号。
- 支持实数和复数输入: FFT 可以处理实数值和复数值数据。针对实数值输入的专用版本如 rfft 进一步优化了性能。
- 多维 FFT: fftn 和 ifftn 等函数允许将 FFT 应用于多维数据(如图像或体数据),使其在图像和 3D 数据分析中非常有用。
- 零填充和截断: 零填充用于提高频率谱的分辨率,而截断可用于减少包含大量零的信号的计算成本。
- 频率移位: fftshift 和 ifftshift 等函数将零频分量移到频谱中心或移回,从而便于更好地可视化频率谱。
- 归一化选项: 多种归一化选项确保根据不同约定对 FFT 结果进行准确缩放。
示例 1
以下是一个使用 SciPy 计算信号的一维快速傅里叶变换 (FFT) 并进行可视化的简单示例 −
import numpy as np
from scipy.fft import fft, ifft
import matplotlib.pyplot as plt
# 创建一个示例信号
N = 600 # 采样点数
T = 1.0 / 800.0 # 采样间隔
x = np.linspace(0.0, N*T, N, endpoint=False)
# 创建由两种不同频率组成的信号
y = np.sin(50.0 * 2.0*np.pi*x) + 0.5*np.sin(80.0 * 2.0*np.pi*x)
# 计算 FFT
yf = fft(y)
# 计算对应的频率
xf = np.fft.fftfreq(N, T)[:N//2]
# 绘制原始信号
plt.figure(figsize=(12, 6))
plt.subplot(2, 1, 1)
plt.plot(x, y)
plt.title("Original Signal")
plt.xlabel("Time (s)")
plt.ylabel("Amplitude")
# 绘制 FFT (幅度谱)
plt.subplot(2, 1, 2)
plt.plot(xf, 2.0/N * np.abs(yf[:N//2]))
plt.title("FFT - Magnitude Spectrum")
plt.xlabel("Frequency (Hz)")
plt.ylabel("Magnitude")
plt.tight_layout()
plt.show()
以下是一维快速傅里叶变换(FFT)的输出 −
示例 2
以下是一个使用 SciPy 执行二维快速傅里叶变换 (2D FFT) 的简单示例。此示例展示了如何将 2D 图像或任何 2D 数组转换为频域,然后使用逆 2D FFT 转换回空间域 −
import numpy as np
import matplotlib.pyplot as plt
from scipy.fft import fft2, ifft2, fftshift
# 创建一个示例 2D 数组 (图像)
image = np.zeros((256, 256))
image[100:150, 100:150] = 255 # 在中间创建一个白色方块
# 计算 2D FFT
fft_image = fft2(image)
# 将零频分量移到频谱中心
fft_image_shifted = fftshift(fft_image)
# 计算幅度谱
magnitude_spectrum = np.abs(fft_image_shifted)
# 逆 2D FFT 重建原始图像
reconstructed_image = ifft2(fft_image).real
# 绘制原始图像、幅度谱和重建图像
plt.figure(figsize=(12, 4))
# 原始图像
plt.subplot(1, 3, 1)
plt.title("Original Image")
plt.imshow(image, cmap='gray')
plt.axis('off')
# 幅度谱
plt.subplot(1, 3, 2)
plt.title("Magnitude Spectrum")
plt.imshow(np.log(magnitude_spectrum + 1), cmap='gray')
plt.axis('off')
# 重建图像
plt.subplot(1, 3, 3)
plt.title("Reconstructed Image")
plt.imshow(reconstructed_image, cmap='gray')
plt.axis('off')
plt.show()
以下是二维快速傅里叶变换(FFT)的输出 −

FFT 的应用
SciPy 中的 Fast Fourier Transform (FFT) 由于其能够高效地将时域信号转换为频域表示,因此在各个领域具有广泛的应用。以下是 FFT 的几个关键应用 −
- 信号处理: FFT 用于分析信号的频率内容、检测模式、滤除噪声并设计数字滤波器。它在电信、音频信号处理和雷达信号分析中至关重要。
- 图像处理: FFT 通过将图像转换为频域来帮助图像滤波、增强和压缩,从而实现高通和低通滤波等操作。
- 音频分析: FFT 用于音高检测、声音合成和音乐分析。它有助于从音频信号中提取频谱内容和节奏等特征。
- 振动分析: 在机械工程中,FFT 用于分析机器的振动数据,以识别故障并预测维护需求。
- 医学成像: FFT 用于 MRI 和其他成像技术,从原始数据重建图像、提高分辨率并滤除噪声。
- 天文学: FFT 用于分析天文信号的频率谱,帮助检测和表征天体。