连续周期信号的傅里叶级数是信号与系统课程里的第一道分水岭。不少同学能把公式背下来,却说不清楚“时域波形分解成离散频谱”这件事究竟意味着什么。这里先把核心思想摆出来:傅里叶级数把一个具有周期性的连续时间信号,表示成一系列频率为基频整数倍的正弦或复指数信号的叠加。拆完之后,原来在时间轴上看起来很复杂的波形,会变成一张非常直观的离散频谱。
它真正有价值的地方不只是考试,而是后面所有频域分析的基础。周期信号对应离散谱、非周期信号对应连续谱,这个结论最早就是从傅里叶级数推出来的;滤波器带宽设计、谐波分析、调制解调、FFT 结果解释,也都要回到这个基本分解上。这个主题没有显卡门槛,也不需要安装大模型,真正的门槛在数学理解和数值验证。
这篇文章会从连续周期信号的傅里叶级数定义讲起,梳理三角形式与复指数形式、收敛条件和吉布斯现象、频谱与功率的关系,再结合方波这个最典型的例子,用 Python 做一次级数合成和 FFT 对照验证。最后会整理最常见的理解误区和排查思路。适合刚开始学信号与系统、正在复习考研信号部分、以及需要在 MATLAB 或 Python 里做信号仿真验证的读者。
1. 连续周期信号的傅里叶级数:核心能力与适用边界
1.1 核心能力速览
| 条目 | 说明 |
|---|---|
| 分析对象 | 连续时间周期信号,满足收敛条件即可 |
| 核心能力 | 将周期信号分解为基频整数倍的正弦/复指数叠加,得到离散频谱 |
| 输出结果 | 直流分量、各次谐波幅度、相位、谱线位置 |
| 数学基础 | 微积分、欧拉公式、三角函数正交性 |
| 主要工具 | Python NumPy/SciPy/Matplotlib,或 MATLAB/Simulink |
| 硬件要求 | 无特殊要求,普通 CPU 机器即可运行仿真 |
| 典型场景 | 谐波分析、滤波器设计、调制解调理论、功率分析、FFT 结果验证 |
| 与 FFT 关系 | 周期信号整周期采样后,FFT 谱线可用于近似验证理论傅里叶系数 |
| 不适用对象 | 非周期连续信号、离散时间序列、含无限能量的非稳定信号 |
这本质上是一套数学工具,而不是某个需要安装部署的软件包。因此在学习时,重点不是“怎么启动”,而是“怎么把一个真实波形和这些公式对应起来”。
1.2 适用场景与使用边界
傅里叶级数适合处理能够写成周期延拓的连续时间信号。比如 50Hz 工频电压波形、电力系统中的谐波电流、周期方波时钟、振荡器输出信号等。工程上很多波形虽然不完美,但只要满足一定的收敛条件,就能用有限项谐波去逼近和分析。
需要注意,它的适用边界也很清晰:
- 如果信号本身是非周期的,应该使用傅里叶变换,而不是傅里叶级数。
- 如果信号是离散时间序列,应该进入 DTFT、DFT 或 FFT 的框架,不能直接套用连续周期信号的积分公式。
- 如果信号在一个周期内不可积,或者有无限多个极值点,理论上傅里叶级数可能不收敛到原信号。
- 傅里叶级数给出的是频域表示,不等于消除了吉布斯效应。用有限项恢复波形时,跳变附近会出现振铃过冲,这是截断本身造成的。
简单说,傅里叶级数是理解和计算周期信号频谱的“第一块积木”。先把这个周期与离散谱的关系建立起来,后面学傅里叶变换会顺很多。
2. 建立数学概念:周期、谐波与正交基
先从基础概念开始。
一个连续时间信号如果满足
$$ x(t) = x(t + T_0) $$
那么它是一个周期信号。其中最小的正整数 $T_0$ 称为基波周期,$f_0 = 1/T_0$ 是基频,$\omega_0 = 2\pi f_0$ 是基波角频率。所谓“基波”,就是频率最低的那个正弦分量;而 $n\omega_0$ 对应的分量称为第 $n$ 次谐波。
傅里叶级数的核心观察是:一个以 $T_0$ 为周期的信号,它的频率成分不会随意出现,只能出现在基频的整数倍上。原因很简单,如果频率成分不是 $n\omega_0$,那么这个成分自身并不以 $T_0$ 为周期,叠加后也不可能整体保持周期 $T_0$。
选择三角函数作为基函数,是因为三角函数族在一个周期内满足正交性。也就是说,对任意整数 $m \neq n$,有
$$ \int_{T_0} \cos(m\omega_0 t)\cos(n\omega_0 t) , dt = 0 $$
$$ \int_{T_0} \sin(m\omega_0 t)\sin(n\omega_0 t) , dt = 0 $$
$$ \int_{T_0} \cos(m\omega_0 t)\sin(n\omega_0 t) , dt = 0 $$
这套正交关系决定了系数可以像“向量投影”一样单独算出来。把周期信号看成无限维空间中的一个点,三角函数基就是坐标轴,傅里叶系数就是信号在各坐标轴上的投影。
3. 三角形式和复指数形式的傅里叶级数
3.1 三角形式
工程上最常见的表示方法是:
$$ x(t) = a_0 + \sum_{n=1}^{\infty} \left[ a_n \cos(n\omega_0 t) + b_n \sin(n\omega_0 t) \right] $$
其中 $a_0$ 是信号的直流分量,也就是一个周期内的平均值:
$$ a_0 = \frac{1}{T_0} \int_{T_0} x(t) , dt $$
$a_n$ 和 $b_n$ 分别为余弦项和正弦项系数:
$$ a_n = \frac{2}{T_0} \int_{T_0} x(t) \cos(n\omega_0 t) , dt $$
$$ b_n = \frac{2}{T_0} \int_{T_0} x(t) \sin(n\omega_0 t) , dt $$
这里要留意不同教材的记法差异。有的教材把直流项写成 $a_0/2$,相应系数公式会多一个 $1/2$ 的差别。做习题或写代码时,先确认自己采用的是哪一种定义,否则计算结果会整体偏移一个系数。
三角形式的优点是物理意义直观:每个频率成分都由一个余弦项和一个正弦项描述,两者合起来决定该频率分量的幅度和相位。
3.2 复指数形式
复指数形式是信号处理中更通用的写法:
$$ x(t) = \sum_{n=-\infty}^{\infty} C_n e^{j n \omega_0 t} $$
其中傅里叶系数为
$$ C_n = \frac{1}{T_0} \int_{T_0} x(t) e^{-j n \omega_0 t} , dt $$
使用复指数形式后,公式更紧凑,正负频率同时出现,推导卷积、调制等性质也更方便。
3.3 两种形式的换算关系
如果把欧拉公式代入三角形式,就能得到两种形式之间的关系。对实数信号,正频率分量的复指数系数与三角系数之间有如下关系:
$$ C_n = \frac{a_n - j b_n}{2}, \quad n > 0 $$
$$ C_{-n} = \frac{a_n + j b_n}{2}, \quad n > 0 $$
直流项满足
$$ C_0 = a_0 $$
因此三角形式中某次余弦分量的实际幅度是 $\sqrt{a_n^2 + b_n^2}$,而复指数形式中正频率分量的幅度是它的一半。这就是为什么很多频谱图上,双边谱的谱线高度只有单边谱的一半。
4. 收敛条件与吉布斯现象
并不是任意周期信号都能用傅里叶级数完美表示。傅里叶级数收敛需要满足狄利克雷条件:
- 一个周期内信号绝对可积。
- 一个周期内只有有限个极大值和极小值。
- 一个周期内只有有限个第一类间断点。
通常工程上遇到的周期信号都能满足这些条件,所以理论分析时不必过于担心。但如果信号是理想冲激串、阶跃串这类广义函数,就需要在广义函数意义下理解收敛。
收敛的结果也很明确:
- 在信号的连续点处,傅里叶级数收敛于原信号值。
- 在信号的跳变点处,傅里叶级数收敛于左右极限的平均值。
- 用有限项谐波逼近时,跳变点附近会出现过冲和振铃,这种现象叫吉布斯现象。
吉布斯现象是傅里叶级数截断误差的典型表现,把它归结为“傅里叶级数错了”是不对的。随着谐波项数增加,过冲区域会越来越窄,但最大过冲幅度并不会消失,大约保持在跳变幅度的 9% 左右。这个现象在实际通信系统和滤波器设计中经常会遇到,比如带宽受限的方波信号会产生振铃。
5. 频谱的物理含义:幅度、相位与功率
傅里叶级数把周期信号变成一组离散谱线。对于每个谐波频率 $n\omega_0$,可以画出幅度谱和相位谱。幅度谱告诉你“这个频率成分有多大”,相位谱告诉你“这个成分在时间轴上偏移了多少”。
一个周期信号的平均功率可以表示为
$$ P = \frac{1}{T_0} \int_{T_0} |x(t)|^2 , dt $$
在频域中,帕塞瓦尔定理给出了另一个计算方式。对三角形式,如果采用上面直流项为 $a_0$ 的定义,有
$$ P = a_0^2 + \frac{1}{2}\sum_{n=1}^{\infty} (a_n^2 + b_n^2) $$
对复指数形式,则有
$$ P = \sum_{n=-\infty}^{\infty} |C_n|^2 $$
这意味着无论你在时域计算能量,还是在频域把每条谱线的能量加起来,结果都是一样的。工程上经常用这个关系来检查谐波分析是否做对,也可以用来计算总谐波失真等指标。
6. 典型周期信号的谐波结构
学习傅里叶级数时,不能只背公式,要把几个典型信号的变化规律记住。
最简单的余弦信号只有一根谱线。方波则非常典型,一个幅度为 $A$、周期为 $T_0$ 的奇对称方波可以展开为
$$ x(t) = \frac{4A}{\pi}\sum_{n=1,3,5,\dots}^{\infty} \frac{1}{n}\sin(n\omega_0 t) $$
从公式可以看出:
- 只包含奇次谐波,没有偶次谐波。
- 第 $n$ 次谐波幅度按 $1/n$ 衰减。
- 方波存在不连续跳变,所以高频分量衰减较慢,只有一阶衰减速度。
三角波或更平滑的连续分段线性信号则不同,通常谐波幅度按 $1/n^2$ 甚至更快衰减。这说明信号的平滑程度越高,高频能量越小。反过来说,时域越尖锐、跳变越剧烈,频域展得越宽。这个直觉对滤波器设计非常重要。
周期冲激串的傅里叶级数也值得记住。一个周期为 $T_0$ 的冲激串
$$ p(t) = \sum_{k=-\infty}^{\infty} \delta(t - kT_0) $$
的傅里叶系数恒定为 $1/T_0$,也就是说它在频域是一排等幅谱线。这个概念在采样定理推导中会反复出现。
7. 从傅里叶级数到傅里叶变换:为什么要重视这个桥梁
傅里叶级数处理的是周期信号,傅里叶变换处理的是非周期信号。两者之间并不是两个完全无关的数学工具,而是一个极限过程。
如果一个信号的周期 $T_0$ 不断增加,那么基频
$$ f_0 = \frac{1}{T_0} $$
会不断变小,对应频谱上相邻谱线的间隔也会越来越小。当周期趋于无穷,非周期信号可以看成周期无穷大的周期信号,这时离散谱线之间的距离趋近于零,求和就变成了积分。
从工程角度,记住下面这个对应关系就够了:
- 周期信号在频域是离散谱。
- 非周期信号在频域是连续谱。
- DFT/FFT 处理的有限长离散序列,频谱依然是离散的。
这也是很多初学者容易混淆的地方。如果看到周期信号频谱图画成连续曲线,那大概率有问题;如果看到非周期信号频谱画成一根根离散谱线,也需要谨慎判断。
8. Python 数值实验:方波级数合成与 FFT 验证
8.1 实验环境
这里用 Python 做验证,主要依赖三个库:
pip install numpy scipy matplotlib代码不需要 GPU,也不需要额外下载模型文件,普通笔记本即可运行。建议在 Jupyter Notebook 中分步执行,方便观察每一张图和每一组输出。
8.2 用级数合成方波
先定义方波和级数合成函数。以周期 $T=2s$、幅度 $A=1$ 的方波为例,理论级数为
$$ x(t) = \frac{4}{\pi}\sum_{n=1,3,5,\dots} \frac{1}{n}\sin(n\pi t) $$
代码如下:
import numpy as np import matplotlib.pyplot as plt T = 2.0 # 方波周期 A = 1.0 # 方波幅度 omega0 = 2 * np.pi / T # 从 t=0.05 开始,避开 t=0 处的跳变点 t = np.linspace(0.05, 4.05, 4000, endpoint=False) def square_wave(t): """理想方波:0-T/2 为 A,T/2-T 为 -A""" tt = t % T return np.where(tt < T / 2, A, -A) def synthesize(t, max_n): """用不超过 max_n 次的奇次谐波合成方波""" total = np.zeros_like(t) for n in range(1, max_n + 1, 2): total += (4 * A / np.pi) * (1 / n) * np.sin(n * omega0 * t) return total fig, axes = plt.subplots(2, 2, figsize=(12, 6)) for ax