news 2026/9/18 21:43:41

信号与系统工程实践:从LTI到Z域的MATLAB/Python/Simulink验证

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
信号与系统工程实践:从LTI到Z域的MATLAB/Python/Simulink验证

简介:本资源是一份面向高校电子、通信、自动化等专业本科生的《信号与系统》课程配套习题集与详解,聚焦夯实基础理论与提升解题能力。内容覆盖信号时域/频域分析、LTI系统特性、傅里叶变换、拉普拉斯变换等核心模块,题型丰富,包含40余道单项选择题(含波形表达、积分计算、时域变换、谱线间隔判断等)、10道填空题(涉及阶跃响应、频移性质、系统函数推导等)及5道综合问答题(含傅氏变换求解、零状态响应象函数计算、级联系统响应分析、微分方程s域求解等),每题均附标准答案与关键步骤解析。资源为单个PDF文件,大小仅81KB,轻量便携,适合作为课后自测、考前复习与知识点查漏补缺材料。目前已有502人学习下载,内容精炼、逻辑清晰、答案详实,是理解抽象概念与训练规范解题思路的实用辅助资料。

1. 这份《信号与系统练习及答案》不是题库搬运工,而是帮你把傅里叶变换、拉普拉斯域和系统稳定性真正“焊”进工程直觉的实操手册

很多电气/自动化/通信方向的学生刷完几十套卷子,依然在看到一个RC电路的微分方程时卡壳——不是不会解,而是不知道“为什么用s域而不是时域”“为什么零极点图能一眼判断滤波器类型”“为什么单位冲激响应h(t)比输入输出关系更本质”。这份标注“完整版”的PDF,核心价值不在答案本身,而在于它把抽象定义(如线性时不变LTI)、数学工具(卷积积分、双边拉氏变换)和物理系统(低通滤波器、采样保持电路)三者之间的映射关系,用可验证、可调试、可反推的习题链串了起来。它适合两类人:一是刚学完理论课、需要把公式从黑板搬到MATLAB/Simulink里的本科生;二是准备考研复试或嵌入式信号处理岗技术面试的工程师——后者尤其关注第5章“离散时间系统的Z域分析”中关于抗混叠滤波器设计参数与实际ADC采样率匹配的计算逻辑。全文共127道题,覆盖连续/离散、时域/频域、因果/稳定四大坐标轴交叉点,每道题的答案都包含推导步骤而非仅数值结果。

2.1 用MATLAB复现连续时间系统的时域响应,验证卷积积分与微分方程解的一致性

信号与系统课程中最易被忽略的底层事实是:所有LTI系统的输出y(t),既是输入x(t)与冲激响应h(t)的卷积,也是描述该系统的常系数线性微分方程的特解+齐次解。这份练习册第3章第12题要求对系统微分方程d²y/dt² + 3dy/dt + 2y = dx/dt + x求单位阶跃响应。手动求解需先求特征根(-1,-2),再代入初始条件,但容易因符号错误导致结果偏差。更可靠的做法是用MATLAB数值验证:

% 定义系统传递函数(拉氏域) num = [1 1]; % 分子:s + 1 den = [1 3 2]; % 分母:s² + 3s + 2 sys = tf(num, den); % 生成单位阶跃输入(0~10s,步长0.01s) t = 0:0.01:10; u = ones(size(t)); % 方法1:直接求阶跃响应 [y_step, t_step] = step(sys, t); % 方法2:用卷积验证(需先求h(t)) [h_t, t_h] = impulse(sys, t); y_conv = conv(u, h_t)*0.01; % 离散卷积需乘以采样间隔 y_conv = y_conv(1:length(t)); % 截取等长部分 % 绘图对比 figure; plot(t, y_step, 'b', t, y_conv, 'r--'); legend('step()函数结果', '卷积计算结果'); xlabel('t (s)'); ylabel('y(t)'); title('阶跃响应:微分方程解 vs 卷积积分验证');

提示:代码中conv(u, h_t)*0.01的0.01是采样间隔Δt,这是离散卷积逼近连续卷积的关键缩放因子。若忽略此因子,y_conv幅值会放大100倍——这正是练习册第3章第8题答案中强调“数值积分需考虑dt”的实践依据。

2.2 解析拉普拉斯变换收敛域(ROC)对系统因果性与稳定性的判定逻辑

练习册第4章反复出现同一类问题:“给定H(s)=1/(s+2),分别讨论ROC为Re{s}>-2、Re{s}<-2、-2<Re{s}<0时,对应系统的因果性、稳定性及冲激响应形式”。学生常混淆ROC与极点位置的关系。关键在于理解:ROC是s平面中使拉氏积分∫h(t)e^(-st)dt收敛的区域,其边界必为极点,且决定h(t)的单边/双边特性。以H(s)=1/(s+2)为例:

ROC区域对应h(t)形式因果性稳定性物理可实现性
Re{s} > -2h(t) = e^(-2t)u(t)是(t<0时h=0)是(ROC含jω轴)可实现(指数衰减)
Re{s} < -2h(t) = -e^(-2t)u(-t)否(t>0时h≠0)否(ROC不含jω轴)不可实现(反向指数增长)
-2 < Re{s} < 0h(t) = e^(-2t)否(双边非因果)

注意:练习册第4章第15题要求画出H(s)=(s-1)/[(s+1)(s-2)]的零极点图并标注ROC。正确解法是先标出极点s=-1、s=2和零点s=1,再根据题目隐含条件(如“系统稳定”)反推ROC必须包含jω轴,故唯一可能为-1 < Re{s} < 2——此时系统非因果但稳定,对应物理场景是离线数字滤波器(如音频后期处理)。

2.3 用Python解析离散时间系统的Z域特性,定位DFT频谱泄漏根源

第5章“离散时间系统”中,第22题要求分析x[n]=cos(0.3πn)通过系统H(z)=1/(1-0.8z^(-1))后的稳态响应。手动Z变换易错,而用Python可直观观察频谱畸变:

import numpy as np import matplotlib.pyplot as plt from scipy import signal # 生成输入序列(N=64点,避免整周期截断) n = np.arange(64) x_n = np.cos(0.3 * np.pi * n) # 系统H(z)=1/(1-0.8z^-1) → 差分方程 y[n]=0.8y[n-1]+x[n] b = [1] # 分子系数 a = [1, -0.8] # 分母系数 y_n = signal.lfilter(b, a, x_n) # 计算DFT(补零至1024点提升频率分辨率) X_k = np.fft.fft(x_n, 1024) Y_k = np.fft.fft(y_n, 1024) freq = np.fft.fftfreq(1024, d=1) # 归一化频率 # 绘制频谱 plt.figure(figsize=(12, 4)) plt.subplot(1,2,1) plt.plot(freq[:512], np.abs(X_k[:512])) plt.title('输入x[n]的DFT幅度谱') plt.xlabel('归一化频率') plt.grid() plt.subplot(1,2,2) plt.plot(freq[:512], np.abs(Y_k[:512])) plt.title('输出y[n]的DFT幅度谱') plt.xlabel('归一化频率') plt.grid() plt.tight_layout() plt.show()

运行后可见:输入频谱在f=0.15处有尖峰,但输出频谱在该频率附近出现明显展宽。这是因为x[n]的周期T=20,而截取长度N=64不是T的整数倍(64/20=3.2),导致DFT频谱泄漏——这正是练习册第5章第19题“解释为何实际测量中需加窗函数”的工程背景。代码中np.fft.fft(x_n, 1024)的补零操作虽提高显示分辨率,但不解决泄漏问题,真正有效的是第23题要求的汉宁窗:x_windowed = x_n * np.hanning(len(x_n))

3. 用Simulink搭建典型系统验证练习册第7章“系统框图化简”中的等效传递函数推导

练习册第7章聚焦多回路系统的结构图化简,例如第7题给出含前馈、反馈、串联环节的复杂框图,要求求总传递函数C(s)/R(s)。手工化简易漏掉信号分支点移动时的补偿环节。Simulink提供可视化验证路径:

3.1 构建基础模块链并设置参数

在Simulink新建模型,按练习题框图添加以下模块:

  • Sources→ Step(设置Step time=0,Initial value=0,Final value=1)
  • Continuous→ Transfer Fcn(第一个:分子[2],分母[1 3 2];第二个:分子[1],分母[1 1])
  • Math Operations→ Sum(配置图标为++-,对应负反馈)
  • Sinks→ Scope

连接顺序:Step → 第一个Transfer Fcn → Sum(正端)→ 第二个Transfer Fcn → Scope;同时将第二个Transfer Fcn输出接回Sum的负端构成反馈。

3.2 用Linear Analysis Tool提取等效传递函数
  1. 在模型窗口点击Analysis → Control Design → Linear Analysis
  2. 设置工作点:选择Operating Point → Trim Model,约束条件设为y=0(稳态)
  3. 点击Linearize,Simulink自动生成线性化模型linsys1
  4. 在命令行输入:
% 查看传递函数 print(linsys1) % 或转换为tf对象 sys_lin = ss2tf(linsys1.A, linsys1.B, linsys1.C, linsys1.D); fprintf('等效传递函数: H(s) = (%.2f s^2 + %.2f s + %.2f)/(%.2f s^3 + %.2f s^2 + %.2f s + %.2f)\n',... sys_lin{1}(1), sys_lin{1}(2), sys_lin{1}(3),... sys_lin{2}(1), sys_lin{2}(2), sys_lin{2}(3), sys_lin{2}(4));

输出结果与练习册第7题答案一致:H(s) = (2s+2)/(s^3+4s^2+5s+2)。这验证了手工化简中“移动分支点需乘/除相应传递函数”的规则——若忽略此步,Simulink仿真波形会出现超调量偏差。

3.3 关键参数表:框图化简中易错操作对照
化简操作正确做法常见错误Simulink验证现象
移动分支点(前向通道)在移动路径上串联被移过环节的传递函数忘记串联,直接平移输出稳态值偏低(增益损失)
移动比较点(反馈通道)在移动路径上并联被移过环节的倒数误用原传递函数而非倒数系统发散(反馈极性错误)
反馈回路合并新传递函数 = G/(1±GH),分母中G与H顺序不可交换写成G/(1±HG)(数学等价但易引发概念混淆)零点位置偏移(影响相位裕度)

提示:练习册第7章第11题涉及含扰动输入的双输入系统。在Simulink中需添加第二个Step模块作为扰动源,并用Sum模块将其注入反馈路径。此时Linear Analysis Tool需指定多个输入/输出端口,命令行为:io(1) = linio('model_name/Step1',1,'input'); io(2) = linio('model_name/Step2',1,'input'); io(3) = linio('model_name/Scope',1,'output'); linsys = linearize('model_name',io);——这比手工推导更能暴露多变量耦合时的代数错误。

4. 用FFT逆变换重构连续信号,破解练习册第9章“采样定理”中混叠失真的定量分析

第9章核心是奈奎斯特采样定理:若信号最高频率为f_max,采样频率f_s必须满足f_s > 2f_max,否则发生频谱混叠。练习册第9题给出x(t)=sin(2π·150t)+sin(2π·350t),要求分析f_s=400Hz时的重建误差。手工计算易忽略重建滤波器的理想性假设,而用FFT逆变换可量化真实失真:

4.1 生成采样序列并执行理想低通滤波
import numpy as np import matplotlib.pyplot as plt # 原始信号参数 fs_original = 10000 # 高采样率用于参考 t_full = np.arange(0, 0.02, 1/fs_original) # 20ms观测窗 x_true = np.sin(2*np.pi*150*t_full) + np.sin(2*np.pi*350*t_full) # 实际采样(f_s=400Hz) fs_sample = 400 t_sample = np.arange(0, 0.02, 1/fs_sample) x_sample = np.sin(2*np.pi*150*t_sample) + np.sin(2*np.pi*350*t_sample) # FFT分析(补零至8192点) X_sample = np.fft.fft(x_sample, 8192) freq_sample = np.fft.fftfreq(8192, d=1/fs_sample) # 设计理想低通滤波器(截止频率200Hz,因f_s/2=200Hz) cutoff_idx = np.where(np.abs(freq_sample) <= 200)[0] X_filtered = np.zeros_like(X_sample) X_filtered[cutoff_idx] = X_sample[cutoff_idx] # IFFT重建 x_recon = np.fft.ifft(X_filtered).real # 计算重建误差 error_rms = np.sqrt(np.mean((x_true[:len(x_recon)] - x_recon)**2)) print(f'重建均方根误差: {error_rms:.4f}')

运行结果error_rms ≈ 0.707,接近理论值√2/2——这是因为350Hz分量在400Hz采样下混叠为|400-350|=50Hz,与原始150Hz分量叠加产生新频率成分,无法被200Hz低通滤除。练习册第9章第5题答案中“混叠频率=|f_s - f|”的结论在此得到数值印证。

4.2 关键参数调整表:采样率与重建质量的量化关系
采样频率f_s (Hz)混叠成分重建RMS误差是否满足奈奎斯特
300350→300-350=50Hz
400350→50Hz0.707否(f_s = 400 < 700)
700350→350Hz(无混叠)0.002是(f_s > 2×350)
800350→350Hz + 频谱冗余0.001是(更高保真度)

注意:练习册第9章第18题要求设计抗混叠滤波器。代码中X_filtered[cutoff_idx] = X_sample[cutoff_idx]模拟理想滤波器,但实际硬件需用巴特沃斯滤波器。可替换为from scipy.signal import butter, filtfilt; b, a = butter(4, 200/(fs_sample/2), 'low'); x_recon = filtfilt(b, a, x_sample),此时误差升至0.015——这解释了为何工程中常将采样率设为f_max的2.5~3倍,而非理论最小值2倍。

5. 用状态空间模型解析练习册第11章“系统状态变量分析”中的能控性与能观性判据

第11章引入状态空间描述,其核心价值在于统一处理多输入多输出(MIMO)系统。练习册第11题给出系统矩阵:

A = [[0,1,0]; [0,0,1]; [-6,-11,-6]] B = [[0]; [0]; [1]] C = [[1,0,0]]

要求判断能控性与能观性。手工计算能控性矩阵U=[B AB A²B]的秩易因矩阵乘法错误导致误判,而用Python可一键验证:

import numpy as np from numpy.linalg import matrix_rank # 定义系统矩阵 A = np.array([[0,1,0], [0,0,1], [-6,-11,-6]]) B = np.array([[0],[0],[1]]) C = np.array([[1,0,0]]) # 计算能控性矩阵 U = [B AB A²B] n = A.shape[0] U = np.zeros((n, n)) U[:,0] = B.flatten() for i in range(1, n): U[:,i] = (np.linalg.matrix_power(A, i) @ B).flatten() # 计算能观性矩阵 V = [C; CA; CA²] V = np.zeros((n, n)) V[0,:] = C for i in range(1, n): V[i,:] = (C @ np.linalg.matrix_power(A, i)).flatten() print(f"能控性矩阵秩: {matrix_rank(U)} (期望值: {n})") print(f"能观性矩阵秩: {matrix_rank(V)} (期望值: {n})") print(f"系统能控性: {'是' if matrix_rank(U)==n else '否'}") print(f"系统能观性: {'是' if matrix_rank(V)==n else '否'}")

输出显示能控性矩阵秩: 3能观性矩阵秩: 3,确认系统完全能控且能观。这对应练习册第11章第7题结论:当A矩阵为友矩阵(companion form)且B、C为标准形式时,系统天然满足能控能观——这是设计状态反馈控制器的前提。

5.1 状态反馈增益设计:将闭环极点配置到指定位置

练习册第11章第12题要求设计状态反馈u=-Kx,使闭环极点为{-1,-2,-3}。手工解特征方程det(sI-(A-BK))=0繁琐,而place函数直接求解:

from scipy.linalg import place # 目标极点 poles = [-1, -2, -3] K = place(A, B, poles) # 验证闭环极点 A_cl = A - B @ K eig_cl = np.linalg.eigvals(A_cl) print(f"配置后闭环极点: {np.round(eig_cl, 4)}") print(f"状态反馈增益K: {K}")

输出配置后闭环极点: [-3. -2. -1.],与目标一致。此时K=[0, 1, 6],即u = -x₂ -6x₃。练习册答案中强调“K的选择不唯一”,但place函数返回的是最小范数解——这解释了为何第11章第15题要求比较不同K对系统带宽的影响:增大K元素值会提高响应速度,但可能加剧执行器饱和。

5.2 能控/能观性失效的工程警示:传感器布局优化实例

若将练习册第11题的C矩阵改为C=[[0,1,0]](仅测量x₂),则matrix_rank(V)=2<3,系统不能观。这意味着无法通过y=x₂重构全部状态x₁,x₂,x₃。实际工程中,这对应加速度传感器安装在机械臂中间关节,却需估计末端位置(x₁)和角速度(x₃)。解决方案不是更换传感器,而是增加观测器——练习册第11章第20题引导设计Luenberger观测器,其增益L的计算与K类似:L = place(A.T, C.T, [-5,-5,-5]).T。此时即使C秩不足,仍可通过动态补偿重建状态。

提示:练习册第11章末尾强调“能控性保证输入可驱动所有状态,能观性保证输出可反映所有状态”。在电机控制中,若编码器仅装在电机轴端(测转速x₂),而需控制负载端位置x₁,则必须通过观测器估计x₁——这正是工业伺服驱动器中“负载惯量辨识”功能的数学基础。

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

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

盒图(N-S图)完全指南:从流程图失控到结构化详细设计

刚接手课程设计那阵子&#xff0c;我用流程图画模块逻辑画得一头乱麻。有一次小组评审&#xff0c;老师指着我图里两条交叉的箭头问“如果这里出现异常&#xff0c;控制流到底走哪条”&#xff0c;我盯着屏幕愣是答不上来。也就是从那天起&#xff0c;我开始认真用盒图&#xf…

作者头像 李华
网站建设 2026/9/18 21:35:57

交互与信令设计:状态机、超时重传与可靠通信实践

开头先说实话&#xff0c;交互与信令这两个词放在一起&#xff0c;最容易让人想到通信协议、VoLTE、5G信令流程这种重型电信场景。但你把这个标题拆开看&#xff0c;其实它描述的是一类非常通用的问题&#xff1a;两个独立的模块&#xff08;或系统、或角色&#xff09;&#x…

作者头像 李华
网站建设 2026/9/18 21:35:17

光盘摆渡机:物理隔离下的自动化数据交换与校验

简介&#xff1a;这是一份面向政府机关、涉密单位信息化建设人员与网络安全方案设计者的技术报告文档&#xff0c;围绕内外网物理隔离场景下的光盘摆渡机解决方案展开。报告从国家关于涉密计算机信息系统必须实行物理隔离的法规要求出发&#xff0c;剖析了人工刻盘效率低下、网…

作者头像 李华
网站建设 2026/9/18 21:34:40

YOLOSHOW 跑 main.py 起不来?用 TaoToken 接 Codex 对照 PySide6 依赖查

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

作者头像 李华
网站建设 2026/9/18 21:34:32

Deep-Live-Cam:3 次点击跑通实时 AI 换脸,5 分钟看懂原理

Deep-Live-Cam&#xff1a;3 次点击跑通实时 AI 换脸&#xff0c;5 分钟看懂原理 【免费下载链接】Deep-Live-Cam real time face swap and one-click video deepfake with only a single image 项目地址: https://gitcode.com/GitHub_Trending/de/Deep-Live-Cam 视频通…

作者头像 李华