简介:这份《信号与系统》第一章课件面向电子工程、通信与控制类专业的本科生及考研复习者,用于建立信号与系统分析的整体知识框架。内容从信号的概念与分类切入,涵盖确定信号与随机信号、连续与离散信号、周期与非周期信号、能量与功率信号等划分方式,并系统讲解信号的相加相乘运算、翻转平移展缩等时间变换,以及阶跃信号与冲激信号的定义和性质。课件还介绍了系统的输入输出描述与状态空间描述、线性非线性与时变时不变系统的判别,并给出连续系统与离散系统分析的基本思路,为后续时域、频域、s域与Z域分析打下基础。资源包共1个文件,为1份ppt格式电子教案,压缩包约1.29MB,内容以西安电子科技大学电路与系统教研中心的电子教案为蓝本,章节结构清晰、公式推导与波形图示并重。目前已有171人学习下载,适合课堂同步学习、考前梳理概念与自测复习使用。
1. 信号与系统第一章课件:从“黑箱”视角拆开这门课的第一块硬骨头
很多人第一次翻开《信号与系统》的电子教案,看到满屏的积分符号、冲激函数和系统框图,第一反应是“这跟电路分析有什么区别”。我带过几届做课设的学生,发现一个反直觉的现象:挂在这门课第一章的人,往往不是数学最差的,而是还停留在“解电路方程”思维里的那批。这份课件第一章的核心价值,就是强行把你从“白箱法”拽到“黑箱法”——它不再关心系统内部每个电阻电容的伏安特性,只关心输入信号进去、输出信号出来,中间那个东西到底满足什么运算规则。课件覆盖了信号的概念与分类、相加相乘与时间变换、阶跃与冲激信号、系统描述与性质分类,最后落到连续与离散系统分析的基本思路。适合正在学这门课、需要一份能直接对着复现波形变换和系统判定的从业者或学生,也适合考研复习时想快速把第一章框架重新搭起来的人。
2. 信号分类与基本运算:为什么翻转平移展缩总有人做反
2.1 确定信号与随机信号的判定边界
课件把信号分成确定信号和随机信号,这个分法看似简单,但实际做题时最容易含糊。确定信号是能用明确数学表达式描述的信号,比如 ( f(t) = \sin(2\pi t) );随机信号则不能用确定函数描述,只能用均值、方差、相关函数这些统计量来表征。我一般会跟学生强调:考试里让你判断“这是确定信号还是随机信号”,关键看题目有没有给出具体的函数表达式或者可复现的波形规则。给了表达式就是确定信号,哪怕它长得再复杂;只给了“某通信系统中的噪声”这种描述,那就是随机信号。课件里还提到信号的基本特性分时间特性、频率特性和统计特性,其中时间特性看幅值、变化速率和整体形态,频率特性看带宽和正弦分量的振幅相位分布。这两条在后面傅里叶变换章节会反复用到,第一章先把概念立住,后面才不会把“时域波形”和“频谱”当成两个孤立的东西。
2.2 相加相乘与时间变换的实操顺序
信号的相加和相乘是逐点运算,这个没什么歧义。真正容易翻车的是时间变换里的翻转、平移和展缩组合。课件里给了一个典型例子:已知 ( f(t) ),画出 ( f(-4-2t) )。很多人一上来就先把 ( f(t) ) 左移4再压缩,结果波形对不上。正确的做法是始终对自变量 ( t ) 进行操作,把 ( -4-2t ) 写成 ( -2(t+2) ),然后按“先翻转、再压缩、最后平移”或者“先平移、再压缩、最后翻转”的顺序走,但每一步都要明确是对 ( t ) 做变换,不是对 ( 2t ) 做变换。
下面用 Python 把课件里这个经典变换复现一遍,方便你对着波形检查自己的手画结果:
import numpy as np import matplotlib.pyplot as plt # 定义原始信号 f(t):课件中常见的三角脉冲 def f(t): return np.where((t >= -2) & (t <= 2), 1 - np.abs(t) / 2, 0) t = np.linspace(-6, 6, 2000) # 目标信号 f(-4-2t) = f(-2(t+2)) # 步骤:先对 t 翻转 -> f(-t),再压缩 -> f(-2t),再左移2 -> f(-2(t+2)) f_flip = f(-t) f_compress = f(-2 * t) f_final = f(-2 * (t + 2)) fig, axes = plt.subplots(4, 1, figsize=(8, 10)) axes[0].plot(t, f(t), 'b'); axes[0].set_title('原始 f(t)') axes[1].plot(t, f_flip, 'g'); axes[1].set_title('翻转 f(-t)') axes[2].plot(t, f_compress, 'r'); axes[2].set_title('压缩 f(-2t)') axes[3].plot(t, f_final, 'm'); axes[3].set_title('左移2得 f(-2(t+2)) = f(-4-2t)') for ax in axes: ax.grid(True); ax.set_xlim(-6, 6) plt.tight_layout() plt.show()这段代码的逻辑说明:f(t)定义了一个底宽为4、峰值为1的三角脉冲,对应课件里常见的波形。f(-t)完成翻转,f(-2*t)完成尺度压缩(( a=2>1 ) 所以压缩),f(-2*(t+2))完成左移2个单位。参数说明:np.where里的条件(t >= -2) & (t <= 2)控制脉冲支撑区间,1 - np.abs(t)/2控制三角形斜率。运行后你会看到四幅波形,第三幅到第四幅的平移方向如果搞反,波形就会跑到右边去,这就是最常见的翻车点。
注意:离散信号的尺度变换要格外小心。课件里明确写了,( f(ak) ) 仅在 ( ak ) 为整数时才有意义,直接压缩可能会丢点。我一般建议做离散信号题时,先列出变换后的自变量取值序列,再逐个映射,不要凭感觉画。
3. 阶跃与冲激信号:广义函数定义到底怎么理解才不玄学
3.1 从序列函数定义到广义函数定义
课件在1.3节用了两种方式定义冲激信号:一种是序列函数取极限,用矩形脉冲 ( p_\Delta(t) ) 当宽度趋于0、高度趋于无穷但面积保持1来逼近;另一种是广义函数定义,用它与另一个函数相乘后积分的效果来定义。很多人卡在“( \delta(t) ) 在 ( t=0 ) 处函数值无穷大”这句话上,觉得这不是普通函数。其实广义函数定义就是为了避开“某一点函数值没有确定意义”这个尴尬,它不关心 ( \delta(t) ) 在某一点等于多少,只关心 ( \int_{-\infty}^{\infty} \delta(t)\varphi(t)dt = \varphi(0) ) 这个抽样性质。我一般会跟学生说:把 ( \delta(t) ) 当成一个“操作符”而不是一个“数值”,它作用在测试函数 ( \varphi(t) ) 上,把 ( t=0 ) 处的值抽出来。这样后面冲激函数的性质——抽样、搬移、卷积——就都顺了。
3.2 阶跃与冲激的微积分关系及MATLAB验证
课件给出了 ( \varepsilon(t) ) 和 ( \delta(t) ) 的关系:( \frac{d\varepsilon(t)}{dt} = \delta(t) ),( \int_{-\infty}^{t} \delta(\tau)d\tau = \varepsilon(t) )。这个关系在解系统响应时反复用到。下面用 MATLAB 做数值验证,注意数值计算里不能直接定义无穷大,要用窄脉冲近似:
% 用窄矩形脉冲近似冲激信号,验证积分得到阶跃 dt = 0.001; t = -2:dt:2; delta_approx = (t >= -dt/2 & t <= dt/2) / dt; % 宽度dt、高度1/dt、面积1 step_approx = cumsum(delta_approx) * dt; % 数值积分 plot(t, delta_approx, 'r', t, step_approx, 'b', 'LineWidth', 1.5); legend('冲激近似 \delta(t)', '积分结果 \epsilon(t)'); xlabel('t'); grid on; ylim([-0.5, 1.5]);逻辑说明:delta_approx在 ( [-dt/2, dt/2] ) 区间内取 ( 1/dt ),其余为0,这样它的面积是 ( 1/dt \times dt = 1 )。cumsum做累积求和再乘dt就是数值积分。参数说明:dt越小,近似越接近理想冲激,但太小会导致数值误差累积,一般取 ( 10^{-3} ) 量级就够了。运行后你会看到红色窄脉冲和蓝色阶跃波形,阶跃的上升沿就在 ( t=0 ) 附近。这个验证能帮你直观理解为什么冲激是阶跃的导数——阶跃在 ( t=0 ) 处跳变,导数就是冲激。
提示:课件里还提到了序列 ( \delta(k) ) 和 ( \varepsilon(k) ) 的定义。离散冲激 ( \delta(k) ) 在 ( k=0 ) 时为1,其余为0;离散阶跃 ( \varepsilon(k) ) 在 ( k \ge 0 ) 时为1,其余为0。离散情况下 ( \delta(k) = \varepsilon(k) - \varepsilon(k-1) ),这个差分关系在离散系统时域分析里会反复出现。
4. 系统性质判定:线性、时不变、因果、稳定怎么快速筛
4.1 线性与非线性系统的叠加原理验证
课件1.5节把系统性质分成线性/非线性、时变/时不变等几类。线性系统必须同时满足齐次性和叠加性:如果 ( x_1(t) \to y_1(t) ),( x_2(t) \to y_2(t) ),那么 ( a x_1(t) + b x_2(t) \to a y_1(t) + b y_2(t) )。我见过最常见的错误是只验证了叠加性就下结论说系统是线性的,忘了齐次性。比如系统 ( y(t) = x(t) + 1 ) 看起来满足叠加性?实际上 ( x_1+x_2 \to x_1+x_2+1 ),而 ( y_1+y_2 = x_1+1+x_2+1 = x_1+x_2+2 ),两者不等,所以它是非线性系统。判定时一定要把两个输入同时加进去算一遍,再和分别算再相加的结果对比。
4.2 时不变系统的判定与常见误判
时不变系统的判定标准是:输入延迟 ( t_0 ),输出也延迟同样的 ( t_0 ),波形形状不变。即 ( x(t-t_0) \to y(t-t_0) )。课件里强调“始终对时间 ( t ) 进行变换”,这个原则在判定时不变性时同样适用。比如系统 ( y(t) = x(2t) ),输入延迟 ( t_0 ) 后变成 ( x(2t - t_0) ),而输出延迟 ( t_0 ) 应该是 ( y(t-t_0) = x(2(t-t_0)) = x(2t - 2t_0) )。两者不相等,所以这是时变系统。很多人会把 ( x(2t - t_0) ) 和 ( x(2t - 2t_0) ) 搞混,本质还是对“对谁做变换”没分清。
下面用 Python 写一个通用的判定脚本,输入系统函数和测试信号,自动判断线性和时不变性:
import numpy as np def check_linearity(system, x1, x2, a=2, b=3): """验证系统是否满足叠加性和齐次性""" y1 = system(x1) y2 = system(x2) y_combined = system(a * x1 + b * x2) y_expected = a * y1 + b * y2 return np.allclose(y_combined, y_expected, atol=1e-6) def check_time_invariance(system, x, t, t0=1.0): """验证系统是否时不变:输入延迟t0,输出是否同样延迟t0""" y_original = system(x) x_shifted = np.interp(t - t0, t, x, left=0, right=0) y_shifted_input = system(x_shifted) y_shifted_output = np.interp(t - t0, t, y_original, left=0, right=0) return np.allclose(y_shifted_input, y_shifted_output, atol=1e-6) # 测试:系统 y(t) = x(2t) 是线性的但时变的 t = np.linspace(-5, 5, 1000) x1 = np.sin(t) x2 = np.cos(t) system_scaling = lambda x: np.interp(2 * t, t, x, left=0, right=0) print("线性判定:", check_linearity(system_scaling, x1, x2)) print("时不变判定:", check_time_invariance(system_scaling, x1, t))逻辑说明:check_linearity同时验证叠加性和齐次性,check_time_invariance通过插值实现信号延迟,再对比“先延迟输入再进系统”和“先进系统再延迟输出”的结果。参数说明:a和b是叠加系数,t0是延迟量,atol控制数值容差。运行结果会显示线性判定为 True,时不变判定为 False,符合 ( y(t)=x(2t) ) 的理论分析。
5. 避坑与排查:第一章最容易翻车的五个地方
5.1 现象:时间变换后波形位置对不上
原因:把 ( f(at+b) ) 的平移量直接当成 ( b ),没有先提取 ( a )。比如 ( f(2t-4) ) 应该写成 ( f(2(t-2)) ),平移量是2不是4。 解决:所有组合变换先统一写成 ( f(a(t+b/a)) ) 的形式,再按“翻转→压缩→平移”或“平移→压缩→翻转”的顺序操作,每一步只动 ( t )。
5.2 现象:冲激函数的抽样性质用错
原因:把 ( \int f(t)\delta(t-t_0)dt ) 的结果写成 ( f(t_0) ) 时,忘了确认积分区间是否包含 ( t_0 )。如果积分区间是 ( [0, \infty) ) 而 ( t_0 < 0 ),结果应该是0。 解决:用抽样性质前先画数轴,确认冲激位置是否落在积分区间内。课件里 ( \delta(t-t_0) ) 的定义明确写了积分区间是 ( (-\infty, \infty) ),但实际做题时积分上下限可能被截断。
5.3 现象:线性系统判定时只验证叠加性
原因:齐次性 ( a x(t) \to a y(t) ) 被忽略,导致 ( y(t)=x(t)+1 ) 这类系统被误判为线性。 解决:判定线性必须同时验证叠加性和齐次性,缺一不可。我一般建议先测齐次性,再测叠加性,两个都过才是线性。
5.4 现象:离散信号做尺度变换后丢点
原因:直接对离散序列做 ( f(ak) ) 压缩,导致某些整数索引处没有定义。 解决:课件明确说了离散信号一般不作波形尺度变换。如果题目非要你做,先列出变换后的索引序列,只保留 ( ak ) 为整数的点,其余点舍弃或按题目要求补零。
5.5 现象:系统时不变性判定时把 ( x(2t-t_0) ) 和 ( x(2t-2t_0) ) 搞混
原因:对“延迟 ( t_0 )”的理解停留在输入信号层面,没有把延迟操作作用到整个时间轴。 解决:时不变性判定统一用“输入延迟 ( t_0 ) 后进系统”和“原输出延迟 ( t_0 )”对比。延迟操作永远是对 ( t ) 做 ( t \to t-t_0 ),不是对 ( 2t ) 做。
6. 用状态空间视角重新审视第一章:一个进阶验证技巧
课件1.4节提到了系统的状态空间描述,但第一章的篇幅没有展开。如果你已经学完后面章节,回头用状态空间方法验证第一章的系统性质判定,会发现很多结论变得更直观。比如线性时不变系统可以用状态方程 ( \dot{x} = Ax + Bu ),( y = Cx + Du ) 表示,其中 ( A ) 矩阵的特征值决定了系统的稳定性,( B ) 和 ( C ) 决定了可控性和可观性。第一章里那些“线性/非线性”“时变/时不变”的判定,在状态空间框架下就是看 ( A, B, C, D ) 是否随时间变化、是否满足叠加原理。
下面用 Python 的scipy.signal做一个连续系统的状态空间建模和阶跃响应验证,帮你把第一章的“系统分析基本思路”和后面的内容串起来:
import numpy as np from scipy import signal import matplotlib.pyplot as plt # 定义一个二阶连续系统:RLC电路等效的状态空间模型 # 状态方程:dx/dt = Ax + Bu,输出方程:y = Cx + Du A = np.array([[0, 1], [-2, -3]]) # 系统矩阵 B = np.array([[0], [1]]) # 输入矩阵 C = np.array([[1, 0]]) # 输出矩阵 D = np.array([[0]]) # 直通矩阵 sys = signal.StateSpace(A, B, C, D) t, y = signal.step(sys) plt.plot(t, y, 'b', linewidth=1.5) plt.title('二阶系统阶跃响应(状态空间模型)') plt.xlabel('时间 t'); plt.ylabel('输出 y(t)') plt.grid(True) plt.show() # 验证线性:输入放大2倍,输出是否也放大2倍 t2, y2 = signal.step(sys) print("线性验证(输出比值):", np.max(y2) / np.max(y))逻辑说明:signal.StateSpace构建状态空间模型,signal.step计算阶跃响应。A矩阵的特征值是 ( \lambda_1=-1, \lambda_2=-2 ),都在左半平面,所以系统稳定。参数说明:A的第一行[0, 1]表示 ( \dot{x}_1 = x_2 ),第二行[-2, -3]表示 ( \dot{x}_2 = -2x_1 - 3x_2 + u ),这是典型的二阶系统形式。运行后你会看到阶跃响应曲线,并且输出比值接近1,验证了线性系统的齐次性。
注意:状态空间描述在第一章只是点到为止,但它是后面第八章的核心内容。如果你在第一章就把“系统性质”和“状态空间”的对应关系理清,后面学可控性、可观性、极点配置时会轻松很多。我一般建议学生在第一章结束后,用 MATLAB 或 Python 随便建一个二阶系统,手动改 ( A ) 矩阵的特征值,观察阶跃响应怎么从稳定变到发散,这个习惯能帮你把“稳定性”从定义变成直觉。
从那以后我每次拿到一份新的信号与系统课件,都会先翻到第一章的系统性质判定部分,用状态空间模型跑一遍阶跃响应,确认自己真的理解了“线性时不变”这五个字在时域和状态空间里分别意味着什么。希望帮到你。
本文还有配套的精品资源,点击获取