上一篇
NumPy FFT 使用教程 - Python快速傅里叶变换指南 | 技术博客
- Python
- 2025-07-29
- 1239
NumPy FFT 使用教程
Python中快速傅里叶变换的完整指南
什么是快速傅里叶变换(FFT)?
快速傅里叶变换(Fast Fourier Transform, FFT)是一种高效计算离散傅里叶变换(DFT)的算法,用于将信号从时域转换到频域。
NumPy中的numpy.fft
模块提供了一系列FFT函数,可以高效地处理一维和多维数组。
FFT的主要应用
- 信号处理与分析
- 图像处理与滤波
- 音频处理与频谱分析
- 数据压缩
- 求解偏微分方程
为什么使用NumPy FFT?
- 高性能计算(基于FFTPACK)
- 简单易用的API
- 与NumPy数组无缝集成
- 支持多维变换
- 丰富的辅助函数
NumPy FFT 核心函数
函数 | 描述 | 常用参数 |
---|---|---|
fft.fft() |
计算一维离散傅里叶变换 | a: 输入数组, n: 输出长度 |
fft.ifft() |
计算一维离散傅里叶逆变换 | a: 输入数组, n: 输出长度 |
fft.fft2() |
计算二维离散傅里叶变换 | a: 输入数组, s: 输出形状 |
fft.ifft2() |
计算二维离散傅里叶逆变换 | a: 输入数组, s: 输出形状 |
fft.fftfreq() |
生成傅里叶变换的频率采样 | n: 窗口长度, d: 采样间隔 |
fft.fftshift() |
将零频率分量移到频谱中心 | x: 输入数组 |
基本使用步骤
- 导入NumPy库:
import numpy as np
- 准备输入信号数据(一维或多维数组)
- 使用
np.fft.fft()
进行傅里叶变换 - 使用
np.fft.fftshift()
将零频移到中心(可选) - 使用
np.fft.fftfreq()
获取频率轴 - 计算幅度谱:
np.abs(fft_result)
- 使用
np.fft.ifft()
进行逆变换恢复信号
FFT 交互式演示
信号参数
200 Hz
10 Hz
0.5
信号说明
当前信号由以下分量组成:
- 主频率: 10 Hz
- 二次谐波: 20 Hz
- 随机噪声
信号公式:
y = sin(2π·f·t) + 0.5·sin(2π·2f·t) + noise
时域信号
频域信号 (FFT结果)
代码示例
示例1:基本FFT变换
import numpy as np import matplotlib.pyplot as plt # 信号参数 sample_rate = 200 # 采样频率 (Hz) duration = 1 # 信号持续时间 (秒) freq = 10 # 信号频率 (Hz) # 生成时间序列 t = np.linspace(0, duration, int(sample_rate * duration), endpoint=False) # 生成信号 (10Hz正弦波 + 20Hz谐波 + 噪声) signal = np.sin(2 * np.pi * freq * t) + 0.5 * np.sin(2 * np.pi * 2 * freq * t) signal += 0.4 * np.random.normal(size=len(t)) # 执行FFT fft_result = np.fft.fft(signal) # 计算频率轴 freqs = np.fft.fftfreq(len(signal), 1/sample_rate) # 将零频移到中心 fft_shifted = np.fft.fftshift(fft_result) freqs_shifted = np.fft.fftshift(freqs) # 计算幅度谱 magnitude = np.abs(fft_shifted) # 绘制结果 plt.figure(figsize=(12, 6)) plt.subplot(2, 1, 1) plt.plot(t, signal) plt.title("时域信号") plt.xlabel("时间 (s)") plt.subplot(2, 1, 2) plt.plot(freqs_shifted, magnitude) plt.title("频域信号 (FFT)") plt.xlabel("频率 (Hz)") plt.xlim(-50, 50) plt.tight_layout() plt.show()
示例2:FFT逆变换
# 从FFT结果重建信号 reconstructed = np.fft.ifft(fft_result) # 绘制原始信号和重建信号 plt.figure(figsize=(10, 6)) plt.plot(t, signal, 'b-', label="原始信号") plt.plot(t, reconstructed.real, 'r--', label="重建信号", alpha=0.7) plt.title("FFT逆变换信号重建") plt.xlabel("时间 (s)") plt.legend() plt.show() # 计算重建误差 error = np.max(np.abs(signal - reconstructed.real)) print(f"最大重建误差: {error:.6f}")
实际应用案例
音频处理
使用FFT分析音频频谱,实现:
- 音调识别
- 均衡器设计
- 降噪处理
- 音频特征提取
图像处理
二维FFT用于图像处理:
- 频域滤波
- 图像压缩
- 模糊检测
- 水印嵌入
信号分析
FFT在工程领域的应用:
- 振动分析
- 通信系统
- 脑电波分析
- 故障诊断
最佳实践建议
- 数据长度选择:使用2的幂次长度(如1024、2048)可提高计算效率
- 零填充:使用
n
参数增加数据长度以提高频率分辨率 - 频谱泄漏:应用窗函数(汉宁窗、汉明窗)减少边界效应
- 实数FFT:对实数信号使用
np.fft.rfft()
可节省计算资源 - 幅度归一化:根据应用需求考虑是否对幅度进行归一化
本文由MurongLin于2025-07-29发表在吾爱品聚,如有疑问,请联系我们。
本文链接:https://521pj.cn/20256770.html
发表评论