在数字信号处理、音频分析、图像处理等领域,快速傅里叶变换(Fast Fourier Transform, FFT)是一种极其重要的算法。它能将时域信号高效地转换为频域表示,从而帮助我们分析信号的频率成分。本教程将带你从零开始,用Python语言实现并理解FFT算法,即使你是编程小白也能轻松上手!
傅里叶变换告诉我们:任何复杂的信号都可以分解为多个不同频率的正弦波之和。而快速傅里叶变换(FFT)是计算离散傅里叶变换(DFT)的一种高效算法,其时间复杂度从 O(N²) 降低到 O(N log N),极大提升了计算速度。

Python的科学计算库 numpy 和 scipy 提供了现成的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算法,要求输入长度为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)的基本原理,并通过Python信号处理实例展示了如何使用NumPy库以及如何手动实现一个简易FFT。无论你是学生、工程师还是数据科学家,掌握FFT代码实现都将为你打开信号分析的大门。
建议初学者先熟练使用 numpy.fft,待理解原理后再尝试优化或扩展。记住:在实际项目中,优先使用经过高度优化的库函数,除非有特殊需求才自行实现。
关键词回顾:Python FFT算法、快速傅里叶变换教程、Python信号处理、FFT代码实现。
本文由主机测评网于2025-12-15发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://vpshk.cn/2025127997.html