尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

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

MATLAB信号与系统实验:LTI系统仿真与傅里叶变换实战指南 简介《华南理工大学信号与系统实验报告四》是一份面向信号与系统课程学习者的完整实验报告聚焦时域抽样与频域抽样两大核心定理。压缩包内共1个doc文档仅276KB但内容覆盖实验目的、操作步骤、MATLAB源代码、波形分析及思考题解答适合需要完成同类实验或复习抽样理论的学生参考。已有727人学习/下载具备一定认可度。报告通过具体案例对比了抽样频率对信号恢复的影响例如以50Hz抽样10Hz、50Hz、100Hz信号时仅有10Hz信号不失真还推导了幅度调制信号的最高频率与采样率演示了抽样与重建过程并验证了频域抽样点数N小于序列长度时会产生时域混叠。这些实验细节和程序代码能帮助读者直观理解奈奎斯特定理掌握离散化与重建的工程实现方法。1. 从实验报告四看信号与系统LTI系统从理论到MATLAB的落地如果你正在写华南理工大学信号与系统实验报告四大概率要面对同一件事把课堂上手推的傅里叶变换、卷积、频率响应放进MATLAB里让曲线替你说话。这门课有大量理论公式但实验报告并不是把公式抄进“原理”栏就完事真正难的是仿真结果和理论值对不上时你能用参数折算出误差再用报告说服评审人这是合理的。我从第一次接触MATLAB里的conv、freqs、lsim这类函数时卡过的坑到后来用同一套流程处理滤波器设计和系统辨识实验总结下来实验报告四的核心就三个时域卷积是否与频域相乘一致、系统频率响应曲线是否符合解析解、以及信号采样和数值离散引入的误差边界。以下内容按“理论验证→仿真搭建→数据整理→进阶输出”的顺序展开所有代码都能在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).*(t0); % 指数衰减冲激响应 % 时域卷积 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引入的循环卷积在边界处混叠。参数选择上dt0.001意味着频率分辨率为1/2Hz左右能覆盖常见信号的频谱如果改用dt0.0001计算点数量上升到20000曲线会更光滑但内存和绘图时间都会增加。对于实验报告四dt取信号最高频率的1/20以下就够了。2.2 用freqs绘制系统频率响应时的参数陷阱频率响应是系统对正弦输入的稳态增益和相位变化。连续系统用freqs(b, a, w)计算其中b和a是传递函数分子分母系数w必须用角频率rad/s不是Hz。很多人在实验报告四里把频率轴标成Hz却用2*pi*f代入导致截止频率位置偏移这是第一类扣分点。以RC低通滤波器为例传递函数为H(s)1/(1sRC)令sjω幅频特性是|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先检查R和C的数值再检查是否把衰减倍数和dB混淆了。常见参数误区如下表参数误用方式正确做法w直接写频率f使用角频率2*pi*f或明确freqs输入abs忘记取模而直接画复数abs(H)相位用angle(H)坐标轴用线性轴画宽频段用semilogx或loglog相位范围直接angle出现跳变unwrap展开后转角度如果实验报告四要求测量某个系统的频率响应我一般会让w范围覆盖截止频率前后三个十倍频程这样波特图里低频段和高频段的渐近线都能看清。2.3 从频域回到时域什么是系统真正的稳态响应有了频率响应不等于就能直接画出任意输入下的波形。实验四经常要求给一个方波观察通过低通滤波器后的畸变。方波含有基波和奇次谐波低通滤波器会削弱高次谐波时域波形就会变得平缓。这里要区分“稳态”和“瞬态”。lsim仿真得到的初始段包含系统零输入响应如果在开头就测量幅值结果会偏大。我在报告里处理这个问题的办法是先让仿真运行到系统时间常数的5倍左右再取最后一段作为稳态数据。时间常数τRC如果R1e3、C1e-6τ1ms那么仿真至少跑5ms我通常直接跑50ms取后半段。这样的稳态幅值用rms或max/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时要注意扫频速度过快系统来不及到达稳态幅值会在上升过程中被低估。所以扫频时间要足够长。这里的t0.05对应扫频周期2kHz不是循环只是单次扫过。生成信号后下一步是建立系统的数学模型。如果实验指导书给的是电路图你可以用tf直接建立模拟系统如果给的是微分方程先改写成b、a系数。常见的二阶系统wn 2*pi*100; % 自然频率100Hz zeta 0.3; % 阻尼比 b wn^2; % 分子常数 a [1, 2*zeta*wn, wn^2]; % 分母系数 sys tf(b, a); % 建立传递函数模型这个sys对象可以作为整体传给lsim、step、freqs等函数。阻尼比zeta0.3时系统的阶跃响应有约37%超调频率响应在谐振峰附近有凸起。如果你们实验四指定的系统是欠阻尼zeta1/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那么频率间隔必须小于2HzN至少为fs/25000。如果直接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*RC5ms取80ms以后的数据已经足够安全。如果你在数据里看到仿真增益稳定大于理论值先检查是否取了瞬态段。运行后把results复制到Excel或直接粘贴到Word。如果你只是自己看也可以用writematrix(results, data.csv, Delimiter, ,)导出。4.2 误差分析报告哪些误差可以解释哪些是测量错误写实验报告四的误差分析时不要笼统写“存在系统误差”。要具体到来源。常见的四类数值积分误差conv和fft的矩形积分近似存在O(dt)阶误差可以减小dt验证趋势截断泄漏信号窗两端未衰减到零频谱会有旁瓣表现为主瓣变宽瞬态截取误差测量段包含衰减分量导致幅值偏大或偏小混叠误差采样率低于信号最高频率的两倍高频会折返到低频。如果在第四类数据中发现仿真增益在1000Hz处比理论值低5%而2000Hz处低20%通常不是算法问题而是你的稳态截取窗口太短或者采样率不够高。把fs提高一个数量级再跑一次看看结果是否变化如果变化不大就说明采样率已经足够。4.3 报告里图表摆放的层级结构实验四的报告评审人最反感的是“只有图没有数据”。我建议每一幅图下面都要有一个表至少包含输入信号参数、系统参数、理论结果、仿真结果、误差百分比。表格用三线表顶部粗线、表头下细线、底部粗线即可。图不要截屏用矢量图插入分辨率至少在300dpi。图例文字不能是x_square、y1这样的变量名必须写“输入方波”“系统输出”等。如果实验报告四要求比较不同阻尼比或不同截止频率可以用子图网格。每张子图标题写明工况比如“阻尼比ζ0.3自然频率f_n100Hz”。图内坐标轴单位不能丢相位图的纵轴写“相位 (°)”横轴写“频率 (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); endstepinfo默认调节时间是误差带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[width0.8\textwidth]{experiment4_convolution.pdf}矢量PDF在LaTeX里排列时不会像PNG那样边缘模糊。本文还有配套的精品资源点击获取
返回列表