很多人在信号与系统课程里,前两周还能跟上进度,到了第三章突然就看不懂公式了。如果你现在正处于这个状态,请不要急着怀疑自己的数学能力。问题往往不是你不够聪明,而是还没有完成一个关键的认知转换:从时域思维切换到频域思维。
第三章在很多经典教材里正好是这个转折点。前两章你学会的是“一个信号随时间怎么变化”,到了第三章,你要开始从“一个信号由哪些频率成分组成”这个全新的角度去看它。这个切换一旦完成,后面章节就是下坡路;切换失败,后面全是悬崖。
这篇文章就是为还没完成切换的读者准备的。我会先用通俗的方式讲清楚频域分析到底在干什么,再给你一套可以直接上手的做题方法论,然后用 Python 和 MATLAB 把公式“跑”出来,让你直观看到频谱长什么样。文章最后还整理了零基础最容易踩的坑和一份考试刷题策略,目标是让你用最少的时间抓住第三章的主要得分点。
1. 第三章为什么是整个课程的分水岭
1.1 前两章和第三章的思维差异
在第一章,你接触了信号的基本描述:连续信号、离散信号、能量信号、功率信号、冲激信号、阶跃信号。这些东西都在回答一个共同的问题——“信号的值在每一个时刻是多少”。
到了第二章,你开始学系统:系统对输入信号做了什么,输出和输入之间是什么关系。卷积这个概念第一次出现,你已经感觉到,原来一个系统对任意输入的响应,可以通过它对冲激信号的响应拼出来。但本质上,你仍然在时间轴上思考问题。卷积公式里,你逐点移动、逐点相乘、逐点累加,操作的对象是时间。
第三章做了一个很反直觉的事:把信号从时间轴上“搬”到频率轴上。一个信号不再是 f(t) 的曲线,而是一堆正弦波、余弦波或者复指数信号的叠加,每个分量有自己的频率、幅度和相位。同一个信息,换了一个坐标系描述,就产生了完全不同的解题工具。这一步对初学者来说很穿越,所以很多人会卡在这里。它要求的不是更高深的数学,而是改变看问题的方式。
1.2 第三章没学好的连锁反应
信号与系统这门课是一个层层递进的体系。第三章建立的频域分析方法,会直接被后面的拉普拉斯变换、连续系统的 s 域分析、离散系统的 z 域分析继承。你可以把第三章理解为“把信号拆成频率分量”的第一次系统训练,之后所有变换都是在这个思想上做扩展。
采样定理也依赖频域视角。如果一个信号在频域里的带宽是有限的,那么采样频率至少要达到最高频率的两倍,采样之后才不会丢失信息。这句话如果放在时域里解释,会绕很多弯;放到频域里,就是一两句话的事。
因此,第三章学不好,不只是这一章拿不到分,而是整个课程后面的逻辑链条都会断掉。反过来,这一章一旦通了,后面很多内容会变得非常自然。
2. 核心概念:从时域到频域的坐标系转换
2.1 傅里叶级数:周期信号的“配料表”
先看一个最简单的场景。你有一个周期信号,比如一个方波。它每秒钟重复很多次,看起来就是一个直角边缘的波形。傅里叶级数告诉你:这个方波可以写成无穷多个不同频率的正弦波之和。
如果把这个想法换成做饭,就很好理解。一道菜的最终味道,是盐、糖、辣椒等调料按不同比例混合后的结果。你尝到的味道是混合后的整体,但配料表会告诉你里面有哪些成分、每种放了多少。傅里叶级数就是信号的“配料表”,它把周期信号拆成直流分量、基波分量、二次谐波、三次谐波……每一项都有明确的频率和幅度。
周期为 T 的信号 f(t),可以写成如下形式:
f(t) = Σ a_k e^{j k ω_0 t}
其中 ω_0 = 2π / T 是基波角频率,a_k 是第 k 次谐波分量的复振幅。这里的数学形式可以先不深究,你只需要抓住一个重点:一个周期信号可以等价成很多已知频率的正弦波的叠加。
2.2 傅里叶变换:非周期信号的推广
现实里更多信号不是周期的,比如一段瞬态脉冲、一段语音。那它还能拆成频率分量吗?可以,但拆分出来的不再是离散的一条条谱线,而是一段连续的频谱。
从傅里叶级数推到傅里叶变换,本质上是把非周期信号看成周期无穷大的周期信号。当周期趋近无穷大时,基频趋近无穷小,离散谱线就变成了连续频谱。
傅里叶变换正变换和反变换定义为:
X(jω) = ∫_{-∞}^{+∞} f(t) e^{-jωt} dt
f(t) = (1 / 2π) ∫_{-∞}^{+∞} X(jω) e^{jωt} dω
正变换负责把时域信号 f(t) 变成频域表示 X(jω),反变换负责把频域表示还原为时域信号。初始阶段你不需要背下积分公式的推导细节,但你必须知道这两个式子各自的方向和含义。
2.3 频谱图到底怎么看
很多零基础的同学在作业里画出频谱后不知道怎么检查结果。这里给你一个通用的读图方法。
频谱图通常横轴是频率 ω,纵轴是幅度 |X(jω)| 或相位。你不需要把每个点都算清楚,只需要能回答三个问题:信号主要能量集中在哪个频段?高频成分衰减得快还是慢?有没有明显的谱峰?对应到物理场景,高频成分多意味着信号变化陡峭,低频成分多意味着信号变化平缓。
为什么这个能力很重要?因为在第三章后面学习的滤波器、调制、采样,全部都要靠“看图”来理解:低通滤波器保留低频、抑制高频;采样是否失真要看频谱是否发生混叠;调制的本质是把基带频谱搬移到高频载波附近。看懂频谱图,就是频域思维落地的最直接体现。
3. 零基础必须掌握的性质清单
第三章考试里,真正拉开差距的不是定义式积分,而是性质的灵活使用。定义式积分计算量大、容易出错,而性质可以让你在几十秒内完成一道小题。下面这六条性质必须熟到能默写。
| 性质 | 时域关系 | 频域关系 | 记忆要点 |
|---|---|---|---|
| 线性 | a f(t) + b g(t) | a F(jω) + b G(jω) | 先拆后变换,方便处理叠加信号 |
| 时移 | f(t - t0) | e^{-jωt0} F(jω) | 时间轴平移,只改变相位、不改变幅度 |
| 频移 | e^{jω0t} f(t) | F(j(ω - ω0)) | 频移是调制的理论基础 |
| 尺度变换 | f(at) | (1 / | a |
| 卷积定理 | f(t) * g(t) | F(jω) G(jω) | 时域卷积,频域相乘 |
| 帕塞瓦尔定理 | ∫ | f(t) | ² dt |
使用性质时最忌讳的是生搬硬套。比如时移性质,它的前提是信号整体沿时间轴平移 t0,而不是把波形做了一半截断。如果题目给定的是一个“窗口内平移”,你还需要结合矩形窗的频谱去处理。
另外,要特别警惕尺度变换。它的结论经常反直觉:时域上信号被压缩,频谱会向高频方向扩展;时域上信号被拉伸,频谱会向低频方向收缩。这可以理解为一个“跷跷板关系”——信号在时域占的时间越短,在频域里需要的频率范围就越宽。这也是后面脉冲信号、采样定理内容里反复出现的直觉来源。
4. 0基础做题方法:三步走加典型例题
4.1 识别信号类型
拿到一道求频谱的题目,第一步不是立刻套公式,而是先回答:信号是周期的还是非周期的?是连续还是离散?周期信号用傅里叶级数,非周期连续信号用傅里叶变换,离散信号在后面章节才会系统学习,但第三章如果出现,通常是直接用定义式做单点计算。
4.2 选择工具
识别完类型后,选择工具。优先看题目给出的信号能不能由基本信号组合而成。基本信号包括:冲激、阶跃、矩形、三角、指数衰减、正弦余弦。如果信号本身就是基本信号,直接查常用变换表;如果信号是基本信号的平移、伸缩、卷积、乘积,就用对应的性质。
只有在信号比较“陌生”时,才回到定义式去积分。随着做题经验增加,你会越来越明显地感觉到,性质方法是高频题目的主要得分手段。
4.3 典型例题演示
例1:求矩形脉冲的傅里叶变换。设 f(t) = 1 在 |t| <= 1,其他位置为 0。用定义式计算:
X(jω) = ∫_{-1}^{1} 1 · e^{-jωt} dt
= [e^{-jωt} / (-jω)]_{-1}^{1}
= (e^{jω} - e^{-jω}) / (jω)
= 2 sin(ω) / ω
所以矩形脉冲的频谱是 2 sin(ω)/ω,也就是 2 乘以采样函数 Sa(ω)。这个结果应该在草稿纸上能独立推出,因为它会反复出现在各种题目中。
例2:利用时移性质快速求移位矩形的频谱。如果把上面的矩形向右平移 1 个单位,得到 f(t-1)。根据时移性质,新信号的频谱是:
e^{-jω} · 2 sin(ω) / ω
这个公式不用重新积分,一步就出结果。幅度谱不变,相位谱附加了 -ω 的线性相位。
例3:利用卷积定理求卷积信号的频谱。如果两个矩形脉冲在时域做卷积,得到的是三角形信号。卷积定理说,时域卷积对应频域相乘,因此三角形信号的频谱等于两个矩形脉冲频谱的乘积。这是一个非常典型的结构:你不需要真的去算时域卷积积分,而是先分别求两个信号的傅里叶变换,再相乘,最后如果有需要再做逆变换。
这三个例题串起来,正好覆盖了第三章最常见的三类考法:直接求基本信号的频谱、用性质求复杂信号的频谱、用时域卷积关系求信号频谱。
5. 用 Python 把频谱“跑”出来
5.1 数值定义式验证矩形脉冲频谱
有些同学对公式推导总是半信半疑,这很正常。最好的解决方式是用数值方法把理论结果复现出来。下面这段 Python 代码用 scipy.integrate.quad 做数值积分,直接逼近傅里叶变换定义式,然后与理论值 2 sin(ω)/ω 对比:
import numpy as np from scipy.integrate import quad import matplotlib.pyplot as plt def f(t): # 矩形脉冲:|t| <= 1 时为 1,其余为 0 return 1.0 if -1.0 <= t <= 1.0 else 0.0 def integrand(t, omega): return f(t) * np.exp(-1j * omega * t) omegas = np.linspace(-20, 20, 201) X_numerical = [] for w in omegas: # 矩形脉冲在 [-1, 1] 之外为 0,积分区间取 [-2, 2] 足够 result, _ = quad(lambda t: integrand(t, w), -2, 2, limit=200) X_numerical.append(result) X_numerical = np.array(X_numerical) # 理论值:2 * sin(omega) / omega X_theory = 2 * np.sin(omegas) / omegas # omega = 0 处需要单独处理极限值 2 X_theory[np.abs(omegas) < 1e-10] = 2.0 plt.figure(figsize=(10, 5)) plt.plot(omegas, np.abs(X_numerical), 'b-', label='Numerical integral') plt.plot(omegas, np.abs(X_theory), 'r--', label='Theory: |2 sin(w)/w|') plt.xlabel('omega') plt.ylabel('|X(j omega)|') plt.title('Rectangular Pulse Spectrum') plt.legend() plt.grid(True) plt.show()运行这段代码,你会看到两条曲线完全重合。这说明:定义式积分的结果与理论公式一致,傅里叶变换不是“抽象魔法”,而是可以精确计算出来的实际数值。这类验证对建立频域直觉非常有帮助。
5.2 用 FFT 观察叠加信号的频谱
实际工程里你不会用定义式去算积分,而是用 FFT(快速傅里叶变换)。下面代码生成一个 5Hz 正弦波与 50Hz 正弦波的叠加信号,然后用 scipy.fft 计算频谱:
import numpy as np import matplotlib.pyplot as plt from scipy.fft import fft, fftfreq fs = 1000 # 采样率 T = 1.0 # 时长 N = int(fs * T) t = np.linspace(0.0, T, N, endpoint=False) signal = np.sin(2 * np.pi * 5 * t) + 0.5 * np.sin(2 * np.pi * 50 * t) X = fft(signal) freqs = fftfreq(N, 1.0 / fs) mag = np.abs(X) / N # 只取正频率部分 half = N // 2 plt.figure(figsize=(10, 5)) plt.stem(freqs[:half], mag[:half], basefmt=" ") plt.xlabel('Frequency (Hz)') plt.ylabel('Magnitude') plt.title('Frequency Spectrum of 5Hz + 50Hz Signal') plt.xlim(0, 80) plt.grid(True) plt.show()运行后,你能在 5Hz 和 50Hz 两个位置看到明显的谱峰,分别对应两个正弦分量;0.5 的幅度差异也同样体现在谱线上。这个例子可以帮助你理解:频域分析的价值,就是从一段混合波形里直接看到它由哪些频率组成。
6. 用 MATLAB 看系统频率响应
第三章除了对信号本身做频谱分析,还有一个高频考点:系统的频率响应。也就是把系统函数 H(s) 放到 s = jω 上,观察系统对不同频率输入的放大或衰减能力。
下面是一个二阶低通系统的例子。系统函数为 H(s) = 1 / (s² + 0.5s + 1),用多项式求值直接计算 H(jω):
% 系统函数 H(s) = 1 / (s^2 + 0.5*s + 1) b = [1]; % 分子多项式系数 a = [1, 0.5, 1]; % 分母多项式系数 w = 0:0.01:10; % 角频率范围 % 用多项式求值直接计算 H(jw),等价于 freqs(b, a, w) H = polyval(b, 1j*w) ./ polyval(a, 1j*w); figure; plot(w, abs(H), 'LineWidth', 1.5); grid on; xlabel('Frequency (rad/s)'); ylabel('Magnitude'); title('Frequency Response |H(j\omega)|');运行后,你会看到幅频曲线在低频段接近 1,到高频段逐渐下降。这就是低通滤波器的典型特征。在第三章考试里,类似的题目往往要求你根据系统函数判断它是什么类型的滤波器、通带在哪、阻带在哪。如果你想验证自己对某个系统的判断,用上面这段代码画一下曲线,结果一目了然。
7. 零基础最容易踩的坑与排查方法
第三章的常见问题,往往不是计算能力不足,而是概念混淆。这里整理了一份排查清单,建议收藏。
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 分不清该用傅里叶级数还是傅里叶变换 | 没有先判断信号是否具有周期性 | 先看题目中信号是否有重复周期 T | 周期信号用级数,非周期信号用变换 |
| 计算积分时丢掉负频率项 | 没有注意复指数展开的完整性 | 回看欧拉公式推导 | 复指数展开后一定要保留正负频率项 |
| 时移后频谱出错 | 只改了幅度,没处理相位因子 | 用移位前后的频谱做对比验证 | 时域平移只添加 e^{-jωt0} 相位因子 |
| 尺度变换结果和直觉相反 | 公式符号记反 | 用 f(2t) 和 f(0.5t) 的小例子验证 | 记住 a 越大时域越窄、频域越宽 |
| 卷积定理用时域相乘还是频域相乘搞混 | 对偶关系记忆不牢 | 两个性质同时默写 | 时域卷积频域相乘;时域相乘频域卷积 |
| 画频谱图不知道纵轴含义 | 没有区分幅度谱和相位谱 | 确认题目问的是幅度还是相位 | 幅度谱纵轴为 |
除开表格中的问题,还有一条更基础的建议:做第三章的作业时,不要在草稿纸上直接堆积分。先写“信号类型 + 工具选择 + 性质组合”三行判断,再动笔计算。很多错误都出在还没判断对信号类型就开始套公式。
8. 考试拿 90+ 的复习策略
8.1 按考点优先级排序
如果你时间有限,建议按下面的优先级复习,每个等级都要配合实际练习。
第一优先级是常用变换对与基本性质。冲激信号、阶跃信号、矩形信号、指数信号的傅里叶变换必须能默写,线性、时移、频移、尺度变换、卷积定理必须能直接套用。这一档决定了你是否能及格。
第二优先级是频谱图的理解与绘制。能够根据信号波形大概画出频谱形状,能够区分幅度谱和相位谱,能够解释滤波器为什么是低通或高通。这一档决定了你是否能上 80 分。
第三优先级是综合应用题。比如用卷积定理求复杂信号频谱、用频移性质分析调制过程、根据系统函数求频率响应判断滤波特性。这一档是冲击 90 分以上的关键。
8.2 做题习惯
每次练习都按照“判断信号类型、选择工具、用性质化简、最后定义式计算”的顺序写过程。不要一上来就写积分号。考试时即使最后结果算错,只要你的方法选择正确,仍然能拿到大部分步骤分。
更重要的是,做完一道题后要回头总结:这一题考的是哪个知识点,和做过的哪道题相似,下次遇到应该先看哪一步。用这种方法刷题,二十道题比盲目刷一百道题更有用。
8.3 考前怎么自查
考前用半小时做一次概念自测:能不能不看教材写出傅里叶正反变换公式?能不能默写六个常用变换对?能不能解释时域卷积对应频域相乘?这三个问题都能答上来,第三章的基本盘就稳了。剩下的时间交给错题回顾,不要再刷新题。
9. 从第三章走向后续章节
到这里,第三章的核心知识已经串起来了:从时域信号到频域表示,从傅里叶级数到傅里叶变换,从性质列表到做题流程,再到用 Python 和 MATLAB 做数值验证。你会发现,第三章真正的门槛不是积分技巧,而是建立“每个信号都可以用频率成分来描述”这个认知。
后续的拉普拉斯变换、z 变换,本质上都是傅里叶变换的扩展。拉普拉斯变换把频率从虚轴推广到复平面,使得更多不满足绝对可积条件的信号也能被分析;z 变换则把同样的思想搬到离散时间领域。掌握了第三章的频域视角,后面学这些内容的时候,只需要在“拆信号”的框架上增加一个新的维度。
如果你目前的教材里,第三章不是频域分析,而是其他主题,也不要紧。你可以把本文当作整个课程频域分析部分的独立速成资料,等学到对应章节时再对照阅读。实际工程项目中,频域分析也是最常用的工具之一:滤波器设计、信号调制解调、系统辨识、语音与图像处理,几乎都离不开这套思路。
建议你自己动手跑一遍文中的 Python 和 MATLAB 代码,亲手画出频谱图。视觉印象往往比公式记忆更持久。看完文章是一回事,跟着代码做一遍是另一回事,后者才是真正掌握的开始。