简介:这份资源是面向通信工程、电子信息工程等专业本科生与研究生的信号与系统综合实验报告,聚焦连续时间LTI系统的时域与频域分析及滤波器设计,适合具备一定理论基础、希望借助Matlab完成仿真验证的学习者。内容围绕稳定系统的零极点设计展开,涵盖直接、级联、并联三种实现结构的信号流图与特性对比,并延伸到阶跃响应、参数微变敏感性、周期信号频谱分析、LTI滤波器设计以及音频信号获取与频谱分析等环节,配有实验步骤、代码实现与结果分析。资源包共1个docx文件,约2.62MB,以实验报告文档形式完整呈现理论推导与Matlab仿真过程。目前已有1303人学习,可帮助读者理解系统函数零极点分布与频率特性、稳定性之间的关系,掌握不同结构对参数变化的敏感程度,并积累滤波器设计与音频频谱分析的实操思路。
1. 从一份“跑不通”的实验报告说起:连续时间LTI系统综合实验到底要交付什么
信号与系统这门课,理论推导能写满几页纸,一到 MATLAB 仿真就翻车,这是通信、电子信息类专业学生做综合实验时最常见的状态。这份基于 MATLAB 的连续时间 LTI 系统综合实验,要解决的不是“会不会调用 freqs”这种表层问题,而是把时域分析、频域分析、零极点分布、三种实现结构、滤波器设计、音频信号处理串成一条完整链路。它适合正在做信号与系统课设、综合实验报告,或者要交一份能答辩的完整方案的本科生和研究生。整套方案的核心交付物是:一个稳定可分析的 4~6 阶系统、三套实现结构的对比结论、一个能滤掉指定频率分量的滤波器,以及一段真实音频的频谱分析。
2. 需求拆解与总体设计:四个实验模块如何串成一条分析链
2.1 先把实验目的翻译成可验收的交付项
原始实验目的写了四条,听起来都很“教学语言”,但落到交付上,其实对应四类可以检查的产物。第一类是系统本身:一个 4~6 阶连续时间 LTI 系统,系统函数里至少含一对靠近虚轴的共轭复数极点,且系统稳定。第二类是分析结果:时域冲激响应、阶跃响应,频域幅频响应、相频响应,以及零极点图。第三类是对比结论:直接、级联、并联三种结构在参数微扰下的敏感性差异。第四类是应用验证:设计一个滤波器,对含两个频率分量的周期信号滤波,再用真实音频走一遍采集、频谱分析流程。
我一般会把这四类产物画成一条链:系统建模 → 时域频域仿真 → 结构敏感性对比 → 滤波器设计与音频验证。每一环的输出是下一环的输入,比如零极点位置决定了幅频响应形状,幅频响应又决定了滤波器能不能滤掉 2 rad/s 那个分量。这样写报告时逻辑是顺的,答辩时被问到“为什么这个极点要放这里”,你能直接指回需求。
2.2 系统函数与零极点的手工设计
实验要求设计一个稳定系统,至少一对共轭复数极点靠近虚轴。原始方案给出的系统函数是:
$$ H(s)=\frac{2.8s+1.99}{(s^2+0.2s+0.01)(s+1)(s+2)} $$
分母展开后是 4 阶,满足 4~6 阶要求。关键在于 $s^2+0.2s+0.01$ 这一对极点:解出来是 $s=-0.1\pm j0$,实部 -0.1,非常靠近虚轴,虚部为 0 说明它落在实轴上,严格说不是共轭复数对。这里其实是原始报告的一个小瑕疵,如果要做“靠近虚轴的共轭复数极点”,更稳妥的写法是把这一项改成 $s^2+0.2s+1.01$,极点变成 $-0.1\pm j1$,实部仍是 -0.1,虚部 ±1,既靠近虚轴又是共轭对,幅频响应会在 $\omega=1$ 附近出现明显峰值,后面分析零极点与频率特性的关系时现象更清楚。
我一般会先手算极点位置再写代码,因为答辩时老师很可能让你口述“极点在哪、为什么稳定”。所有极点实部为负(-0.1、-1、-2),系统稳定;靠近虚轴的那对极点贡献了低频段的主谐振。这一步想清楚,后面所有图都有了解释的锚点。
2.3 三种实现结构的职责划分
直接型、级联型、并联型不是三个随便选的选项,它们对应三种不同的系数组织方式,敏感性差异就藏在这里。直接型把分子分母系数整体存放,一个系数微调会同时影响所有极点;级联型把系统拆成多个二阶节相乘,每个二阶节只管一对零极点;并联型拆成多个二阶节相加,同样局部化。原始方案用tf2sos做直接到级联、用tf2zp加zp2tf做零极点往返,这个思路是对的,但代码里zp2tf(z,p,k)得到的其实是原系统,并没有真正构造并联结构,这是很多报告里容易糊弄过去的地方。
我的做法是:级联用tf2sos得到二阶节矩阵,并联则手动把每个二阶节写成部分分式再相加,或者至少用residue做部分分式展开来体现并联的数学含义。结构不同,后面做参数微扰时才能看出谁更“抗造”。
3. 时域与频域仿真:从冲激响应到阶跃响应的完整代码链
3.1 冲激响应与幅频相频的符号计算
原始方案用ilaplace求冲激响应、fourier求频谱,这是符号计算路线,优点是表达式干净,缺点是遇到高阶系统容易算不动。我一般会双轨走:符号算一遍拿解析式,数值再用impulse、freqs验证一遍。下面这段是可复现的数值版本,比纯符号更稳:
% 系统系数:分母按 s^4, s^3, s^2, s^1, s^0 排列 b = [0 0 0 2.8 1.99]; a = [1 2.2 3.41 0.62 0.035]; % 冲激响应与阶跃响应 t = 0:0.01:60; figure; subplot(2,1,1); impulse(b,a,t); title('冲激响应 h(t)'); subplot(2,1,2); step(b,a,t); title('阶跃响应 g(t)'); % 幅频与相频 w = -6:0.01:6; H = freqs(b,a,w); figure; subplot(2,1,1); plot(w,abs(H)); title('幅频响应 |H(jw)|'); subplot(2,1,2); plot(w,angle(H)); title('相频响应');freqs的第三个参数是频率向量,范围取 -6 到 6 是因为系统的主要谐振在 $\omega=1$ 附近,扫太宽会把细节压扁。impulse和step的时间向量取到 60 秒,是因为靠近虚轴的极点实部只有 -0.1,时间常数约 10 秒,衰减慢,截太短看不到稳态。这里有个血泪经验:如果时间向量只取到 10,冲激响应看起来像发散的,其实是还没衰减完,答辩时被追问“系统稳不稳定”就尴尬了。
3.2 阶跃信号通过系统前后的频谱变化
实验要求分析阶跃信号通过系统前后的频谱,总结滤波特性。阶跃信号的频谱是 $1/(j\omega)+\pi\delta(\omega)$,经过系统后乘上 $H(j\omega)$。数值上可以直接用freqs算系统响应,再和输入频谱逐点相乘:
w = 0.01:0.01:6; % 避开 0 点的冲激 H = freqs(b,a,w); F_step = 1./(1j*w); % 阶跃信号频谱(忽略直流冲激项) Y = H .* F_step; % 输出频谱 figure; subplot(2,1,1); plot(w,abs(F_step)); title('输入阶跃频谱'); subplot(2,1,2); plot(w,abs(Y)); title('输出频谱');这段代码的关键在w从 0.01 开始而不是 0,因为阶跃频谱在 0 点有冲激,数值上没法直接表示,避开零点只画连续部分,报告里说明一句“直流分量单独讨论”即可。从输出频谱能看出:低频段被保留,$\omega=1$ 附近因为那对靠近虚轴的极点出现抬升,高频段被 $(s+1)(s+2)$ 的极点压下去。这就是“滤波特性与零极点分布关系”的实证——极点靠近虚轴的地方幅频抬升,极点远离虚轴的地方幅频衰减。
3.3 参数微扰下的结构敏感性对比
这是整个基础部分最能拉开报告质量的一环。原始方案把分母常数项从 0.035 改成 0.01,变化量约 71%,远超实验建议的万分之一到 5%,而且只改了直接型系数,级联和并联的对比代码逻辑是断的。我的做法是统一微扰幅度,比如把所有结构里对应同一个极点的系数改动 1%,然后对比零极点漂移和阶跃响应差异:
% 原始系统 b = [0 0 0 2.8 1.99]; a = [1 2.2 3.41 0.62 0.035]; % 级联结构:分解为二阶节 [sos, g] = tf2sos(b, a); % 对直接型分母常数项做 1% 微扰 a1 = a; a1(end) = a1(end) * 1.01; % 对级联结构最后一个二阶节的常数项做 1% 微扰 sos1 = sos; sos1(end,end) = sos1(end,end) * 1.01; [b2, a2] = sos2tf(sos1, g); t = 0:0.01:80; figure; subplot(2,2,1); pzmap(b,a); title('原始零极点'); subplot(2,2,2); pzmap(b,a1); title('直接型微扰后'); subplot(2,2,3); pzmap(b2,a2); title('级联型微扰后'); subplot(2,2,4); step(b,a,t); hold on; step(b,a1,t); step(b2,a2,t); title('阶跃响应对比'); legend('原始','直接微扰','级联微扰');sos2tf把微扰后的二阶节还原成整体传递函数,才能和直接型放在同一尺度下比较。跑完你会发现:直接型微扰后极点位置漂移更明显,阶跃响应稳态值也有可见偏差;级联型因为只动了一个二阶节,其他节的极点纹丝不动,整体响应变化小得多。这个结论就是报告里“不同实现结构对参数改变敏感性”的核心论据,比空泛地说“级联精度高”有说服力得多。
4. 滤波器设计与音频验证:从零极点配置到真实信号落地
4.1 用零极点配置设计一个带阻型滤波器
拓展部分要求设计一个 LTI 连续系统作为滤波器,对 $f(t)=\cos(t)+\cos(2t)$ 滤波,滤掉部分频率分量。原始方案给的滤波器是:
$$ H(s)=\frac{s^2-0.2s+1.97}{s^2+0.2s+1.01} $$
零点在 $0.1\pm j1.4$,极点在 $-0.1\pm j1.4$。零点在右半平面、极点在左半平面,且虚部相同,这种“零点极点关于虚轴对称”的配置会在 $\omega=1.4$ 附近形成陷波。但输入信号分量是 $\omega=1$ 和 $\omega=2$,陷波中心 1.4 卡在中间,两个分量都滤不干净。这是原始方案里比较隐蔽的问题——零极点图画出来很漂亮,但滤波效果对不上信号频率。
我一般会先看输入信号的频率分量,再反推零极点该放哪。要滤掉 $\omega=2$ 保留 $\omega=1$,就把零点放在虚轴上 $\pm j2$ 附近,极点放在左半平面同样虚部位置:
% 陷波中心 2 rad/s:零点在 ±j2,极点在 -0.1±j2 z = [2j; -2j]; p = [-0.1+2j; -0.1-2j]; k = 1; [b, a] = zp2tf(z, p, k); w = 0:0.01:5; H = freqs(b, a, w); figure; subplot(2,1,1); plot(w, abs(H)); title('幅频响应'); subplot(2,1,2); plot(w, angle(H)); title('相频响应');zp2tf把零极点转回传递函数系数,k=1是增益,实际报告里可以根据通带增益归一化调整。零点在虚轴上意味着该频率处幅频严格为 0,极点实部 -0.1 决定陷波宽度,实部越靠近 0 陷波越窄。这样设计出来,$\omega=2$ 被压掉,$\omega=1$ 基本无损通过,滤波效果和设计意图能对上。
4.2 卷积求输出与稳态频谱验证
设计完滤波器,要用冲激响应和输入信号卷积得到输出。符号计算路线是拉氏变换相乘再反变换,数值路线是conv或者lsim。我倾向用lsim,因为它直接给数值解,不用处理符号反变换的收敛域问题:
t = 0:0.01:40; f = cos(t) + cos(2*t); [y, ~] = lsim(tf(b,a), f, t); % 取后段稳态数据做频谱 idx = t > 20; y_ss = y(idx); Fs = 1/0.01; N = 2^nextpow2(length(y_ss)); Y = fft(y_ss, N); f_axis = (0:N-1)*(Fs/N); figure; subplot(2,1,1); plot(t, y); title('滤波输出 y(t)'); subplot(2,1,2); plot(f_axis(1:N/2), abs(Y(1:N/2))); title('稳态输出频谱'); xlabel('Hz');idx = t > 20是截取稳态的关键,前 20 秒包含瞬态,直接做 FFT 会把瞬态分量混进频谱,看起来像多了很多杂散频率。稳态频谱里应该只剩 $\omega=1$ 对应的谱线,$\omega=2$ 被压到很低,这就是“验证滤波器实现了预期效果”的直接证据。报告里把输入频谱和输出频谱并排放,对比一目了然。
4.3 音频信号的采集、频谱分析与常见参数
应用设计部分用audiorecorder录音、audiowrite存文件、audioread读回、fft做频谱。原始方案采样率设 8000 Hz,录音 3 秒。这里要注意采样定理:8000 Hz 采样率能无混叠分析的最高频率是 4000 Hz,人声主要能量在 300~3400 Hz,够用;但如果要分析音乐或高频成分,8000 就不够,得提到 44100。
rec = audiorecorder(8000, 16, 1); % 8kHz, 16bit, 单声道 recordblocking(rec, 3); y = getaudiodata(rec); audiowrite('audio_demo.wav', y, 8000); [y, fs] = audioread('audio_demo.wav'); N = 2^nextpow2(length(y)); Y = fft(y, N); f_axis = (0:N-1)*(fs/N); figure; subplot(2,1,1); plot(y); title('语音波形'); subplot(2,1,2); plot(f_axis(1:N/2), abs(Y(1:N/2))); title('语音频谱'); xlabel('Hz');audiorecorder三个参数分别是采样率、位深、通道数,单声道足够做频谱分析。fft之前补零到 2 的幂次是为了加速,f_axis只画前半段是因为实信号频谱对称。报告里分析频谱特点时,可以指出语音能量集中在低频、高频衰减快,这和前面系统滤波的“低频保留高频衰减”现象能呼应上,整份报告的逻辑就闭环了。
5. 避坑与排查:这类实验最容易翻车的五个点
5.1 极点位置算错导致“稳定系统”其实不稳定
现象:零极点图画出来极点好像都在左半平面,但阶跃响应一直往上飘。原因:分母系数排列顺序和roots期望的顺序不一致,或者手工展开分母时符号写错。解决:用roots(a)单独打印极点实部,确认全部小于 0;展开分母时用conv逐级相乘而不是手算,减少符号错误。
5.2 频率向量范围选错把谐振峰压没了
现象:幅频响应看起来一条平线,看不出靠近虚轴极点该有的峰值。原因:freqs的频率范围取太大,比如 -100 到 100,谐振峰在 1 附近被压缩成一个点。解决:先roots看极点虚部,频率范围取虚部的 3~5 倍,比如虚部是 1,就取 -6 到 6。
5.3 参数微扰幅度失控导致对比失去意义
现象:改了一个系数后系统直接发散,三种结构全乱,没法比较敏感性。原因:微扰量取了 50% 以上,或者改的是主导极点对应的系数。解决:统一微扰幅度在 1% 左右,且只改一个系数,改完先isstable或看极点实部确认没跑出左半平面。
5.4 滤波器零极点与信号频率对不上
现象:设计完滤波器,输入两个频率分量,输出还是两个都在。原因:陷波中心频率和要滤掉的信号分量频率不一致,比如信号是 2 rad/s,陷波放在 1.4 rad/s。解决:先算输入信号各分量的角频率,零点虚部直接对准要滤掉的频率,极点虚部相同、实部取小负值控制带宽。
5.5 音频频谱分析混入瞬态或混叠
现象:语音频谱图上一堆看不懂的杂散峰。原因:录音开头有环境突变或按键声,或者采样率低于信号最高频率导致混叠。解决:分析前截掉前 0.1~0.2 秒,采样率按信号最高频率的 2 倍以上选取,语音场景 8000 Hz 起步,音乐场景 44100 Hz。
6. 验收与答辩:怎么把四类产物讲成一条完整证据链
验收这份实验,我一般不看代码有多长,看四件事能不能对上。第一,系统极点实部全负、至少一对靠近虚轴,零极点图和幅频响应的峰值位置能互相解释。第二,三种结构的参数微扰对比有统一幅度、有零极点漂移图、有阶跃响应叠图,结论能落到“级联局部化、直接型耦合强”上。第三,滤波器零点频率和输入信号要滤掉的分量频率一致,输出稳态频谱里该分量被压下去。第四,音频频谱的采样率、分析频段、能量分布说得清。
答辩时最容易被问的三个问题,提前准备好答案:为什么这个极点要靠近虚轴(答:制造谐振峰,验证零极点与幅频关系);为什么级联型更抗参数变化(答:每个二阶节只管一对零极点,系数改动局部影响);滤波器零点为什么放虚轴上(答:虚轴上零点使该频率幅频严格为零,实现陷波)。把这三问答顺,基本就稳了。
下面这张表可以贴在报告最后一页做自查:
| 验收项 | 合格标准 | 对应图 |
|---|---|---|
| 系统稳定性 | 所有极点实部 < 0 | 零极点图 |
| 谐振特性 | 幅频在极点虚部附近有峰 | 幅频响应 |
| 结构敏感性 | 同幅度微扰下直接型漂移更大 | 零极点对比图 |
| 滤波有效性 | 目标分量被压制 10 dB 以上 | 输出稳态频谱 |
| 音频分析 | 采样率满足 2 倍最高频率 | 语音频谱图 |
从那以后我每次带这类综合实验,都强制先手算极点、再写仿真、最后拿稳态数据做频谱,三步缺一步报告就会在答辩时露馅。希望帮到你。
本文还有配套的精品资源,点击获取