)
傅里叶级数实战5个经典例题帮你彻底搞懂信号分解附Python代码在信号处理领域傅里叶级数就像一把瑞士军刀能将复杂的周期信号拆解成简单的正弦波组合。但对于初学者来说从数学公式到实际应用往往存在一道难以跨越的鸿沟。本文将通过5个典型例题配合Python代码实现带你直观感受傅里叶级数在工程中的实际威力。1. 方波分解从理想模型到实际应用方波是最常见的数字信号之一其傅里叶级数展开具有典型的奇次谐波特征。让我们先用数学表达式描述一个周期为2π的方波import numpy as np import matplotlib.pyplot as plt def square_wave(x): return np.sign(np.sin(x))通过傅里叶级数理论可知方波的展开式为$$ f(x) \frac{4}{\pi} \sum_{n1,3,5...}^{\infty} \frac{\sin(nx)}{n} $$用Python实现前N项和的逼近效果def fourier_square(x, N): result 0 for n in range(1, N1, 2): result np.sin(n*x)/n return (4/np.pi)*result x np.linspace(-2*np.pi, 2*np.pi, 1000) plt.plot(x, square_wave(x), labelOriginal) for N in [1, 5, 20]: plt.plot(x, fourier_square(x, N), labelfN{N}) plt.legend() plt.show()吉布斯现象即使增加谐波数量在跳变点附近仍会出现约9%的过冲这是傅里叶级数逼近不连续函数时的固有特性。2. 三角波重构工业测量信号处理三角波常见于传感器输出和PWM调制其傅里叶级数展开式为$$ f(x) \frac{8}{\pi^2} \sum_{n1,3,5...}^{\infty} (-1)^{(n-1)/2} \frac{\sin(nx)}{n^2} $$Python实现展示了不同谐波数量下的逼近效果def fourier_triangle(x, N): result 0 for n in range(1, N1, 2): sign (-1)**((n-1)/2) result sign * np.sin(n*x)/(n**2) return (8/np.pi**2)*result实际工程中我们常需要权衡计算精度和实时性。下表比较了不同谐波数量下的误差和计算耗时谐波数量最大相对误差计算时间(ms)54.2%0.12150.8%0.35250.3%0.62提示在嵌入式系统中实现时可预先计算谐波系数并存储减少实时计算负担。3. 全波整流信号电源电路分析交流电经过全波整流后其傅里叶级数展开为$$ f(x) \frac{2}{\pi} - \frac{4}{\pi} \sum_{n2,4,6...}^{\infty} \frac{\cos(nx)}{n^2-1} $$Python实现展示了整流信号的频谱特性def fourier_rectified(x, N): dc 2/np.pi ac 0 for n in range(2, N1, 2): ac np.cos(n*x)/(n**2-1) return dc - (4/np.pi)*ac通过FFT分析可以直观看到各次谐波的能量分布from scipy.fft import fft y fourier_rectified(x, 50) Y fft(y) freq np.fft.fftfreq(len(x), x[1]-x[0]) plt.stem(freq[:20], np.abs(Y[:20])) plt.xlabel(Harmonic Order) plt.ylabel(Amplitude) plt.show()4. 脉冲序列数字通信中的时钟信号周期脉冲序列的傅里叶级数包含所有整数倍谐波$$ f(x) \frac{\tau}{T} \frac{2\tau}{T} \sum_{n1}^{\infty} \text{sinc}(n\pi\tau/T) \cos(2\pi nx/T) $$其中τ为脉冲宽度T为周期。Python实现展示了占空比对频谱的影响def fourier_pulse(x, T, tau, N): result tau/T for n in range(1, N1): cn np.sinc(n*np.pi*tau/T) result 2*(tau/T)*cn*np.cos(2*np.pi*n*x/T) return result改变占空比时频谱包络的变化规律占空比越小主瓣越宽谐波幅度按sinc函数衰减过零点出现在n kT/τ (k为整数)5. 任意周期信号音频处理实战对于任意形状的周期信号我们可以用数值积分方法计算傅里叶系数def compute_coefficients(f, T, N): a0 (1/T)*np.trapz(f(x), x) an [] bn [] for n in range(1, N1): cos_term f(x)*np.cos(2*np.pi*n*x/T) sin_term f(x)*np.sin(2*np.pi*n*x/T) an.append((2/T)*np.trapz(cos_term, x)) bn.append((2/T)*np.trapz(sin_term, x)) return a0, an, bn def reconstruct(x, a0, an, bn, T, N): result a0 * np.ones_like(x) for n in range(1, N1): result an[n-1]*np.cos(2*np.pi*n*x/T) result bn[n-1]*np.sin(2*np.pi*n*x/T) return result应用案例分析吉他A音(440Hz)的谐波结构。实际测试发现优质吉他音色包含丰富的奇次和偶次谐波而廉价吉他往往只有基波和少量谐波。