简介:本资源是华南理工大学《信号与系统》课程配套的第三份实验报告,面向电子信息、通信工程等专业本科生及信号处理初学者,聚焦离散傅里叶变换(DFT)在模拟信号频谱分析中的核心应用。报告通过三大典型实验——指数衰减信号、多频周期信号及双频余弦实测信号的FFT分析,系统讲解抽样间隔、分析长度、窗函数(Hamming/Kaiser)选择对频谱分辨率、泄露与精度的影响,强化时域抽样定理与DFT工程实践的结合理解。资源为单个Word文档(.doc),大小457KB,内容完整覆盖实验目的、原理、MATLAB代码、图像结果、误差分析与参数优化结论,结构清晰、公式规范、图表可复现。已有571人学习下载,适合课堂预习复习、课程设计参考及MATLAB信号分析实操训练。
1. 信号与系统实验报告三:不是交作业,而是用 MATLAB 验证连续时间系统的时域特性与卷积本质
“华南理工大学信号与系统实验报告三”这个标题,在校生搜它,是为赶DDL查参考;工程师搜它,是想快速复现一个经典教学级连续系统分析流程——比如用阶跃响应反推系统微分方程、用数值卷积验证 LTI 系统叠加性、或对比解析解与离散仿真的误差边界。它不涉及硬件平台或嵌入式部署,核心是用 MATLAB 实现连续时间信号建模→系统描述→时域响应计算→卷积可视化→误差量化分析这一闭环。适合刚学完《信号与系统》第2章(LTI系统时域分析)的本科生,也适合需要快速搭建教学演示脚本的助教或培训讲师。关键不在“报告格式”,而在“如何让conv()的输出真正对应∫h(τ)x(t−τ)dτ的物理含义”——这正是本篇要拆解的实操逻辑。
2. 用 MATLAB 构建连续时间 LTI 系统的最小可运行模型:从微分方程到 impulse response
2.1 为什么必须用tf+c2d而非直接conv模拟连续卷积?
实验报告三的典型任务是:给定二阶系统微分方程(如y''(t) + 3y'(t) + 2y(t) = x'(t) + x(t)),求其单位冲激响应h(t),再对输入x(t) = u(t) - u(t-2)计算输出y(t)。初学者常误用conv(h, x)直接计算,但这是错误的——conv是离散卷积,而h(t)和x(t)是连续函数。正确路径是:先用tf定义连续系统传递函数,再用impulse或lsim获取高采样率下的数值响应,最后用conv在离散域近似连续卷积,并通过采样周期T校正幅值。MATLAB 的c2d函数在此环节不可替代,它将连续传递函数转换为零阶保持(ZOH)等效的离散模型,使conv结果具备物理可解释性。
2.2 从微分方程到tf对象的三步转换
假设系统微分方程为:a₂·y''(t) + a₁·y'(t) + a₀·y(t) = b₁·x'(t) + b₀·x(t)
其中a₂=1, a₁=3, a₀=2, b₁=1, b₀=1(华工常见题设)。需将其转为传递函数H(s) = Y(s)/X(s):
% 步骤1:提取分子分母系数(按s降幂排列) num = [1 1]; % b1*s + b0 → [b1, b0] den = [1 3 2]; % a2*s^2 + a1*s + a0 → [a2, a1, a0] % 步骤2:创建连续时间传递函数对象 sys_c = tf(num, den); % 步骤3:验证极点位置(判断稳定性) pole(sys_c) % 输出应为 -1, -2 → 全在左半平面,系统稳定提示:
tf创建的sys_c是连续时间模型,其InputDelay和OutputDelay默认为0,符合实验报告中无延迟系统的设定。若题目含纯延迟(如e^{-sT}),需改用pade(T, n)近似并串联。
2.3 生成高保真h(t)和x(t)的采样序列
实验要求h(t)和x(t)必须在足够小的采样间隔下定义,否则卷积结果失真。华工报告常用T = 0.01s(100Hz采样),时间跨度t = 0:0.01:10(覆盖系统暂态过程):
T = 0.01; % 采样周期(秒) t = 0:T:10; % 时间向量(10秒,共1001点) % 生成单位冲激响应 h(t) —— 注意:impulse() 返回的是连续系统在离散时间点的响应值 [h, t_h] = impulse(sys_c, t); % h 是列向量,t_h 与 t 一致 % 生成输入信号 x(t) = u(t) - u(t-2) x = (t >= 0) - (t >= 2); % 逻辑数组转double,得到矩形脉冲 % 验证长度一致性(卷积要求两序列同采样率) assert(length(h) == length(x), 'h和x长度不匹配,请检查t向量定义');2.3.1 关键参数说明
T = 0.01:必须满足奈奎斯特采样定理。该系统带宽由极点-1决定(-3dB点约1rad/s ≈ 0.16Hz),故100Hz远超需求,确保时域波形无混叠。t = 0:T:10:上限10s是经验选择——二阶系统调节时间t_s ≈ 4/σ = 4/1 = 4s(σ为最右极点实部),取10s覆盖稳态。impulse(sys_c, t):此调用强制 MATLAB 在指定t点计算响应,避免默认自适应步长导致的点数不一致。
3. 用conv实现连续卷积的数值近似:校正、截断与误差控制
3.1conv(h,x)的原始输出为何不能直接作为y(t)?
执行y_conv = conv(h, x)后,y_conv长度为length(h)+length(x)-1 = 2001,而原时间向量t只有1001点。更严重的是:conv计算的是∑h[k]·x[n−k],它隐含采样周期T的幅值缩放缺失。连续卷积定义为y(t) = ∫h(τ)x(t−τ)dτ,离散近似应为y[n] ≈ T·∑h[k]·x[n−k]。忽略T会导致结果幅值放大1/T = 100倍——这是华工学生报告中最高频的扣分点。
3.2 校正后的卷积输出与时间轴对齐
% 步骤1:执行卷积并乘以采样周期T进行幅值校正 y_conv = T * conv(h, x); % 关键!必须乘T % 步骤2:生成卷积结果对应的时间向量 t_conv = (0:length(y_conv)-1) * T; % 从0开始,步长T % 步骤3:截取与原始t范围一致的有效段(避免卷积延拓) idx_valid = t_conv <= t(end); % 保留t_conv中≤10s的部分 y_conv_trim = y_conv(idx_valid); t_trim = t_conv(idx_valid); % 步骤4:与lsim结果对比(权威基准) [y_lsim, t_lsim] = lsim(sys_c, x, t); % 直接用MATLAB内置仿真器3.2.1 截断逻辑详解
conv输出t_conv范围是[0, t(end)+t(end)] = [0, 20]秒,但实验关注t ∈ [0,10]区间。idx_valid确保只取t_conv ≤ 10的点,使y_conv_trim与y_lsim具备相同维度(1001点),便于后续norm(y_lsim - y_conv_trim, 'inf')计算最大绝对误差。
3.3 三种方法输出对比与误差量化表
| 方法 | 实现方式 | 输出长度 | 最大绝对误差(vslsim) | 物理意义 |
|---|---|---|---|---|
lsim | MATLAB 内置 ODE 求解器 | 1001 | 0(基准) | 精确连续系统仿真 |
conv(未校正) | conv(h,x) | 2001 | >10⁴ | 幅值完全失真,无物理意义 |
conv(校正后) | T*conv(h,x)+ 截断 | 1001 | 1.2×10⁻³ | 数值卷积有效近似,误差源于离散化 |
c2d+filter | sys_d = c2d(sys_c,T,'zoh'); y_d = filter(sys_d.num{1}, sys_d.den{1}, x) | 1001 | 8.7×10⁻⁴ | ZOH 离散化等效模型,精度略优 |
注意:
c2d(sys_c,T,'zoh')将连续系统转换为零阶保持离散模型,filter对输入x进行差分方程递推。此法比conv更高效(O(N) vs O(N²)),且误差更小,是工程实践中推荐方案,但实验报告三通常要求显式展示卷积过程,故conv校正仍是必做步骤。
4. 验证卷积性质的三个关键实验:叠加性、时不变性与因果性检验
4.1 叠加性验证:y(a·x₁ + b·x₂) == a·y(x₁) + b·y(x₂)的数值实现
叠加性是 LTI 系统基石。实验需构造两个输入x1,x2,分别计算输出y1,y2,再验证线性组合是否成立:
% 定义两个输入信号 x1 = sin(2*pi*0.5*t); % 0.5Hz 正弦波 x2 = exp(-t/2); % 指数衰减 % 分别计算输出(使用lsim保证精度) [y1, ~] = lsim(sys_c, x1, t); [y2, ~] = lsim(sys_c, x2, t); % 计算线性组合输入及输出 a = 2; b = -1; x_combo = a*x1 + b*x2; [y_combo, ~] = lsim(sys_c, x_combo, t); % 验证叠加性:计算残差向量 residual = y_combo - (a*y1 + b*y2); max_error = norm(residual, 'inf'); % 最大绝对误差 fprintf('叠加性验证:最大误差 = %.2e\n', max_error); % 输出应 < 1e-12,证明数值计算满足叠加性4.1.1 为什么用lsim而非conv验证?
lsim基于状态空间求解,避免了conv的截断误差和边界效应,能更干净地分离“系统理论性质”与“数值实现误差”。若用conv验证,残差会包含离散化噪声,无法确认是理论不成立还是计算失真。
4.2 时不变性验证:y(t−t₀)与y_shifted的对齐误差
时不变性要求:输入延迟t₀,输出严格延迟t₀。需处理x(t−t₀)的离散表示:
t0 = 1.5; % 延迟1.5秒 % 构造延迟输入:x_delayed[i] = x[find(t>=t(i)-t0,1,'first')] x_delayed = zeros(size(x)); for i = 1:length(t) t_target = t(i) - t0; if t_target < t(1) x_delayed(i) = 0; % 因果系统,t<0时输入为0 else idx = find(t >= t_target, 1, 'first'); x_delayed(i) = x(idx); end end % 计算延迟输入的输出 [y_delayed, ~] = lsim(sys_c, x_delayed, t); % 计算原始输出的延迟版本(插值对齐) y_shifted = zeros(size(t)); for i = 1:length(t) t_shift = t(i) - t0; if t_shift < t(1) || t_shift > t(end) y_shifted(i) = 0; else % 线性插值获取 y(t_shift) idx_low = find(t <= t_shift, 1, 'last'); idx_high = idx_low + 1; if idx_high <= length(t) w = (t_shift - t(idx_low)) / (t(idx_high) - t(idx_low)); y_shifted(i) = (1-w)*y_lsim(idx_low) + w*y_lsim(idx_high); else y_shifted(i) = y_lsim(end); end end end % 计算对齐误差 error_ti = norm(y_delayed - y_shifted, 'inf'); fprintf('时不变性验证:最大对齐误差 = %.2e\n', error_ti);4.3 因果性验证:h(t) = 0 for t < 0的数值判据
因果系统要求冲激响应在t<0时为零。由于t从0开始,需检查h的首个非零点是否在t=0:
% 查找h中第一个显著非零值的位置(避免浮点误差) threshold = 1e-10; first_nonzero = find(abs(h) > threshold, 1, 'first'); if isempty(first_nonzero) || t(first_nonzero) > 0 fprintf('因果性验证失败:h(t)在t=0前有非零值\n'); else fprintf('因果性验证通过:h(t)在t=0处起始\n'); end提示:
impulse(sys_c,t)返回的h在t=0处可能为有限值(如一阶系统h(0⁺)=1),但不会出现t<0的点。若sys_c含右半平面极点,h会指数增长,但仍满足t<0时为0——这是因果性的定义核心。
5. 提升报告专业度的三个硬核技巧:符号计算验证、误差热力图与 LaTeX 公式嵌入
5.1 用 Symbolic Math Toolbox 解析求解h(t)并与数值结果比对
避免仅依赖数值结果,用符号计算获得解析解,增强报告理论深度:
syms s t H_s = (s + 1) / (s^2 + 3*s + 2); % 手动输入传递函数 h_sym = ilaplace(H_s, s, t); % 解析反拉氏变换 h_sym = simplify(h_sym); % 化简表达式 % 生成解析解数值(在t点上求值) h_analytic = double(subs(h_sym, t, t)); % t是数值向量 % 与数值impulse结果对比 error_analytic = norm(h - h_analytic, 'inf'); fprintf('解析解 vs 数值解最大误差:%.2e\n', error_analytic); % 输出应 < 1e-13,证明数值算法可靠5.1.1 解析解的价值
华工报告评分细则中,“理论推导完整性”占30%。ilaplace得到h(t) = exp(-t) - exp(-2*t),不仅验证impulse结果,更可直接用于后续卷积积分的手动计算(如y(t) = ∫₀ᵗ h(τ)x(t−τ)dτ),体现对卷积物理意义的理解。
5.2 绘制卷积误差热力图:直观定位数值失真区域
单纯看max_error不够,需定位误差集中时段:
% 计算每个时间点的绝对误差 err_pointwise = abs(y_lsim - y_conv_trim); % 绘制热力图(横轴:时间t,纵轴:无,用颜色深浅表示误差) figure; plot(t, err_pointwise, 'LineWidth', 1.5); xlabel('t (秒)'); ylabel('绝对误差 |y_{lsim}(t) - y_{conv}(t)|'); title('卷积数值近似误差随时间分布'); grid on; % 添加阈值线(如1e-3) yline(1e-3, '--r', '误差阈值 10^{-3}'); legend('逐点误差','Location','northwest');技巧:若热力图显示误差在
t≈0附近突增,说明初始条件处理不当;若在t≈2(输入跳变处)峰值明显,反映卷积边界效应——此时应建议改用c2d+filter方案。
5.3 在 MATLAB Figure 中嵌入 LaTeX 公式提升学术感
避免截图插入公式,用text函数动态渲染:
% 在图形中添加卷积公式 ax = gca; text(0.05, 0.95, '$y(t) = \int_{0}^{t} h(\tau) x(t-\tau)\,d\tau$', ... 'Units', 'normalized', 'FontSize', 12, 'Interpreter', 'latex', ... 'Parent', ax, 'HorizontalAlignment', 'left');5.3.1 必须设置的关键参数
'Interpreter', 'latex':启用 LaTeX 渲染;'Units', 'normalized':坐标归一化,使公式位置不随数据范围变化;'FontSize', 12:匹配期刊图表标准字号;'$...$':行内公式,'$$...$$'为独立公式(居中显示)。
最终交付的.fig文件可直接导出为 PDF/EPS,无缝嵌入 LaTeX 报告,规避 Word 公式编辑器兼容性问题——这是华工研究生助教评审时明确加分项。
本文还有配套的精品资源,点击获取