【信号与系统实验】MATLAB实战:从基础波形生成到LTI系统时域响应分析 1. MATLAB信号生成基础从门函数到三角波刚接触信号处理时我总被各种抽象公式搞得头晕眼花直到发现用MATLAB几行代码就能把数学公式变成可视化的波形。咱们先从最基础的门函数、冲激函数和三角波开始这些可是后续系统分析的原材料。1.1 门函数数字世界的开关门函数矩形脉冲就像电路里的开关突然接通又突然断开。MATLAB的rectpuls函数能快速生成这类信号。来看个具体例子t -3:0.02:3; % 时间轴从-3到3步长0.02 width 3; % 脉冲宽度 y 1.5 * rectpuls(t, width); % 生成高度1.5的矩形脉冲 figure; plot(t, y, LineWidth, 2); title(门函数信号 (宽度3)); xlabel(时间 t); ylabel(幅值); axis([-3 3 -0.2 1.8]); % 设置坐标轴范围 grid on;这里有个实用技巧rectpuls默认以t0为中心对称。如果想平移信号只需修改时间参数y_shifted rectpuls(t-1.5, width); % 向右平移1.5秒1.2 冲激函数系统的指纹采集器严格意义的冲激函数在现实中不存在但我们可以用窄矩形脉冲来近似。MATLAB没有直接生成冲激的函数但可以这样模拟t -3:0.02:3; pulse_width 0.1; % 脉冲越窄越接近理想冲激 amplitude 1/pulse_width; % 面积归一化 y amplitude * rectpuls(t, pulse_width); figure; plot(t, y, LineWidth, 2); title(近似冲激函数); xlabel(时间 t); ylabel(幅值); axis([-1 1 -5 amplitude10]);关键点冲激函数的面积幅值×宽度要保持为1这是模拟时的核心原则。我曾在实验中忘记归一化导致后续系统响应计算全部出错排查了半天才发现这个低级错误。1.3 三角波从简单到复杂三角波的生成方式多样这里演示两种实用方法方法一直接拼接线性段t 0:0.01:2; y sawtooth(2*pi*0.5*t, 0.5); % 0.5表示对称三角波 figure; plot(t, y, LineWidth, 2); title(对称三角波 (频率0.5Hz)); xlabel(时间 t); ylabel(幅值);方法二叠加余弦函数t 0:0.001:1; A 1; w0 2*pi; y A * cos(w0*t) .* cos(w0*t); // 等价于cos²(2πt) figure; plot(t, y, LineWidth, 2); title(平方余弦波); xlabel(时间 t); ylabel(幅值);实际项目中我曾用三角波测试系统非线性特性。当输入幅值过大时输出波形会出现削顶失真这个现象通过MATLAB可视化一目了然比看数据表格直观多了。2. 连续时间系统分析阶跃与冲激响应有了信号生成基础我们进入系统分析的核心环节。线性时不变(LTI)系统对阶跃和冲激的响应就像人的应激反应能完整表征系统特性。2.1 阶跃响应系统的启动过程用step函数分析三阶系统的阶跃响应% 定义三个不同系统 sys1 tf([1], [1 5 6]); % 系统1阻尼较大 sys2 tf([1], [1 2 5]); % 系统2欠阻尼振荡 sys3 tf([1], [1 2 1]); % 系统3临界阻尼 t 0:0.1:10; [y1, t] step(sys1, t); y2 step(sys2, t); y3 step(sys3, t); figure; plot(t, y1, b, t, y2, r--, t, y3, g, LineWidth, 1.5); legend(过阻尼系统, 欠阻尼系统, 临界阻尼系统); title(不同阻尼比的阶跃响应对比); xlabel(时间 t); ylabel(响应幅值); grid on;工程经验在电机控制系统中阶跃响应超调量过大可能导致机械损伤。通过这样的对比仿真可以提前优化控制器参数。2.2 冲激响应系统的本质特征冲激响应是系统的指纹用impulse函数获取sys tf([-1 2], [1 3 2]); % 定义系统传递函数 t -1:0.01:5; figure; subplot(1,2,1); impulse(sys, t); % 直接绘制冲激响应 title(冲激响应 (自动绘图)); subplot(1,2,2); [y, t] impulse(sys, t); % 获取数据手动绘图 plot(t, y, LineWidth, 1.5); title(冲激响应 (手动处理)); xlabel(时间 t); grid on;2.3 任意输入的响应模拟实际工程中更多遇到的是复杂输入lsim函数大显身手sys tf([1], [1 2 100]); % 二阶系统 t 0:0.01:5; f 10*sin(2*pi*t); % 正弦输入 y lsim(sys, f, t); % 模拟系统响应 figure; plot(t, f, b:, t, y, r-, LineWidth, 1.5); legend(输入信号, 系统响应); title(正弦激励下的系统响应); xlabel(时间 t); grid on;调试技巧曾遇到lsim输出异常后发现是时间步长过大导致仿真失真。建议初始仿真时先用较大步长快速验证最终运行时再减小步长提高精度。3. 系统建模与传递函数3.1 从微分方程到传递函数假设系统微分方程为 $$ \frac{d^2y}{dt^2} 5\frac{dy}{dt} 6y 2\frac{df}{dt} 3f $$MATLAB建模只需一行代码sys tf([2 3], [1 5 6]); % 分子分母按s的降幂排列易错点方程缺项时必须补零。比如 $$ \frac{d^3y}{dt^3} 2y f $$ 要表示为sys tf([1], [1 0 0 2]); % 注意二阶和一阶导数项补零3.2 多系统对比分析在同一个坐标系中比较多个系统的频率响应sys1 tf([1], [1 3 2]); sys2 tf([1], [1 1 1]); sys3 tf([1], [1 0.5 1]); figure; subplot(1,2,1); step(sys1, b, sys2, r--, sys3, g-.); legend(系统1, 系统2, 系统3); subplot(1,2,2); impulse(sys1, b, sys2, r--, sys3, g-.); legend(系统1, 系统2, 系统3);4. 实战技巧与常见问题4.1 信号卷积的数值计算虽然MATLAB有conv函数但处理连续信号时需要特别注意时间对齐和幅值缩放dt 0.01; % 时间分辨率 t -1:dt:2.5; f1 heaviside(t) - heaviside(t-2); % 矩形脉冲 f2 exp(-3*t) .* heaviside(t); % 指数衰减 % 卷积计算 conv_result conv(f1, f2) * dt; % 必须乘以dt conv_t (0:length(conv_result)-1)*dt t(1)*2; figure; plot(t, f1, b, t, f2, r, conv_t, conv_result, k, LineWidth, 1.5); legend(f1(t), f2(t), 卷积结果); title(连续信号卷积的数值计算);4.2 频域与时域联合分析结合bode和step函数全面了解系统特性sys tf([1], [1 0.5 1]); figure; subplot(1,2,1); bode(sys); % 频域特性 grid on; subplot(1,2,2); step(sys); % 时域特性 grid on;经验分享在滤波器设计中我曾发现阶跃响应良好的系统在实际音频处理中表现不佳后来通过频域分析发现其阻带衰减不足。这提醒我们必须要多维度验证系统性能。5. 综合案例音频处理系统仿真让我们模拟一个简单的低通滤波系统对音频信号的影响% 生成含高频噪声的音频信号 Fs 44100; % 采样率 t 0:1/Fs:1; f_clean sin(2*pi*440*t); % 440Hz纯音 f_noise 0.2*sin(2*pi*5000*t); % 高频噪声 f_input f_clean f_noise; % 设计二阶低通滤波器 (截止频率1000Hz) fc 1000; w fc/(Fs/2); [b, a] butter(2, w, low); % 时域仿真 output lsim(tf(b,a,1/Fs), f_input, t); % 绘制结果 figure; subplot(2,1,1); plot(t(1:1000), f_input(1:1000)); title(输入信号 (含高频噪声)); subplot(2,1,2); plot(t(1:1000), output(1:1000)); title(滤波后信号);这个案例展示了如何将抽象的LTI系统理论与实际工程问题结合。通过调整滤波器参数可以直观观察到不同截止频率对噪声的抑制效果。