我读书那会儿,刚开始学《信号与系统》,最怕的就是不知道一个信号该用哪套方法去分析。后来工作了,主要接触射频和嵌入式相关的信号处理,回头再看这门课,才明白教材一开始把“基本信号”单独拎出来讲,并不是在灌概念,而是在给你搭工具箱。因为后面所有的分析手段——频谱、变换、卷积,本质上都是围绕这些基本信号展开的。你手机里收到的 Wi-Fi 数据,从示波器上看,就是高频正弦载波被调制出来的波形;电路上电的那一瞬间,电压跳变又提醒你需要用阶跃函数去描述。理解了基本信号,就相当于拿到了看懂整个学科的钥匙。
这篇是《信号与系统》概述部分的第二篇,重点梳理“基本信号”这个板块。无论你是刚开始学这门课的本科生、在备战考研的复习党,还是工作中想回补理论的工程师,这篇内容都适合拿来反复对照。我会把信号分类的逻辑、几类典型连续信号的数学形式和工程含义、阶跃与冲激这一对“特殊家伙”、还有能量信号与功率信号的判定方法,全部串成一个体系讲给你听。不是单纯念公式,而是告诉你每个概念到底在解决什么问题、做题的时候该如何判断。
1. 先给信号分类:决定你后面用什么工具
《信号与系统》这门课里没有一套万能方法能把所有问题都解决掉。你拿到一个问题,第一步往往不是直接套公式,而是先判断眼前的信号属于什么类型。因为不同类型的信号,后面要用的数学工具完全不同。这里我把最常见的三种分类方式放在一起讲,它们就像三把筛子,能帮你快速把问题框定住。
1.1 连续时间信号与离散时间信号
连续时间信号记作 x(t),自变量 t 是连续变化的实数,比如话筒输出的电压、房间温度曲线、汽车速度表读数。离散时间信号记作 x[n],这里的 n 只取整数,代表序号,比如每天中午记录的体温、股票收盘价、语音经过采样之后的数值序列。
这个区分决定了系统用什么方程去描述。连续时间系统通常对应微分方程,离散时间系统对应差分方程,后续的拉普拉斯变换和 Z 变换也是分别服务这两类信号的。值得注意的是,现实中绝大多数物理量都是连续的,但计算机只能处理离散数据,所以从 x(t) 变成 x[n] 的“抽样”过程,是整个数字信号处理的起点,后面抽样定理那一章会反复用到这个概念。
做题时有个很实用的判断方法:看到自变量是 t,优先往连续域的工具上想;看到自变量是 n,就准备用序列分析的语言。很多初学者拿到题目连这层分类都没做,直接对着微分方程硬算,结果自然对不上。
1.2 确定性信号与随机信号
确定性信号的特点是:可以用一个明确的数学表达式描述,给定任意时刻 t,信号值唯一确定。比如 x(t) = A cos(ωt + φ),随便给一个 t,值都能算出来。随机信号则相反,它没有确定表达式,只能通过统计规律描述,比如电阻热噪声、信道里的干扰、语音信号本身也带有很强的随机性。
随机信号的分析工具不再是微积分加频谱,而是概率密度、均值、方差、自相关函数和功率谱密度。在系统课程里,前几章绝大多数情况都默认处理确定信号,到通信系统和信号检测那边,随机模型才大面积上场。
给个实操经验:如果你在示波器上看到一个被噪声覆盖的波形,不要试图写出它的精确表达式,而是该思考它的平均功率和频谱形状。这和学习确定信号是两种完全不同的思维习惯,越早适应越好。
1.3 周期信号与非周期信号
周期信号的定义很简短:存在一个正数 T,使得 x(t) = x(t + T) 对所有 t 都成立,这个最小的正数 T 叫做基波周期。例如 cos(2t) 的基波周期就是 π。对应有离散周期信号的定义:存在正整数 N 使 x[n] = x[n + N]。
但这里有个特别容易踩的坑:离散正弦信号的周期性,和连续正弦完全不是一回事。连续信号 cos(ωt) 无论 ω 取什么值,它都是周期的。离散序列 cos(ωn) 就不一定了,只有当 ω / (2π) 是有理数时它才是周期的。比如 cos(0.1πn) 的周期是 20,因为 0.1π / (2π) = 1/20;但 cos(n) 就不是周期序列,因为 1 / (2π) 是无理数。很多考研同学在这个点上栽过跟头,我当年也绕了一阵才想明白。
两个周期信号相加,结果也不一定是周期信号,只有两个周期之比为有理数时,叠加后的信号才是周期的。cos(2t) 和 cos(5t) 叠加后是周期信号,但 cos(t) 和 cos(πt) 叠加后就不是。所以拿到一个信号,判断它是不是周期的,一定不能光看组成部分,得算比例。
2. 连续时间里的“常规部队”:指数、正弦、复指数、Sa 信号
分类只是第一步。真正进入基本信号内部,你会发现有几个出现频率极高的“熟面孔”,它们就像搭建复杂信号的积木。这一节我把连续时间领域最核心的四类信号逐个拆开讲:实指数信号、正弦信号、复指数信号,以及抽样信号 Sa(t)。
2.1 实指数信号:增长、衰减、平稳
实指数信号的一般形式是 x(t) = A e^{σt},A 决定初始幅度,σ 决定变化趋势。σ > 0 时信号随时间增长,σ < 0 时衰减,σ = 0 时变成常数。这个信号看起来简单,却是描述一阶系统暂态过程的灵魂。
举个最典型的例子:RC 串联电路,电容初始电压为 V₀,通过电阻放电,电容电压随时间变化的规律就是 v(t) = V₀ e^{-t/RC}。这里的 RC 被称为时间常数 τ,它有一个很直观的物理含义:经过一个时间常数,信号衰减到初始值的约 36.8%(也就是 e^{-1})。实际调试电路时,我习惯直接看波形衰减到 36.8% 的那个时间点,用它来快速估算电路的时间常数,比拿光标一点一点量要快得多。
实指数信号还有一个常见变形——衰减正弦振荡,形式是 x(t) = A e^{-αt} sin(ωt)。RLC 二阶电路的暂态响应、机械系统的减振运动,都是这种波形。这里 α 决定衰减快慢,ω 决定振荡快慢,两者配合起来能描述非常丰富的物理现象。
2.2 正弦信号:三个要素决定一切
正弦信号写成 x(t) = A cos(ωt + φ),三个要素分别是幅度 A、角频率 ω、初相位 φ。周期 T = 2π/ω,频率 f = 1/T。为什么教材喜欢用余弦而不用正弦?纯粹是约定问题,sin 和 cos 之间只差 90 度初相,没有本质区别。
初相位 φ 是个容易被忽略但其实很重要的参数。它对应时间偏移:φ = -ω t₀,t₀ = -φ/ω。换句话说,相位每变化多少,就等于波形在时间轴上平移了多少。所以后面学锁相环、时延估计、beamforming 的时候,相位和时间delay基本是同一件事的两种表达方式。
另外记住一个结论:同频率的正弦信号叠加后,仍然是同频率的正弦信号,只是幅度和相位变了。具体幅度由两个分量的旋转向量相加决定,不必硬记公式,画个向量图就一目了然。而不同频率的正弦叠加,就会形成更复杂的波形,这正是后面傅里叶级数要处理的核心问题——任意周期信号都能拆成一系列不同频率正弦信号的叠加。
2.3 复指数信号:欧拉公式打开的第二只眼
复指数信号也是必须熟练掌握的:e^{jωt} = cos(ωt) + j sin(ωt)。这就是欧拉公式。怎么看这个式子?可以把 e^{jωt} 想象成复平面上一个绕原点旋转的单位向量:初始位置在实轴正方向,以角速度 ω 逆时针旋转。它在实轴上的投影是 cos(ωt),在虚轴上的投影是 sin(ωt)。用这种“旋转向量”的视角去理解,复指数信号就不再神秘了。
为什么正弦信号放着好好的 cos 不用,非得绕道去搞复指数?因为 e^{jωt} 在微积分运算里的性质太好了:对它求导、积分、做时移,结果都还是同一形式的复指数函数,只是幅度或者相位发生了变化。这种稳定性使得线性时不变系统对复指数输入的处理特别优雅,输出依旧是同一频率的复指数,只是乘上了一个复增益。这就是后面频谱分析和傅里叶变换的核心思想基础。
同时还需要熟悉两个反向表达式:cos(ωt) = (e^{jωt} + e^{-jωt}) / 2,sin(ωt) = (e^{jωt} - e^{-jωt}) / 2j。也就是说,一个实正弦信号可以看成两个相反方向旋转的复指数向量合成的结果。负频率在这里不是物理概念,只是数学描述上的一个方向分量,理解了这层,后面画双边频谱的时候就不会觉得别扭。
2.4 抽样信号 Sa(t):抽样定理的“黄金配角”
抽样信号定义是 Sa(t) = sin(t) / t,有些教材也写成 sinc(t) = sin(πt) / (πt),两者只差自变量的尺度变换。Sa(t) 是一个偶函数,在 t = 0 处通过极限求得 Sa(0) = 1,而在 t = kπ(k 为非零整数)处取值为 0。
我建议你亲自把波形画一遍:中心在 t = 0 时幅度最高为 1,左右两侧像衰减的波浪一样逐渐振荡衰减,主瓣宽度是 2π,旁瓣高度逐级降低。这个形状之所以重要,是因为理想低通滤波器的冲激响应恰好就是这种形式,一个矩形频带在时域里对应出来就是 Sa(t)。后续学抽样定理时,如何从采样点恢复出原始连续信号,本质就是在和这个函数打交道。
实际工程里,我们不可能存在理想的矩形频谱,所以现实中恢复波形会带振铃效应,也就是在信号跳变处出现那种一上一下的振荡尾巴。这就是为什么数字滤波器设计时经常讨论“吉布斯现象”,根子就在 Sa(t) 的旁瓣上。
3. 阶跃与冲激:信号界的“开关”和“探针”
如果说前面几类信号是“常规部队”,那阶跃函数和冲激函数绝对算得上“特战队员”。它们在数学上多少有点“不讲道理”,但在系统分析里扮演的角色比大多数常规信号还重要。我见过不少同学在这两个信号上卡壳,卡住的原因往往是试图用“普通函数”的思维去理解它们,这思路需要调整。
3.1 阶跃函数:定义一个开关
单位阶跃函数定义很简明:u(t) = 1(t > 0),u(t) = 0(t < 0),至于 t = 0 这一点怎么取,不同教材约定不一样,有的取 1/2,有的取 1,但这在积分和系统分析里几乎不影响结果。它刻画的是“某一刻之前没有,某一刻之后恒为 1”的跳变过程,就像开关合上的瞬间。
有了阶跃函数,就能很方便地表达各种“门信号”。一个宽度为 τ、关于纵轴对称的矩形脉冲可以写成 u(t + τ/2) - u(t - τ/2)。一个从 t=0 才开始存在的因果信号,可以写成原信号乘以 u(t)。这个“乘 u(t)”的操作,在后面的单边拉普拉斯变换里是常规动作,作用是强制把信号在负时间轴的部分清零,只分析 t ≥ 0 的行为。
阶跃函数本身虽然简单,但它代表一种“突然变化”。在电路分析中,开关闭合瞬间,电压或电流的跳变就能用阶跃来建模。很多动态系统的响应测试,就是在输入端施加一个阶跃信号,观察输出怎么从旧稳态过渡到新稳态。
3.2 冲激函数:工程上的“无限窄脉冲”
冲激函数 δ(t) 的严格定义属于广义函数范畴,但工程上更直观的理解是把它看作一个宽度趋近于零、高度趋近于无穷、面积保持为 1 的极限脉冲。也就是说,它只在一个极短的瞬间里有“动作”,但这个动作的强度总和是 1。δ(t) 在 t ≠ 0 的地方取值为 0,在 t = 0 处“无限大”,但它本质是一个面积概念,不是普通意义上的函数值。
我们实际示波器上看到的尖峰脉冲,只要上升沿和宽度远小于系统的时间尺度,就可以近似当成冲激来用。给系统一个冲激输入,得到的输出就叫单位冲激响应 h(t)。这个 h(t) 极其重要——对于线性时不变系统,只要知道了 h(t),任何输入信号的响应都可以通过卷积算出来,等于系统全部“人格”都藏在这条波形里。
3.3 冲激的关键性质
冲激函数有几个高频出现的性质,每个都必须牢记:
- 取样性质(筛选性质):∫_{-∞}^{∞} x(t) δ(t - t₀) dt = x(t₀)。原因是 δ(t - t₀) 只在 t = t₀ 附近不为零,可以把 x(t) 在这个小邻域内近似看作常数 x(t₀),提出来之后剩下的积分就是 1。这个性质是整个采样理论的基础:所谓采样,本质上就是用一串冲激去“筛选”原信号在各个时刻的值。
- 偶函数性质:δ(-t) = δ(t)。
- 尺度变换性质:δ(at) = δ(t) / |a|。这是因为 δ(at) 的积分按变量替换后变成 1/|a|,要保持面积为 1,就得补一个系数。这在计算变量替换时非常常用。
- 与阶跃函数的关系:δ(t) = du(t) / dt,同时 u(t) = ∫_{-∞}^{t} δ(τ) dτ。一个跳变处的“导数”从普通微积分看是不存在的,但引入冲激之后,这一步就能统一起来。
- 冲激偶:δ'(t) 是单位冲激偶,它有性质 ∫ x(t) δ'(t) dt = -x'(0),这是通过分部积分推出来的。做某些积分题时会遇到,先记个印象。
做题的时候我的习惯动作是:遇到带冲激的积分,先判断冲激的落点 t₀ 在不在积分区间里。在区间内结果就是 x(t₀)(或对应的系数),不在区间内结果就是 0。这个判断只需要一秒,能避免大部分低级错误。
4. 信号的能量与功率:用“家底”衡量信号
前面几节都在讲信号长什么样,这一节换个视角,关心信号的“身家”。工程上经常要回答:这个信号到底有多大?但“大”怎么定义,对不同信号有不同回答。于是就有了能量信号与功率信号这套判定标准。
4.1 能量信号与功率信号的定义
把信号 x(t) 想象成加在 1 Ω 电阻上的电压或流过它的电流,那么瞬时功率是 |x(t)|²,在一段时间里消耗的能量就是 |x(t)|² 对时间的积分。沿用这个思路,整个时间轴上的总能量定义为:
E = ∫_{-∞}^{∞} |x(t)|² dt
平均功率定义为:
P = lim_{T→∞} (1 / 2T) ∫_{-T}^{T} |x(t)|² dt
如果总能量有限(0 < E < ∞),平均功率自然就是 0,这种信号叫能量信号。如果平均功率有限且非零(0 < P < ∞),总能量就是无穷大,这种信号叫功率信号。离散时间序列也有对应形式:E = Σ |x[n]|²,P = lim_{N→∞} 1 / (2N + 1) Σ_{n=-N}^{N} |x[n]|²。
这里有一个初学者容易混淆的点:一个信号要么是能量信号,要么是功率信号,但也存在既不是能量也不是功率的信号,比如指数增长信号 e^{t}u(t),能量和平均功率都发散,两边都不占。
4.2 几个典型信号的“身份判定”
我整理了一张表,把常见信号的身份判断结果列在一起,方便对照:
| 信号 | 能量 E | 平均功率 P | 判定结果 |
|---|---|---|---|
| 正弦信号 A cos(ωt + φ) | 无穷大 | A²/2 | 功率信号 |
| 单位阶跃 u(t) | 无穷大 | 1/2 | 功率信号 |
| 矩形脉冲 g_τ(t)(幅度1,宽度τ) | τ | 0 | 能量信号 |
| 衰减指数 e^{-at}u(t)(a>0) | 1/(2a) | 0 | 能量信号 |
| 指数增长 e^{t}u(t) | 无穷大 | 无穷大 | 两者都不是 |
判断思路其实只有两条:看能量积分是否收敛;若不收敛,再算平均功率是否有限非零。周期信号因为不断重复,能量必然发散,但平均功率是一个定值,所以周期信号基本都归入功率信号;而单个有限宽的脉冲信号只存在一段时间,能量有限,归入能量信号。阶跃信号虽然无限持续且不振荡,但平均功率恰好是 1/2,同样算功率信号。
你会发现一个规律:只要信号幅度不随时间衰减到零、并且无限持续,它基本都是功率信号;如果幅度在无限远处趋于零且积分收敛,它就更有可能是能量信号。这条经验比死记定义管用得多。
4.3 工程意义:为什么通信里常说功率
学这个分类不是纯粹为了做积分题,它直接决定你用什么工具去分析信号。通信系统关心手机发射功率、基站覆盖半径、信噪比,这些本质上都是平均功率层面的概念,因为射频信号是持续存在的功率信号。雷达系统则更经常讨论单个脉冲的能量,因为对回波做积累检测,能量够不够直接决定能否发现目标。
更进一步,能量信号可以定义能量谱密度,功率信号可以定义功率谱密度,这俩是后续“信号在频域的密度分布”这部分的入口。现在先把“到底是能量还是功率”这个问题想清楚,后面学随机信号和谱分析时就能少绕很多弯。
5. 基本信号不是孤立知识点:它们怎么串起整门课
讲到这里,基本信号本身差不多说完了,但我还是想再多聊几句:这些孤立的定义,最后是怎么变成整门课的主线的。因为如果只是背会每个信号的表达式,却不知道它们往后的用途,学过就忘是很正常的。
5.1 复指数信号是线性时不变系统的“特征函数”
先抛一个结论,这个结论后面系统分析章节会详细证明:线性时不变系统输入一个复指数信号 e^{st},输出仍然是同一形式的复指数信号,只是被乘上了一个复系数 H(s)。也就是说,复指数信号穿过线性时不变系统后,形状不改变,只有幅度缩放和相位移动。
这意味着什么?只要你把任意输入信号分解成一系列复指数信号的叠加,就能分别让每个分量穿过系统,再把输出叠加起来,从而得到总响应。这就是傅里叶分析最底层的逻辑。回头看,为什么前面要花那么大力气讲复指数和欧拉公式?因为整个频域分析的大厦都建立在这个“不改变形状”的性质上。拿光栅分解白光做类比,白光是各种频率光波的混合,棱镜把它们分开展示,系统分析干的是类似的事:把复杂信号分解成基本频率成分,分别看每个成分通过系统后受到什么影响。
5.2 冲激叠加是卷积积分的思想起点
另一条主线是由冲激函数引发的。前面讲了冲激的取样性质,现在反过来用:任意一个连续信号 x(t),都可以看成无穷多个不同时刻、不同强度冲激信号的叠加。数学表达式就是:
x(t) = ∫_{-∞}^{∞} x(τ) δ(t - τ) dτ
这式子猛一看有点绕,实际意思很直白:在每个时刻 τ,放置一个强度为 x(τ) 的冲激,把这些冲激全加起来,就还原出了 x(t)。这就是用“积木”思想构造任意信号。
由于线性时不变系统满足叠加性和时不变性,一个冲激输入产生冲激响应,多个冲激叠加输入就产生多个冲激响应的叠加。所以如果系统冲激响应是 h(t),那么任意输入 x(t) 的响应就是:
y(t) = ∫_{-∞}^{∞} x(τ) h(t - τ) dτ
这就是卷积积分。很多同学学卷积时觉得抽象,其实就是没意识到它背后的思想是“把信号拆成冲激,再把响应叠加起来”。这也是为什么冲激响应 h(t) 在系统分析中这么重要:只要知道 h(t),就等于了解到这个系统对所有信号的响应方式。
5.3 学习建议与配套仿真工具
从这篇开始,我强烈建议你养成一个习惯:每个基本信号都做到“时域表达式、波形图、常见性质”三位一体,别只对着公式干瞪眼。尤其像 Sa(t)、冲激函数这类不那么直观的信号,波形画一遍比自己默念十遍定义都管用。
我平时比较喜欢用 Python 快速验证波形,这里放一个最小示例,模仿本篇涉及的主要信号:
import numpy as np import matplotlib.pyplot as plt t = np.linspace(-6, 6, 2000) # 正弦信号:幅度2、频率0.5Hz、初相位45度 x_cos = 2 * np.cos(2 * np.pi * 0.5 * t + np.pi / 4) # 因果衰减指数信号:e^{-0.6t} u(t) x_exp = np.exp(-0.6 * t) * (t >= 0) # 抽样信号 Sa(t) = sin(t)/t,借助sinc函数时注意自变量换算 x_sa = np.sinc(t / np.pi) # 阶跃信号 x_step = (t >= 0).astype(float) plt.figure(figsize=(10, 6)) plt.plot(t, x_cos, label='x = 2cos(2π*0.5t + π/4)') plt.plot(t, x_exp, label='x = e^{-0.6t}u(t)') plt.plot(t, x_sa, label='Sa(t)') plt.plot(t, x_step, label='u(t)') plt.legend() plt.grid(True) plt.xlim(-6, 6) plt.ylim(-2.5, 2.5) plt.show()画完之后不要只看形状,要去验证几个关键值:找一下 Sa(t) 的过零点在不在 kπ 处,量一下正弦信号的周期是不是 2 秒,看看衰减指数信号e^{-0.6t}在 t = 1/0.6 附近是不是已经衰减到约 36.8%。这些细节,才是真正建立直觉的地方。
按我自己的体会,学基本信号最忌讳的就是“看着都懂,一做题就懵”。每次拿到一个新信号,先问自己三个问题:连续还是离散?周期还是非周期?能量还是功率?把这三个问题问完,解题路线基本就锁定了。基本信号这块地基打得越牢,后面学傅里叶变换、卷积、抽样定理的时候,你会明显感觉到阻力小很多。