
简介这份华南理工大学信号与系统实验报告五面向正在修读信号与系统课程、需要完成MATLAB仿真实验的本科生与考研复习者聚焦离散傅里叶变换、连续时间系统响应与零极点分析三大核心内容。资源包内含1个doc文档大小约678KB完整记录了实验目的、实验内容、MATLAB代码与结果图像便于对照复现与整理。实验部分先用DFT分析离散信号x[k]的频谱并讨论改善误差的方法再借助tf2ss、lsim等函数计算微分方程描述系统的响应并与理论值比较随后针对阶跃、正弦、指数等不同输入验证系统输出最后通过zpk、tf与pzmap研究零极点分布对稳定性和频率选择性的影响。已有882人学习下载适合需要参考实验步骤、代码实现与误差分析思路的同学查漏补缺。1. 从微分方程到零极点图这份实验报告真正想训练什么很多人做信号与系统实验时习惯把 MATLAB 当计算器用敲完lsim看曲线和理论值贴不贴合截图交差。但华南理工大学这份实验报告五的设计意图恰恰相反——它用四道题把「连续系统分析」这条链路完整串了一遍先用微分方程和tf2ss建立状态空间模型验证时域响应再用tf加lsim处理不同输入下的输出接着用zpk/pzmap把系统特性压缩到 s 平面上的零极点分布最后反过来用零极点位置去凑一个满足幅频指标的高通和低通滤波器。换句话说它训练的不是某个函数怎么调而是「给定一个连续系统你能不能从微分方程一路推到频响曲线再从频响指标反推零极点配置」。适合正在做信号与系统实验的本科生也适合想重新梳理连续系统分析流程的工程师——尤其是那些平时用 Simulink 搭模型、但说不清零极点为什么决定稳定性的人。2. 微分方程与传递函数的 MATLAB 建模tf2ss、lsim 与理论解对比2.1 从微分方程到状态空间为什么先做 tf2ss实验第一题给的微分方程是 y(t) 10y(t) 2x(t)初始状态 y(0⁻) 1输入 x(t) u(t)。手算的话拉氏变换后 Y(s) 2X(s)/(s10) y(0⁻)/(s10)代入 X(s) 1/s 再部分分式展开得到 y(t) 1/5 (4/5)e^(-10t)。MATLAB 里要复现这个结果关键一步是把传递函数转成状态空间因为lsim对状态空间模型处理初始条件最直接。% 微分方程 y 10y 2x初始条件 y(0-) 1 a [1, 10]; % 分母系数s 10 b [2]; % 分子系数2 c [1]; % 初始状态对应 y(0-) 1 [A, B, C, D] tf2ss(b, a); % 转为状态空间 sys ss(A, B, C, D); t 0:0.001:10; x t 0; % 阶跃输入t0 时为 1 y lsim(sys, x, t, c); % 带初始条件仿真tf2ss返回的 A、B、C、D 是可控标准型c作为第四个参数传给lsim表示初始状态向量。这里有个容易踩的坑lsim的初始条件参数要求维度与状态数一致一阶系统传标量1可以高阶系统必须传列向量。另外t 0生成的是逻辑数组MATLAB 会自动转成 double但如果你写x t 0t0 那一点也会被算进去阶跃在零点的定义差异会让误差曲线在起始处多一个尖峰。2.2 误差曲线的读法为什么起始误差大、后面收敛跑完第一题会看到误差 k y - yt 在 t 很小时比较大随后迅速衰减。这不是代码写错了而是数值积分器在初始阶段对刚性方程的适应过程。方程的时间常数是 1/10 0.1 秒而步长取了 0.001 秒步长与时间常数之比约 1%理论上精度足够但lsim默认用的 ode45 是变步长求解器起步阶段会自动缩小步长导致前几个采样点的数值解和解析解有微小相位差。把步长改成 0.0001 秒或者改用ode15s处理刚性方程起始误差会明显减小。参数含义调整建议步长 0.001采样间隔刚性系统建议 1e-4 或更小初始状态 cy(0⁻)高阶系统需传列向量求解器lsim 默认 ode45刚性可换 ode15s输入 x阶跃信号注意 t0 点的定义提示lsim返回的 y 是列向量画图时如果和行向量 t 直接运算会报维度错误记得转置。2.3 多输入对比tf 与 lsim 处理阶跃、正弦、指数第二题的系统函数是 H(s) (4s1)/(s³3s²2s)分母有 s 因子说明系统在原点有一个极点属于临界稳定。三种输入分别对应阶跃、正弦和衰减指数代码结构很统一a [1, 3, 2, 0]; % s^3 3s^2 2s b [4, 1]; % 4s 1 sys tf(b, a); t 0:0.01:5; x1 t 0; % 阶跃 x2 sin(t) .* (t 0); % 正弦t0 时有效 x3 exp(-t) .* (t 0); % 衰减指数 y1 lsim(sys, x1, t); y2 lsim(sys, x2, t); y3 lsim(sys, x3, t);注意.* (t 0)这个写法它把 t≤0 的部分强制置零模拟因果输入。如果不加这个掩码正弦信号在 t0 也有值lsim会从负时间开始积分结果完全不对。理论解里那些.* (t 0)也是同样的道理——解析表达式只在 t0 成立画图时用掩码截断才能和数值解对齐。三种输入的误差都小于 0.001说明tflsim这套组合对线性时不变系统足够可靠。3. 零极点分布与稳定性判断zpk、pzmap 与 freqs 的联合使用3.1 用 zpk 和 tf 建立系统函数第三题给了六组零极点配置要求建立系统函数、画零极点图、判断稳定性、画幅频和冲激响应。这里zpk和tf的分工要搞清楚zpk用零点、极点、增益直接构造模型适合从零极点描述出发tf用分子分母系数构造适合从多项式出发。两者可以互相转换。% 以 (d) 为例共轭极点 -0.5 ± 5j增益 1 z []; % 无零点 p [-0.55j, -0.5-5j]; % 共轭极点 k 1; sys_zpk zpk(z, p, k); % 零极点形式 sys_tf tf(sys_zpk); % 转为传递函数形式 pzmap(sys_zpk); % 画零极点图zpk的第三个参数是增益不是传递函数的首项系数。对于 (e) 和 (f) 这种带零点的系统零点用z 0.5或z -0.5传入zpk会自动展开成 (s - z) 的形式。如果手写b [1, -0.5]和a conv([1, 0.15j], [1, 0.1-5j])效果一样但conv展开共轭极点时要注意符号——conv([1, -0.55j], [1, -0.5-5j])得到的是 s² s 25.25对应极点 -0.5 ± 5j。3.2 稳定性判据极点实部符号决定一切六组配置的稳定性判断可以归纳成一张表配置极点位置稳定性冲激响应形态(a)s -0.1稳定单调衰减(b)s 0临界稳定阶跃不衰减(c)s ±5j临界稳定等幅振荡(d)s -0.5 ± 5j稳定衰减振荡(e)s -0.1 ± 5j稳定衰减振荡(f)s 0.1 ± 5j不稳定发散振荡判断依据很简单所有极点实部小于零则稳定有极点实部大于零则不稳定实部等于零且为单阶极点则临界稳定。实验报告里写「a-e 的极点都在 jw 右侧」其实是笔误应该是「jw 轴左侧」——从代码看(a)(d)(e) 的极点实部都是负的(b)(c) 在虚轴上(f) 的极点在右半平面。这个细节在写报告时容易被扣分建议对着pzmap的图逐个确认。3.3 freqs 画幅频特性频率范围怎么选freqs是模拟滤波器频率响应函数和freqz数字滤波器容易搞混。它的调用格式是[H, w] freqs(b, a)b 和 a 是传递函数的分子分母系数返回的 w 是自动选取的频率点。b [1]; a [1, 0.1]; % 极点 s -0.1 [H, w] freqs(b, a); plot(w, abs(H)); xlabel(w); ylabel(幅频响应);自动选取的 w 范围通常覆盖 -100 到 100 rad/s但对于极点靠近虚轴的系统比如 (d) 的 -0.5 ± 5j谐振峰在 w ≈ 5 rad/s 附近自动范围够用。如果极点非常靠近虚轴比如实部只有 -0.01谐振峰会非常尖锐自动频率点可能采不到峰值这时候要手动指定w logspace(-1, 2, 1000)再传给freqs(b, a, w)。冲激响应用impulse(sys, t)时间向量 t 的终点要至少覆盖 5 倍时间常数否则看不到衰减完整过程。4. 从零极点配置反推滤波器freqs 迭代与指标验证4.1 高通滤波器的零极点试探第四题要求设计一个 2 零点 2 极点的高通滤波器指标是 |H(j0)| ≤ 0.8、|H(j∞)| ≥ 1.2、|H(j100)| ≤ 0.8。高通滤波器的零极点分布规律是零点在原点或靠近原点极点在左半平面。2 个零点放原点传递函数分子就是 s²2 个极点放左半平面分母是 (s - p1)(s - p2)。% 高通滤波器试探2 零点在原点2 极点在左半平面 b [1, 0, 0]; % s^2 a [1, 340, 127496]; % 极点约 -170 ± 320j [H, w] freqs(b, a); plot(w, abs(H));分母[1, 340, 127496]对应的极点是 -170 ± 320j自然频率约 362 rad/s。在 w100 处|H| 大约 0.78满足 ≤ 0.8在 w 很大时|H| 趋近于 1但指标要求 ≥ 1.2所以这个配置其实不满足高频增益要求。要抬高高频增益可以把极点往原点方向移或者加一个增益系数。常见做法是调整分母系数让极点实部更小比如a [1, 200, 40000]极点 -100 ± 173j再乘一个增益 k1.5高频增益就能上去。4.2 低通滤波器的零极点配置低通滤波器的指标是 |H(j0)| 在 0.8 到 1.2 之间、|H(j∞)| ≤ 0.1、|H(j10)| ≥ 0.8。低通滤波器的零极点规律是极点全在左半平面零点可以在无穷远即分子为常数。一个简单的二阶低通是 H(s) 10/(s² 3s 10)极点 -1.5 ± 2.78j自然频率 √10 ≈ 3.16 rad/s。b [10]; a [1, 3, 10]; [H, w] freqs(b, a); plot(w, abs(H));在 w0 处 |H| 1满足 0.8~1.2在 w10 处 |H| ≈ 10/√(100-10)² 900 ≈ 10/95 ≈ 0.105不满足 ≥ 0.8。要满足 w10 处增益 ≥ 0.8截止频率必须高于 10 rad/s比如把自然频率提到 20 rad/s分母改成[1, 6, 400]再调增益。这个过程就是实验报告里说的「重复该过程直至找到满足指标的零极点」——本质是手动迭代每次改完用freqs画图看三个关键频点的值。4.3 零极点抵消与 ROC 变化思考题第 5 问提到零极点抵消会改变 ROC。举个例子H(s) (s1)/((s1)(s2))表面上看零点 -1 和极点 -1 抵消剩下 1/(s2)ROC 是 Re(s) -2。但如果抵消前考虑原系统在 s-1 处有零极点对消ROC 可能变成 Re(s) -1稳定性判断会变。MATLAB 里minreal函数可以自动做零极点对消sys tf([1, 1], conv([1, 1], [1, 2])); sys_min minreal(sys); % 消去零极点对minreal会输出抵消后的最小实现但要注意它默认容差是 sqrt(eps)如果零极点非常接近但不完全相等可能不会被消掉。工程上遇到这种情况要么手动检查零极点距离要么调大容差参数。5. 实验排错与进阶技巧从误差曲线到自动化验证5.1 误差曲线的三种典型形态第一题和第二题都画了误差曲线实际做实验时误差形态能反映不同问题。第一种是起始尖峰后迅速衰减这是数值积分器起步阶段的正常现象减小步长即可改善。第二种是误差随时间线性增长通常出现在临界稳定系统比如第二题有原点极点因为数值积分对不衰减分量的累积误差会越来越大这时候要改用解析解验证或者缩短仿真时间。第三种是误差在某个频率附近周期性振荡多半是输入信号的频率和系统自然频率接近产生了拍频检查sin(t)的频率和极点虚部是否接近。5.2 用脚本批量验证六组零极点配置第三题有六组配置手动一组组跑容易漏。可以写个循环批量处理configs { {[], -0.1, 1}, % (a) {[], 0, 1}, % (b) {[], [5j, -5j], 1}, % (c) {[], [-0.55j, -0.5-5j], 1}, % (d) {0.5, [-0.15j, -0.1-5j], 1}, % (e) {-0.5, [0.15j, 0.1-5j], 1} % (f) }; for i 1:length(configs) z configs{i}{1}; p configs{i}{2}; k configs{i}{3}; sys zpk(z, p, k); figure; subplot(3,1,1); pzmap(sys); subplot(3,1,2); [H,w] freqs(tf(sys)); plot(w, abs(H)); subplot(3,1,3); impulse(sys, 0:0.1:10); end这个循环把零极点图、幅频响应、冲激响应画在同一张图的三个子图上方便对比。注意freqs(tf(sys))这里tf(sys)把 zpk 转成 tf 再传给 freqs因为 freqs 只接受分子分母系数形式。如果直接用freqs(sys)会报错。5.3 滤波器设计的自动化指标检查第四题的手动迭代可以写成自动检查函数给定零极点后直接输出三个关键频点的增益function check_filter(b, a, freqs_check, targets) [H, w] freqs(b, a, freqs_check); gains abs(H); for i 1:length(freqs_check) fprintf(w%.1f, |H|%.4f, 目标 %.2f\n, ... freqs_check(i), gains(i), targets(i)); end end调用时传入b、a、检查频率点和目标值比如高通滤波器检查[0, 100, 1e6]对应[0.8, 0.8, 1.2]。这样每次改完系数跑一下不用手动看图估读。freqs的第三个参数指定频率点后返回的 H 就是这些点上的响应值比自动选点更精确。实际调试时先把极点自然频率设在指标频率附近再微调增益和阻尼比通常三五次迭代就能满足。本文还有配套的精品资源点击获取