简介:这份资源是面向通信工程、电子信息工程等专业本科生与研究生的连续时间LTI系统综合实验报告,帮助读者在掌握信号与系统基础理论后,借助Matlab完成时域与频域的综合分析训练。内容围绕稳定4~6阶系统的零极点设计展开,涵盖直接、级联、并联三种实现结构的信号流图与仿真对比,并延伸到阶跃响应、参数微变下的稳定性敏感性、周期信号频谱分析、LTI滤波器设计及音频信号频谱分析等环节,配有实验步骤、代码与结果分析。资源包共1个docx文档,约2.62MB,以完整实验报告形式呈现,结构清晰,便于对照复现与课堂参考。目前已有1303人学习,适合需要巩固系统函数、频率特性与滤波器设计思路的读者参考借鉴。
1. 一个极点挪了万分之一,系统怎么就“变脸”了
把传递函数的分母系数改动万分之一,幅频响应几乎看不出来,阶跃响应也稳如老狗;可同样的扰动加在另一个结构上,极点直接越过虚轴,系统从稳定滑向发散。这不是玄学,是连续时间 LTI 系统实现结构对参数敏感性的真实写照。这份综合实验报告把时域分析、频域分析、零极点分布、直接/级联/并联三种结构、滤波器设计、音频信号处理串成一条线,核心就在回答一个问题:同一个 H(s),为什么换个画法,鲁棒性天差地别。搞懂这条线,你再看任何滤波器代码,都会先问一句——它到底用哪种结构落地。
2. 零极点分布:系统稳定性和频率特性的“黑匣子”
2.1 极点位置如何决定时域响应的衰减与增长
连续因果 LTI 系统的系统函数 H(s) 是有理分式,做部分分式展开后,每一项对应一个极点 p_i,时域里就变成 e^{p_i t} 乘上某个多项式。极点实部为负,指数衰减;实部为正,指数增长;实部为零,等幅振荡。这条结论几乎所有教材都写,但真正值得琢磨的是“二重及以上”这个限定词。
单极点落在虚轴上,响应是等幅正弦,系统临界稳定,严格说不是 BIBO 稳定,但至少不发散。可一旦虚轴上出现二重极点,时域里会多出一个 t 因子,t·sin(ωt) 的包络随 t 线性增长,直接发散。所以判据要写成:右半平面有极点,或虚轴上有二重及以上极点,系统不稳定;全部极点严格位于左半平面,系统稳定。实验里设计的那对靠近虚轴的共轭极点,实部是 -0.1,属于“贴着边界但还在里面”,这种极点最危险——它让系统稳定,却让稳定裕度极小,任何系数扰动都可能把它推过虚轴。
从机制上看,极点实部就是衰减因子 σ,虚部就是振荡频率 ω。极点离虚轴越近,σ 越接近 0,衰减越慢,时域拖尾越长,频域上对应一个又尖又高的谐振峰。这就是为什么“靠近虚轴的共轭极点”会成为实验的强制要求:它把稳定性问题从“会不会崩”变成“离崩有多远”,逼你去观察参数敏感性。
2.2 幅频响应的峰谷从哪来:零点极点与虚轴的距离博弈
幅频响应 |H(jω)| 的本质,是 s 平面上点 jω 沿虚轴滑动时,到各零点、极点的距离之积比。分子是到零点的距离乘积,分母是到极点的距离乘积。这个几何图像一建立,峰谷就全解释通了。
极点靠近虚轴,当 jω 滑到极点正下方(ω 等于极点虚部)时,分母距离最小,|H| 出现峰值;零点靠近虚轴,滑到零点正下方时分子距离最小,|H| 出现谷值。实验里那个 H(s)=(s²-0.2s+1.97)/(s²+0.2s+1.01),零点在 0.1±j,极点在 -0.1±1.4j,零点虚部是 1,极点虚部是 1.4,所以幅频在 ω≈1 附近被零点压出谷,在 ω≈1.4 附近被极点顶出峰,整体呈现带阻倾向——低频和高频都能过,中间某段被削掉。
还有一条容易被忽略的规则:如果零点和极点非常靠近,或者关于虚轴对称,它们对幅频的影响会互相抵消,曲线反而平坦。这解释了为什么“所有零极点都远离虚轴”时幅频平坦——距离都大,沿虚轴滑动时距离变化相对小,比值就稳。反过来,一个孤零零靠近虚轴的极点,附近没有零点来“对冲”,峰值就会非常尖锐,相频在该频率处急剧下降。这套几何直觉,比背公式有用得多。
2.3 用 ilaplace 和 fourier 把 H(s) 翻译成时域与频域
实验里最核心的一段代码,是把符号传递函数直接变成冲激响应和频谱:
syms s t w Hs = (2.8*s + 1.99) / ((s^2 + 0.2*s + 0.01) * (s + 1) * (s + 2)); h = ilaplace(Hs) * heaviside(t); % 拉氏逆变换得到冲激响应,乘阶跃保证因果 Hw = fourier(h); % 对冲激响应做傅里叶变换得到频率响应 H1 = abs(Hw); % 幅频 P = angle(Hw); % 相频这里有几个机制点值得说透。第一,ilaplace做的是单边拉氏逆变换,默认结果定义在 t≥0,乘heaviside(t)是把因果性显式钉死,避免符号引擎给出双边解。第二,fourier(h)能成立的前提是 h(t) 绝对可积,也就是系统稳定——极点全在左半平面。如果系统不稳定,h(t) 发散,傅里叶变换不存在,这一步会直接翻车。所以这段代码本身就是稳定性的一个隐式检验。第三,abs和angle分别取模和相角,注意angle返回的是弧度,画图时若要标度数得乘 180/pi。
分母展开后是 s⁴+3.2s³+3.41s²+0.62s+0.01,四个极点:一对共轭复极点约 -0.1±j0.0(实部 -0.1,虚部接近 0,因为 s²+0.2s+0.01 的判别式接近零),外加 -1 和 -2 两个实极点。那对复极点实部 -0.1、虚部极小,几乎贴在负实轴靠近虚轴的位置,正是“靠近虚轴”的设计意图。冲激响应里它会贡献一个缓慢衰减的振荡项,阶跃响应则表现为长拖尾。
3. 三种实现结构:同一个 H(s),三种“脾气”
3.1 直接型、级联型、并联型的信号流图差异
同一个传递函数,数学上唯一,实现上不唯一。直接型(直接 II 型)把分子分母系数直接塞进一条链,共享延迟单元,延迟器最少,但所有系数耦合在一起;级联型把 H(s) 拆成若干二阶基本节相乘,每个基本节管一对零极点;并联型做部分分式展开,拆成若干一阶或二阶节相加,每个节管一个极点(零点由各节共同贡献)。
信号流图上的差别很直观:直接型的反馈路径把所有极点“绑”在一起,改一个分母系数,所有极点的位置同时被牵动;级联型每个二阶节的系数只影响自己那对零极点,改一个节,别的节纹丝不动;并联型同理,每个支路独立。这就是“独立调整零极点”的物理含义——不是数学技巧,是拓扑隔离。
实验里用tf2sos把直接型转成二阶节矩阵,再用sos2tf转回来,用tf2zp/zp2tf在零极点形式和多项式形式之间来回切换,目的就是拿到三种结构各自的系数向量,分别做扰动实验。tf2sos返回的 sos 矩阵每行是 [b0 b1 b2 a0 a1 a2],对应一个二阶节;G 是总增益。这个矩阵就是级联型的“系数身份证”。
3.2 系数扰动实验:为什么级联和并联更“抗造”
实验要求把某个系数改动万分之一到 5%,观察零极点、稳定性、时频特性的变化。这个扰动量级选得很有讲究:太小看不出差别,太大直接崩掉失去比较意义。万分之一到百分之一的量级,恰好落在“直接型开始漂、级联型还稳”的窗口里。
机制在于系数到极点的映射灵敏度。直接型的分母系数 a_i 和极点 p_i 之间通过韦达定理耦合:a_1 = -Σp_i,a_2 = Σp_i p_j……一个系数的微小变化会均匀分摊到所有极点上,而且当极点靠近虚轴、彼此距离很近时,这种耦合会被放大——极点位置对系数的偏导数在高阶、密集极点情况下非常大。级联型里,每个二阶节的极点是该节系数的一元二次方程根,扰动只在本节内传播,且二阶系统的根对系数灵敏度有解析上界,不会跨节放大。并联型更彻底,支路之间加法关系,一条支路漂了不影响另一条。
有限字长效应是这条结论的现实注脚。定点实现时系数要量化,直接型的高阶多项式系数对量化误差极其敏感,极点可能被量化误差推出左半平面;级联型把高阶系统降成多个二阶节,每个节的系数动态范围小,量化误差被局部吸收。实验里“级联型误差积累较小”这句话,背后就是这个道理。血泪经验是:设计完滤波器别急着用直接型系数落地,先看极点对系数的灵敏度,靠近虚轴的高阶系统尤其要拆成二阶节。
3.3 用 pzmap 和 freqs 把扰动结果可视化
扰动实验的可视化分三块:零极点图、幅相频响应、阶跃响应。零极点图用pzmap(b,a),b 是分子系数、a 是分母系数,直接画出零极点位置,一眼看出极点有没有越过虚轴。频响用freqs(b,a,w),w 是频率向量,返回复数响应,取abs和angle分别画幅频相频。阶跃响应用step(b,a,t),t 是时间向量。
a = [1, 2.2, 3.41, 0.62, 0.035]; % 原始分母 b = [0, 0, 0, 2.8, 1.99]; % 原始分子(补零对齐阶数) a1 = [1, 2.2, 3.41, 0.62, 0.01]; % 扰动后的分母,末位系数改动 w = -4:0.01:4; h = freqs(b, a, w); % 原始频响 h1 = freqs(b, a1, w); % 扰动频响 subplot(2,1,1); plot(w, abs(h), w, abs(h1)); subplot(2,1,2); plot(w, angle(h), w, angle(h1));注意b前面补了三个零,是因为分母四阶、分子实际只有一阶(2.8s+1.99),补零让 b 和 a 等长,freqs才能正确按 s 的幂次对齐。这个细节翻车过很多人:不补零,freqs会把系数错位解释,画出来的频响完全不对。w取 -4 到 4,是因为极点虚部在 1.4 附近、零点虚部在 1 附近,这个范围能覆盖主要峰谷。阶跃响应的t取 0 到 80,是因为靠近虚轴的极点时间常数约 1/0.1=10 秒,要看到稳态得给够时间。
4. 频域卷积定理:截断信号频谱为什么“糊”了
4.1 时域相乘等于频域卷积:截断的代价
拓展部分构建 f(t)=cos(t)+cos(2t),分别截取不同长度做频谱分析,结果发现截得越短,频谱越“糊”——原本两根干净的谱线周围长出一圈旁瓣。原因就是频域卷积定理:两个时间信号相乘,频谱等于各自频谱的卷积除以 2π。截断本质上是 f(t) 乘了一个矩形窗,矩形窗的频谱是 sinc 函数,所以截断信号的频谱等于理想谱线卷积 sinc,谱线被“抹开”成 sinc 主瓣加旁瓣。
截取长度越长,矩形窗越宽,sinc 主瓣越窄,频谱越接近理想冲激;截取越短,主瓣越宽,分辨率越差。这就是时域分辨率与频域分辨率的对偶关系,也是所有频谱分析的底层约束。实验要求截取长度不小于最低频率分量的一个周期,就是为了保证至少能看到一个完整周期,否则连频率都认不出来。
4.2 数值傅里叶变换的离散化:r 和 N 怎么选
实验里用矩阵乘法做数值傅里叶变换:
r = 0.02; % 时间步长 t = -10:r:0; % 截取区间 N = 200; % 频率采样半点数 W = 2*pi; % 频率范围 k = -N:N; w = k*W/N; % 频率采样点 f = cos(t) + cos(2*t); F = r * f * exp(-1j * t' * w); % 数值积分近似傅里叶变换 F1 = abs(F); % 幅度谱 P1 = angle(F); % 相位谱F = r * f * exp(-j*t'*w)这一行是矩形法数值积分:t 是行向量,w 是行向量,t'*w构造出时间-频率的网格矩阵,f乘上去再乘步长 r,就是对每个频率点做 Σ f(t)e^{-jωt}·r。r 越小积分越准,但计算量越大;N 决定频率采样密度,N 越大频率轴越细。这里 W=2π、N=200,频率分辨率是 2π/200≈0.0314 rad/s,足够分辨 ω=1 和 ω=2 两根谱线。
容易踩的坑是t'*w的维度:t 必须是行向量,转置后是列向量,w 是行向量,列乘行得到矩阵,这才是正确的网格。如果 t 和 w 都是行向量直接相乘会报错或得到标量。另外angle出来的相位在谱线附近会因为数值噪声跳变,画相位谱时经常看到锯齿,这是正常的,不是代码错。
4.3 从截断频谱差异反推窗函数效应
比较 -10:0、-5:0、-10:10 三种截取的频谱,能直接看到窗长对主瓣宽度的影响。-10:10 最长,主瓣最窄,谱线最锐;-5:0 最短,主瓣最宽,旁瓣相对明显。这其实就是窗函数设计的雏形:矩形窗主瓣窄但旁瓣高,汉宁窗主瓣宽但旁瓣低,工程上选窗就是在主瓣分辨率和旁瓣泄漏之间做取舍。实验用矩形窗(硬截断)暴露问题,正是为了让你理解为什么实际频谱分析要加窗。
5. 滤波器设计与音频落地:从 s 平面到耳朵
5.1 用零极点“捏”出带阻特性
拓展部分设计的 H(s)=(s²-0.2s+1.97)/(s²+0.2s+1.01),零点 0.1±j、极点 -0.1±1.4j。设计逻辑是:零点放在虚轴附近(实部 0.1 很小),在 ω≈1 处压出深谷;极点放在虚轴另一侧稍远处(实部 -0.1,虚部 1.4),在 ω≈1.4 处顶出峰。零点比极点更靠近虚轴,所以谷比峰深,整体是带阻。如果想让阻带更窄更陡,就把零极点都往虚轴推、且让它们虚部靠近;想让通带更平坦,就把零极点往左拉远。
用freqs验证频响,再用laplace/ilaplace求滤波输出:
syms s t Hs = (s^2 - 0.2*s + 1.97) / (s^2 + 0.2*s + 1.01); f = cos(t) + cos(2*t); Fs = laplace(f); Ys = Hs * Fs; % 频域相乘 = 时域卷积 yt = ilaplace(Ys) * heaviside(t);Ys = Hs*Fs是拉氏域相乘,对应时域卷积,这是 LTI 系统输出的标准求法。ilaplace回来后乘阶跃保证因果。注意这里求的是全响应(零状态),因为 f(t) 从 t=0 起才乘阶跃。稳态输出要截取 t 足够大的段,等瞬态衰减完再看,否则会把暂态振荡误当成稳态。
5.2 音频信号的采样、FFT 与频谱解读
应用部分用audiorecorder录音、audiowrite存 wav、audioread读回、fft做频谱:
rec = audiorecorder; % 默认采样率,单声道 recordblocking(rec, 3); % 录 3 秒 y = getaudiodata(rec); % 取时域数据,范围 [-1,1] audiowrite('luyin.wav', y, 8000); % 以 8kHz 采样率写文件 [y, fs] = audioread('luyin.wav'); Y = fft(y, 8000); % 8000 点 FFT,不足补零,超出截断 subplot(2,1,1); plot(y); subplot(2,1,2); plot(abs(Y));fft(y,8000)的第二个参数是变换点数:y 短于 8000 就补零,长于 8000 就截断。补零不增加信息,只是让频率轴更密(插值效果),别误以为补零能提高分辨率——分辨率由实际采样时长决定。采样率 8000Hz 对应奈奎斯特频率 4000Hz,频谱图只在前 4000Hz 有意义,后半段是镜像,看谱时只看前半段。abs(Y)是双边幅度谱,工程上常取前半段乘 2 得到单边谱。
录音时recordblocking是阻塞式,录满指定秒数才返回,适合脚本化流程;实时处理要用回调。getaudiodata拿到的数据是双精度 [-1,1],写文件时采样率要和录音时一致,否则回放变速变调。
6. 避坑与排查:那些让实验报告返工的细节
6.1 极点判稳只看实部符号,忽略重数
现象:某个系统极点实部全是负的,判为稳定,但阶跃响应发散。原因:极点判据漏了虚轴重数条件,或者数值计算出的极点实部因浮点误差显示为 -1e-16,被误判为负。解决:判稳时给实部加一个容差阈值(如 -1e-6),并单独检查虚轴上是否有重极点;用pole或roots求根后打印完整精度,别只看显示值。
6.2 freqs 的分子分母没对齐阶数
现象:频响曲线形状完全不对,峰谷位置和零极点图对不上。原因:b没有补零到和a等长,freqs按向量长度错位解释 s 的幂次。解决:分子阶数低于分母时,在b前面补零,补到 length(b)==length(a);或者直接用tf对象加bode/freqresp,让工具箱处理对齐。
6.3 数值傅里叶变换的矩阵维度搞反
现象:F = r*f*exp(-j*t'*w)报错或结果维度不对。原因:t 和 w 的方向没统一,t'*w要求 t 是行、w 是行,转置后列乘行才是网格。解决:显式用t(:).'和w(:).'强制行向量,或者用ndgrid构造网格;算完检查 F 的尺寸是否等于 length(w)。
6.4 阶跃响应观察时间太短,误判稳态
现象:阶跃响应看起来一直在振荡,以为系统不稳定。原因:靠近虚轴的极点时间常数大,t 取小了瞬态没衰减完。解决:时间常数约 1/|Re(p)|,t 至少取 5 到 10 倍最大时间常数;先算极点再定 t 范围,别拍脑袋取 0:0.01:10。
6.5 音频采样率与 FFT 点数不匹配
现象:频谱图频率轴刻度不对,或者谱线位置偏移。原因:fft点数、采样率、频率轴换算三者没对齐,频率轴用了错误的 fs。解决:频率轴按f = (0:N-1)*fs/N生成,N 是 FFT 点数;只看 0 到 fs/2 的前半段;补零不改变 fs,别把补零后的点数当成实际采样点数去算分辨率。
7. 设计取舍:为什么“数学上等价”不等于“工程上等价”
这份实验最值得带走的认知,是“同一个传递函数,不同实现结构在数学上严格等价,在工程上却不等价”。直接型延迟器最少、理论最优,但系数耦合导致极点对扰动敏感,靠近虚轴的高阶系统尤其脆弱;级联型多几个延迟器,换来零极点独立可调、量化误差局部化;并联型支路隔离更彻底,但零点由各支路共同贡献,调整不如级联直观。选结构本质是在资源(延迟器、乘法器)和鲁棒性之间做权衡,没有普适最优。
验证这套认知的方法也很朴素:设计完系统,别只看理想系数下的频响,把系数扰动万分之一到百分之一,分别用三种结构跑一遍零极点图和阶跃响应,看谁的极点先越界。这个动作我后来做任何滤波器落地都会走一遍,因为定点量化、温度漂移、器件容差在真实系统里就是持续的小扰动,理想系数下的漂亮曲线说明不了什么。
还有一个取舍藏在滤波器设计里:零极点越靠近虚轴,滤波特性越陡峭,但稳定裕度越小、对参数越敏感;往左拉远,鲁棒性上来,选择性下降。实验里把零点放在实部 0.1、极点放在实部 -0.1,就是在“够陡”和“别崩”之间找的那个点。这个平衡感没法靠公式给,只能靠反复扰动、观察、回退来养。
从那以后我每次把 H(s) 落成代码前,都强制走一遍“扰动—看极点—看阶跃”的流程,哪怕系数看起来再安全。希望帮到你。
本文还有配套的精品资源,点击获取