当前位置:首页 > Python > 正文

NumPy FFT 使用教程 - Python快速傅里叶变换指南 | 技术博客

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: 输入数组

基本使用步骤

  1. 导入NumPy库:import numpy as np
  2. 准备输入信号数据(一维或多维数组)
  3. 使用np.fft.fft()进行傅里叶变换
  4. 使用np.fft.fftshift()将零频移到中心(可选)
  5. 使用np.fft.fftfreq()获取频率轴
  6. 计算幅度谱:np.abs(fft_result)
  7. 使用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()可节省计算资源
  • 幅度归一化:根据应用需求考虑是否对幅度进行归一化

发表评论