news 2026/9/17 19:09:24

MATLAB信号与系统实验:LTI系统仿真与傅里叶变换实战指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MATLAB信号与系统实验:LTI系统仿真与傅里叶变换实战指南

简介:《华南理工大学信号与系统实验报告四》是一份面向信号与系统课程学习者的完整实验报告,聚焦时域抽样与频域抽样两大核心定理。压缩包内共1个doc文档,仅276KB,但内容覆盖实验目的、操作步骤、MATLAB源代码、波形分析及思考题解答,适合需要完成同类实验或复习抽样理论的学生参考。已有727人学习/下载,具备一定认可度。报告通过具体案例对比了抽样频率对信号恢复的影响,例如以50Hz抽样10Hz、50Hz、100Hz信号时仅有10Hz信号不失真;还推导了幅度调制信号的最高频率与采样率,演示了抽样与重建过程,并验证了频域抽样点数N小于序列长度时会产生时域混叠。这些实验细节和程序代码能帮助读者直观理解奈奎斯特定理,掌握离散化与重建的工程实现方法。

1. 从实验报告四看信号与系统:LTI系统从理论到MATLAB的落地

如果你正在写华南理工大学信号与系统实验报告四,大概率要面对同一件事:把课堂上手推的傅里叶变换、卷积、频率响应放进MATLAB里,让曲线替你说话。这门课有大量理论公式,但实验报告并不是把公式抄进“原理”栏就完事,真正难的是仿真结果和理论值对不上时,你能用参数折算出误差,再用报告说服评审人这是合理的。

我从第一次接触MATLAB里的convfreqslsim这类函数时卡过的坑,到后来用同一套流程处理滤波器设计和系统辨识实验,总结下来,实验报告四的核心就三个:时域卷积是否与频域相乘一致、系统频率响应曲线是否符合解析解、以及信号采样和数值离散引入的误差边界。以下内容按“理论验证→仿真搭建→数据整理→进阶输出”的顺序展开,所有代码都能在MATLAB R2019b及以后版本直接运行,参数也按工程师习惯给了常用值。

这篇博客不只是给华工信号与系统实验课的同学看的,也适合任何需要快速验证LTI系统特性的从业者。你会看到实验报告四里最常见的那几个仿真图为什么长成那样,也会知道当波形边缘出现“毛刺”或幅值差了几个百分点时,应该先去改哪个变量。

2. 实验报告四背后的频域工具:傅里叶变换、卷积与系统响应计算

2.1 为什么实验四要同时验证卷积定理和傅里叶变换

LTI系统的输出是输入与冲激响应的卷积,这本身是时域观点。实验四通常要求你用两种途径算同一个输出:时域直接用conv做卷积,频域把输入和冲激响应分别做傅里叶变换再相乘,最后逆变换回来。如果两边曲线重合,说明系统满足叠加性和频率保持性。

但这里有一个隐蔽的陷阱。MATLAB的conv并不是真正的连续卷积,而是对离散序列做加权求和。连续卷积的定义是y(t)=∫x(τ)h(t-τ)dτ,离散实现时要把求和结果乘以采样间隔dt,否则幅值会偏大。反过来,使用FFT计算傅里叶变换时,fft默认是离散傅里叶变换(DFT),它把有限长区间当成一个周期向外延拓。如果信号在时间窗两端没有衰减到0,边界处就会出现波形扭转,这在实验报告上表现为输出首尾发生“拖尾”或“振铃”。

所以我在做实验四时,第一步不是直接仿真,而是先明确时间步长和时间范围。下面的代码验证卷积定理,是最小的可运行示例。

% 验证时域卷积与频域乘积的一致性 dt = 0.001; % 采样间隔,单位秒 t = -1:dt:1; % 时间范围,足够容纳信号衰减 x = rectpuls(t, 0.2); % 宽度0.2秒的矩形脉冲 h = exp(-5*t).*(t>=0); % 指数衰减冲激响应 % 时域卷积 y_conv = conv(x, h) * dt; % 乘dt把离散求和近似为积分 t_conv = (min(t)+min(t)):dt:(max(t)+max(t)); % 卷积结果的坐标 % 频域方法 X = fft(x) * dt; % 近似连续傅里叶变换 H = fft(h) * dt; Y = X .* H; y_freq = ifft(Y) / dt; % 逆变换时把dt还原 % 绘图对比 plot(t_conv, y_conv, 'b', 'LineWidth', 1.5); hold on; plot(t, real(y_freq), 'r--', 'LineWidth', 1.5); xlabel('时间 (s)'); ylabel('幅值'); legend({'时域卷积', '频域乘积'}); grid on;

代码中dt既是采样间隔,也是积分微元。fft(x) * dt相当于对连续时间信号做矩形数值积分。注意conv返回长度是length(x)+length(h)-1,所以t_conv要单独构造,时长跨度是t的两倍左右。运行后会看到两条曲线在中间大部分区域重合,但两端有差异,这是因为FFT引入的循环卷积在边界处混叠。

参数选择上,dt=0.001意味着频率分辨率为1/2Hz左右,能覆盖常见信号的频谱;如果改用dt=0.0001,计算点数量上升到20000,曲线会更光滑,但内存和绘图时间都会增加。对于实验报告四,dt取信号最高频率的1/20以下就够了。

2.2 用freqs绘制系统频率响应时的参数陷阱

频率响应是系统对正弦输入的稳态增益和相位变化。连续系统用freqs(b, a, w)计算,其中ba是传递函数分子分母系数,w必须用角频率(rad/s),不是Hz。很多人在实验报告四里把频率轴标成Hz,却用2*pi*f代入,导致截止频率位置偏移,这是第一类扣分点。

以RC低通滤波器为例,传递函数为H(s)=1/(1+sRC),令s=jω,幅频特性是|H(jω)|=1/sqrt(1+(ωRC)^2)。MATLAB代码可以这样写:

R = 1e3; % 1kΩ C = 1e-6; % 1uF b = 1/(R*C); % 分子系数 a = [1, 1/(R*C)]; % 分母s系数从高到低 w = logspace(-2, 6, 500); % 角频率范围0.01到1e6 rad/s [H_mag, H_phase] = freqs(b, a, w); % 注意freqs返回复数 % 幅频和相频 subplot(2,1,1); semilogx(w, 20*log10(abs(H_mag)), 'b'); grid on; ylabel('幅值 (dB)'); xlabel('角频率 (rad/s)'); subplot(2,1,2); semilogx(w, unwrap(angle(H_mag))*180/pi, 'r'); grid on; ylabel('相位 (°)'); xlabel('角频率 (rad/s)');

这里freqs返回的H_mag实际上是一个复数数组,我习惯直接命名为H,你不需要提前取模。unwrap把相位展开,避免在-180度和180度之间直接跳跃。RC电路的截止角频率是ω_c = 1/(RC) = 1000 rad/s,对应频率约159Hz。绘制时如果发现-3dB点不在1000 rad/s,先检查RC的数值,再检查是否把衰减倍数和dB混淆了。

常见参数误区如下表:

参数误用方式正确做法
w直接写频率f使用角频率2*pi*f或明确freqs输入
abs忘记取模而直接画复数abs(H),相位用angle(H)
坐标轴用线性轴画宽频段semilogxloglog
相位范围直接angle出现跳变unwrap展开后转角度

如果实验报告四要求测量某个系统的频率响应,我一般会让w范围覆盖截止频率前后三个十倍频程,这样波特图里低频段和高频段的渐近线都能看清。

2.3 从频域回到时域:什么是系统真正的稳态响应

有了频率响应,不等于就能直接画出任意输入下的波形。实验四经常要求给一个方波,观察通过低通滤波器后的畸变。方波含有基波和奇次谐波,低通滤波器会削弱高次谐波,时域波形就会变得平缓。这里要区分“稳态”和“瞬态”。lsim仿真得到的初始段包含系统零输入响应,如果在开头就测量幅值,结果会偏大。

我在报告里处理这个问题的办法是:先让仿真运行到系统时间常数的5倍左右,再取最后一段作为稳态数据。时间常数τ=RC,如果R=1e3C=1e-6τ=1ms,那么仿真至少跑5ms,我通常直接跑50ms,取后半段。这样的稳态幅值,用rmsmax/min测量才和理论值可比较。

3. 用MATLAB复现实验报告四:信号生成、系统建模仿真与参数设置

3.1 实验激励信号:用square和chirp替代手工计算

实验四的输入信号不只是正弦波,经常要用方波、三角波或扫频信号。square(2*pi*f*t)生成矩形波,占空比默认50%,幅值±1。chirp(t, f0, t1, f1, 'quadratic')生成从f0到f1的扫频信号,可以一次性观察系统在不同频率下的动态响应。

fs = 10000; % 采样率10kHz,保证最高2kHz信号有5个采样点 t = 0:1/fs:0.05; % 50ms % 方波激励 x_square = square(2*pi*100*t); % 计算方波通过系统后的输出,后面会定义sys % 扫频激励,100Hz到2kHz,用于频率响应观察 x_chirp = chirp(t, 100, t(end), 2000, 'quadratic');

方波信号在跳变沿处含有丰富的高频成分,这是用来观察系统带宽的最直观信号。用chirp时要注意,扫频速度过快,系统来不及到达稳态,幅值会在上升过程中被低估。所以扫频时间要足够长。这里的t=0.05对应扫频周期2kHz,不是循环,只是单次扫过。

生成信号后,下一步是建立系统的数学模型。如果实验指导书给的是电路图,你可以用tf直接建立模拟系统;如果给的是微分方程,先改写成ba系数。常见的二阶系统:

wn = 2*pi*100; % 自然频率100Hz zeta = 0.3; % 阻尼比 b = wn^2; % 分子常数 a = [1, 2*zeta*wn, wn^2]; % 分母系数 sys = tf(b, a); % 建立传递函数模型

这个sys对象可以作为整体传给lsimstepfreqs等函数。阻尼比zeta=0.3时,系统的阶跃响应有约37%超调,频率响应在谐振峰附近有凸起。如果你们实验四指定的系统是欠阻尼(zeta<1/sqrt(2)),那么幅频曲线会在wn附近出现峰值,这一点在报告里应该重点说明。

3.2 从传递函数到时域输出:lsim、impulse和step的选型

sys后,仿真函数选择取决于你要看什么:

函数输入激励适用场景
step(sys, t)单位阶跃观察系统跟踪能力、超调、调节时间
impulse(sys, t)单位冲激观察系统固有响应,直接看到阻尼
lsim(sys, x, t)任意信号方波、扫频、正弦输入下的输出

以方波输入为例,计算输出的代码:

t = 0:1/fs:0.05; x = square(2*pi*100*t); y = lsim(sys, x, t); figure; plot(t, x, 'k--'); hold on; plot(t, y, 'b'); xlabel('时间 (s)'); ylabel('幅值'); legend('输入方波', '系统输出'); title('方波通过二阶系统的时域响应');

lsim要求时间向量t是均匀等间隔且从0开始。如果你从别处导入的信号t不是从0开始,会报错“Time vector must be uniformly sampled”。解决办法是lsim(sys, x, t-min(t))。另外,lsim的离散模型版本lsim(sys, x, t, zoh)用于处理离散系统,实验四如果是连续系统就用第一个输入。

3.3 仿真步长和频率分辨率的经验法则

很多实验报告四的波形畸变,根源是仿真步长过大。假设系统自然频率是100Hz,即角频率约628 rad/s,如果采样率只有500Hz,那么一个周期只有5个点,波形会呈现锯齿状,相位误差更是大到离谱。我一般坚持两条经验法则:

  • fs ≥ 20 * f_max,其中f_max取输入信号最高频率和系统带宽的较大值;
  • 仿真时长t_end ≥ 5 / 阻尼自然频率,保证系统进入稳态。

计算频率分辨率时,FFT的频率间隔是fs/N,其中N是采样点数。实验四若要求频谱图能区分两个邻近频率,比如100Hz和102Hz,那么频率间隔必须小于2Hz,N至少为fs/2=5000。如果直接fft后看到一条很宽的峰,大概率是频率分辨率不够,需要增加采样点数而不是提高采样率。

4. 实验报告四的表格与曲线:数据提取、误差分析和报告写作规范

4.1 用MATLAB生成可写入报告的数据表

实验报告四通常需要一组不同频率下的输入输出幅值比,然后和理论增益对比。手工读图太慢,也容易读错。我一般用循环生成带表头的文本表格,或用writetable直接导出CSV。

R = 1e3; C = 1e-6; fs = 1e5; % 采样率100kHz,避免高频下稳态测量误差 t = 0:1/fs:0.1; % 100ms,足够让低频正弦波稳定 freq_list = [50, 100, 200, 500, 1000, 2000]; sys = tf(1/(R*C), [1, 1/(R*C)]); results = zeros(length(freq_list), 3); for i = 1:length(freq_list) f = freq_list(i); x = sin(2*pi*f*t); y = lsim(sys, x, t); steady_start = round(0.08*fs)+1; % 取80ms之后的数据作为稳态 y_steady = y(steady_start:end); x_steady = x(steady_start:end); amp_sim = sqrt(2)*rms(y_steady); % 从有效值转幅值 amp_theory = 1/sqrt(1+(2*pi*f*R*C)^2); results(i, :) = [f, amp_sim, amp_theory]; end disp('频率(Hz) 仿真增益 理论增益'); disp(results);

这里用rms计算稳态正弦波的有效值,乘以sqrt(2)换算成峰值。理论增益直接用极坐标频率响应的模。注意lsim的初始瞬态大约会持续5*RC=5ms,取80ms以后的数据已经足够安全。如果你在数据里看到仿真增益稳定大于理论值,先检查是否取了瞬态段。

运行后,把results复制到Excel或直接粘贴到Word。如果你只是自己看,也可以用writematrix(results, 'data.csv', 'Delimiter', ',')导出。

4.2 误差分析报告:哪些误差可以解释,哪些是测量错误

写实验报告四的误差分析时,不要笼统写“存在系统误差”。要具体到来源。常见的四类:

  • 数值积分误差:convfft的矩形积分近似存在O(dt)阶误差,可以减小dt验证趋势;
  • 截断泄漏:信号窗两端未衰减到零,频谱会有旁瓣,表现为主瓣变宽;
  • 瞬态截取误差:测量段包含衰减分量,导致幅值偏大或偏小;
  • 混叠误差:采样率低于信号最高频率的两倍,高频会折返到低频。

如果在第四类数据中发现仿真增益在1000Hz处比理论值低5%,而2000Hz处低20%,通常不是算法问题,而是你的稳态截取窗口太短,或者采样率不够高。把fs提高一个数量级再跑一次,看看结果是否变化,如果变化不大就说明采样率已经足够。

4.3 报告里图表摆放的层级结构

实验四的报告评审人最反感的是“只有图没有数据”。我建议每一幅图下面都要有一个表,至少包含:输入信号参数、系统参数、理论结果、仿真结果、误差百分比。表格用三线表(顶部粗线、表头下细线、底部粗线)即可。图不要截屏,用矢量图插入,分辨率至少在300dpi。图例文字不能是x_squarey1这样的变量名,必须写“输入方波”“系统输出”等。

如果实验报告四要求比较不同阻尼比或不同截止频率,可以用子图网格。每张子图标题写明工况,比如“阻尼比ζ=0.3,自然频率f_n=100Hz”。图内坐标轴单位不能丢,相位图的纵轴写“相位 (°)”,横轴写“频率 (rad/s)”或“频率 (Hz)”,要和正文使用的物理量一致。

5. 实验报告四的进阶技巧:批量仿真、出版级图形与LaTeX排版

5.1 用stepinfo批量扫描系统参数并自动提取指标

如果实验四需要对比不同阻尼比下的阶跃响应指标,逐个读图再记到表格里很低效。用stepinfo做一个批量扫描,直接输出超调量、峰值时间、调节时间。

zeta_list = 0.1:0.1:0.9; wn = 2*pi*100; fprintf('阻尼比 超调量(%% ) 峰值时间(s) 调节时间(5%%)(s)\n'); for zeta = zeta_list sys = tf(wn^2, [1, 2*zeta*wn, wn^2]); info = stepinfo(sys); fprintf('%.1f %.2f %.5f %.5f\n', ... zeta, info.Overshoot, info.PeakTime, info.SettlingTime); end

stepinfo默认调节时间是误差带2%,如果你的实验要求5%,可以通过SettlingTimeThreshold修改。这里输出格式用了%.2f等,避免科学计数法影响阅读。将结果复制到报告表格里,能直接看出阻尼比增大时超调量下降、调节时间先减后增的规律。

5.2 输出可直接投稿的矢量图

exportgraphics替代老旧的print函数,它能保留字体和线型,导出PDF时不出现发虚的问题。

f = figure('Position', [100 100 800 400]); plot(t, y_conv, 'b'); hold on; plot(t, y_freq, 'r--'); xlabel('时间 (s)'); ylabel('幅值'); set(gca, 'FontName', 'Times New Roman', 'FontSize', 11); exportgraphics(f, 'experiment4_convolution.pdf', 'ContentType', 'vector');

注意exportgraphics在MATLAB R2020a之后才稳定,老版本用saveas。图像输出前先用set(groot,'DefaultAxesFontSize',11)统一全局字号,避免每张图单独调。

5.3 把MATLAB数据导入LaTeX写作流程

实验报告四如果要求用LaTeX写,表格可以直接用\begin{tabular},但手工输入大量数据容易出错。更快的办法是让MATLAB生成LaTeX表格文本:

fid = fopen('report_table.tex', 'w'); fprintf(fid, '\\begin{tabular}{ccc}\n'); fprintf(fid, '频率(Hz) & 仿真增益 & 理论增益 \\\\\n'); for i = 1:size(results,1) fprintf(fid, '%.0f & %.4f & %.4f \\\\\n', results(i,:)); end fprintf(fid, '\\end{tabular}\n'); fclose(fid);

把生成的report_table.tex\input{report_table.tex}引入。这样改一次数据,表格和图可以联动更新。如果你用阶段图,PDF插图用\includegraphics[width=0.8\textwidth]{experiment4_convolution.pdf},矢量PDF在LaTeX里排列时不会像PNG那样边缘模糊。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/17 19:08:49

Switchyard浸泡测试13大场景全解:从长上下文到失败压力测试

Switchyard浸泡测试13大场景全解&#xff1a;从长上下文到失败压力测试 【免费下载链接】Switchyard Switchyard lets LLM applications route traffic across models and providers while preserving native OpenAI and Anthropic API compatibility - enabling flexible mode…

作者头像 李华
网站建设 2026/9/17 19:08:32

数据团队用 Claude Slides,TaoToken 控制预算

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/17 19:08:28

Spring Boot校园失物招领系统实战:从开发到部署

简介&#xff1a;本资源是一份面向计算机专业本科生的毕业设计参考论文&#xff0c;聚焦校园失物招领系统的设计与实现&#xff0c;为Java方向毕设选题提供完整理论支撑与技术落地方案。全文采用SpringBootMyBatisVueB/S架构&#xff0c;覆盖系统需求分析、数据库设计&#xff…

作者头像 李华
网站建设 2026/9/17 19:07:13

连上 TaoToken 后,AppWorld 里 GPT-4.1 智能体重跑一致性

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/17 19:06:44

SolidWorks工程图链接零件属性实操指南(Win10+SW2016)

1. 这不是“填表”&#xff0c;是打通工程图与BOM数据流的关键一环在SolidWorks 2016跑在Windows 10系统上做机械设计时&#xff0c;你有没有遇到过这种场景&#xff1a;零件模型里改了个材料牌号&#xff0c;或者更新了供应商编码&#xff0c;结果工程图标题栏里的对应字段还是…

作者头像 李华