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

Python实现FFT算法详解(快速傅里叶变换入门与实战)

在数字信号处理、音频分析、图像处理等领域,快速傅里叶变换(Fast Fourier Transform, FFT)是一种极其重要的算法。它能将时域信号高效地转换为频域表示,从而帮助我们分析信号的频率成分。本教程将带你从零开始,用Python语言实现并理解FFT算法,即使你是编程小白也能轻松上手!

什么是FFT?

傅里叶变换告诉我们:任何复杂的信号都可以分解为多个不同频率的正弦波之和。而快速傅里叶变换(FFT)是计算离散傅里叶变换(DFT)的一种高效算法,其时间复杂度从 O(N²) 降低到 O(N log N),极大提升了计算速度。

Python实现FFT算法详解(快速傅里叶变换入门与实战) Python FFT算法  快速傅里叶变换教程 Python信号处理 FFT代码实现 第1张

使用Python内置库实现FFT

Python的科学计算库 numpyscipy 提供了现成的FFT函数,这是最常用、最高效的方式。

import numpy as npimport matplotlib.pyplot as plt# 生成一个包含两个频率成分的信号fs = 1000  # 采样频率T = 1.0    # 信号持续时间N = int(fs * T)  # 采样点数t = np.linspace(0, T, N, endpoint=False)# 合成信号:50Hz + 120Hz 正弦波signal = np.sin(2 * np.pi * 50 * t) + 0.5 * np.sin(2 * np.pi * 120 * t)# 执行FFTy_fft = np.fft.fft(signal)freqs = np.fft.fftfreq(N, 1/fs)# 只取正频率部分(因为FFT结果是对称的)half_N = N // 2freqs = freqs[:half_N]magnitude = np.abs(y_fft[:half_N])# 绘图plt.figure(figsize=(10, 4))plt.plot(freqs, magnitude)plt.title('FFT频谱图')plt.xlabel('频率 (Hz)')plt.ylabel('幅度')plt.grid(True)plt.show()

这段代码展示了如何使用 numpy.fft.fft() 对合成信号进行快速傅里叶变换,并绘制出频谱图。你可以清楚地看到50Hz和120Hz两个峰值,这正是我们合成信号的频率成分。

手动实现递归版FFT(Cooley-Tukey算法)

为了深入理解FFT原理,我们可以尝试自己实现一个简单的递归版本。这里采用经典的Cooley-Tukey算法,要求输入长度为2的幂次(如 8, 16, 32...)。

import numpy as npimport cmathdef fft(x):    """    手动实现快速傅里叶变换(仅支持长度为2的幂)    """    N = len(x)    if N <= 1:        return x        # 分治:偶数项和奇数项    even = fft(x[0::2])    odd = fft(x[1::2])        # 合并结果    T = [cmath.exp(-2j * cmath.pi * k / N) * odd[k] for k in range(N // 2)]    return [even[k] + T[k] for k in range(N // 2)] + \           [even[k] - T[k] for k in range(N // 2)]# 测试x = [1, 0, -1, 0]  # 简单信号result = fft(x)print("手动FFT结果:", result)print("NumPy FFT结果:", np.fft.fft(x))

这个递归实现虽然效率不如NumPy的C语言底层实现,但它清晰地展示了FFT的“分而治之”思想:将序列拆分为偶数和奇数索引两部分,分别做FFT,再通过旋转因子(twiddle factor)合并结果。

实际应用场景

掌握Python FFT算法后,你可以在以下领域大展身手:

  • 音频频谱分析(如音乐可视化)
  • 滤波器设计(去除噪声)
  • 振动信号故障诊断(机械工程)
  • 图像压缩与边缘检测(二维FFT)

总结

本教程从理论到实践,带你了解了快速傅里叶变换(FFT)的基本原理,并通过Python信号处理实例展示了如何使用NumPy库以及如何手动实现一个简易FFT。无论你是学生、工程师还是数据科学家,掌握FFT代码实现都将为你打开信号分析的大门。

建议初学者先熟练使用 numpy.fft,待理解原理后再尝试优化或扩展。记住:在实际项目中,优先使用经过高度优化的库函数,除非有特殊需求才自行实现。

关键词回顾:Python FFT算法快速傅里叶变换教程Python信号处理FFT代码实现