news 2026/10/15 20:57:44

连续时间LTI系统综合实验:时域卷积、频域滤波与Matlab实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
连续时间LTI系统综合实验:时域卷积、频域滤波与Matlab实现

简介:这份资源是面向通信工程、电子信息工程等专业本科生与研究生的信号与系统综合实验报告,围绕连续时间LTI系统展开时域与频域特性分析及滤波器设计。内容涵盖稳定系统的零极点设计、直接/级联/并联三种实现结构的信号流图与仿真对比、参数微扰对零极点分布与稳定性的敏感性分析、周期信号频谱特性、LTI滤波器设计与音频信号频谱分析等核心环节,并配有Matlab代码实现与结果讨论。资源包共1个docx文件,约2.62MB,内含完整实验目的、原理推导、步骤说明与结果分析,结构清晰,可直接用于课堂教学或自主学习。目前已有1303人学习下载。读者可借此掌握系统函数零极点与频率特性、稳定性之间的关系,理解不同实现结构对参数变化的敏感度差异,并积累Matlab仿真与音频信号处理的实操经验。

1. 连续时间 LTI 系统综合实验:从时域卷积到频域滤波的一条完整链路

很多同学做连续时间 LTI 系统实验时,习惯把时域分析和频域分析拆成两个互不相干的脚本:一个画冲激响应,一个画幅频特性,交完报告就完事。真正到了滤波器设计环节,却发现前面算出来的东西根本接不上——截止频率对不上、卷积结果和理论值差一个尺度、仿真出来的波形怎么看都不像低通。问题不在 Matlab 用得熟不熟,而在于没有把「时域卷积—频域相乘—滤波器实现」当成一条链路来跑。

这个综合实验要解决的就是这件事:用一套可复现的 Matlab 流程,把连续时间 LTI 系统的冲激响应、卷积、频率响应、滤波特性串起来,最后落到一个能实际跑出结果的滤波器设计上。适合正在做信号与系统课程实验的本科生,也适合想快速把理论公式变成可运行代码的工程师。下面按「先立住理论、再动手复现、最后避坑」的顺序展开。

2. 时域特性分析:冲激响应与卷积积分的 Matlab 落地

2.1 为什么先做时域:LTI 系统的「身份证」是冲激响应

连续时间 LTI 系统的核心结论只有一条:系统对任意输入的响应,等于输入与冲激响应的卷积。也就是说,只要拿到 h(t),这个系统就被完全确定了。时域分析的价值在于,它不依赖变换域的任何假设,直接给出物理上可解释的结果——输入信号经过系统后,每个时刻的输出是过去所有输入的加权叠加。

在 Matlab 里做时域分析,绕不开两个问题:一是连续信号怎么离散化,二是卷积积分怎么用数值方法近似。常见做法是用足够小的采样间隔 dt 把连续信号采样成序列,然后用数值积分或离散卷积近似。这里的关键参数是 dt 和观测时间窗口 T,它们直接决定结果的精度和计算量。

我一般会先确定信号的有效带宽或变化最快的时间尺度,然后取 dt 小于该尺度的十分之一。比如信号最高频率分量约 10 Hz,那 dt 取 0.001 s 就比较稳妥。观测窗口 T 要覆盖冲激响应衰减到可忽略的时间,否则卷积结果尾部会被截断。

2.2 用数值积分实现卷积:代码与参数说明

下面这段代码实现了一个通用的一阶系统冲激响应和卷积计算。系统用微分方程描述,先求冲激响应,再对给定输入做卷积。

% 连续时间LTI系统时域分析:冲激响应与卷积 clear; clc; close all; % 参数设置 dt = 0.001; % 采样间隔,决定数值精度 T = 5; % 总观测时间 t = 0:dt:T; % 时间向量 % 定义系统:一阶系统 tau*dy/dt + y = x tau = 0.5; % 时间常数 h = (1/tau) * exp(-t/tau); % 冲激响应 h(t) % 定义输入信号:矩形脉冲 x = double(t >= 1 & t <= 2); % 数值卷积近似连续卷积 y = dt * conv(x, h); % 乘以dt是连续卷积的数值近似 y = y(1:length(t)); % 截取与t等长的部分 % 绘图 figure; subplot(3,1,1); plot(t, x); title('输入信号 x(t)'); xlabel('t/s'); subplot(3,1,2); plot(t, h); title('冲激响应 h(t)'); xlabel('t/s'); subplot(3,1,3); plot(t, y); title('输出 y(t)=x(t)*h(t)'); xlabel('t/s');

这段代码的逻辑是:先构造时间向量和冲激响应,再构造输入,最后用conv做离散卷积并乘以 dt 来近似连续卷积积分。dt越小,近似越准,但计算量越大;T要足够长,让 h(t) 衰减到接近零,否则卷积尾部会失真。tau是系统时间常数,它决定了冲激响应的衰减速度,也决定了系统带宽——tau 越小,系统响应越快,带宽越宽。

运行后你会看到输出 y(t) 是一个被一阶系统「平滑」过的矩形脉冲,上升沿和下降沿都变成了指数形状。这就是时域分析最直观的价值:你能直接看到系统对输入做了什么。

2.3 时域分析里最容易翻车的三个参数

第一个是 dt。很多人直接取 0.01 甚至 0.1,结果高频成分被严重混叠,卷积出来的波形和理论值差很远。判断方法很简单:把 dt 减半再跑一次,如果结果明显变化,说明 dt 还不够小。

第二个是卷积后的截取位置。conv输出的长度是length(x)+length(h)-1,直接取前length(t)个点相当于只保留了卷积结果的前半段。正确做法是取中心附近与 t 对应的部分,或者把时间轴对齐后截取。上面代码里用y(1:length(t))是一种简化处理,实际做的时候要检查卷积结果的峰值位置是否合理。

第三个是冲激响应的幅度尺度。连续系统的冲激响应和离散序列之间差一个 dt 因子,如果忘了乘 dt,输出幅度会差几个数量级。这个坑几乎每个人都踩过,血泪经验就是:先用手算的简单例子验证幅度,再跑复杂信号。

3. 频域特性分析:频率响应、Bode 图与频谱的对应关系

3.1 从时域到频域:频率响应到底在描述什么

频率响应 H(jω) 是冲激响应 h(t) 的傅里叶变换,它描述的是系统对不同频率正弦输入的幅度缩放和相位偏移。换句话说,如果你给系统输入一个频率为 ω 的正弦波,输出还是同频率的正弦波,只是幅度乘以 |H(jω)|,相位加上 ∠H(jω)。这就是 LTI 系统在频域最本质的性质。

在 Matlab 里,频率响应可以用解析法求,也可以用数值法求。解析法适合简单系统,比如一阶系统 H(jω)=1/(1+jωτ);数值法适合复杂系统或实验数据。常见做法是用freqs函数直接求模拟滤波器的频率响应,或者用 FFT 对冲激响应做数值变换。

我一般会先用解析法画出理论曲线,再用数值法验证,两者对上之后再往下做滤波器设计。这样做的原因是:滤波器设计阶段会大量依赖频率响应的形状,如果频域分析本身不可靠,后面全是空中楼阁。

3.2 用 freqs 和 FFT 交叉验证频率响应

下面代码同时用解析法和数值法计算一阶系统的频率响应,并画在一起对比。

% 频域分析:解析法 vs 数值法 clear; clc; close all; tau = 0.5; w = logspace(-1, 2, 500); % 频率范围:0.1到100 rad/s % 方法一:解析法 H_analytic = 1 ./ (1 + 1j*w*tau); % 方法二:数值法(对冲激响应做FFT) dt = 0.001; t = 0:dt:10; h = (1/tau) * exp(-t/tau); N = 2^nextpow2(length(h)); H_fft = fft(h, N) * dt; % 乘以dt近似连续傅里叶变换 w_fft = (0:N-1) * (2*pi/(N*dt)); % 只取正频率部分对比 w_fft_pos = w_fft(1:N/2); H_fft_pos = H_fft(1:N/2); % 绘图对比 figure; subplot(2,1,1); semilogx(w, 20*log10(abs(H_analytic)), 'b', 'LineWidth', 1.5); hold on; semilogx(w_fft_pos, 20*log10(abs(H_fft_pos)), 'r--', 'LineWidth', 1.5); legend('解析法', 'FFT数值法'); title('幅频特性'); ylabel('幅度/dB'); grid on; subplot(2,1,2); semilogx(w, angle(H_analytic)*180/pi, 'b', 'LineWidth', 1.5); hold on; semilogx(w_fft_pos, angle(H_fft_pos)*180/pi, 'r--', 'LineWidth', 1.5); legend('解析法', 'FFT数值法'); title('相频特性'); ylabel('相位/度'); xlabel('频率/(rad/s)'); grid on;

这段代码的关键在于H_fft = fft(h, N) * dt这一步。FFT 默认是对离散序列做变换,要近似连续傅里叶变换必须乘以 dt。另外N取 2 的幂次是为了 FFT 计算效率,nextpow2自动找到不小于序列长度的最小 2 的幂。频率轴w_fft的构造要注意:2*pi/(N*dt)是频率分辨率,乘以索引得到实际频率。

运行后你会看到两条曲线在低频段几乎重合,高频段 FFT 结果会有轻微偏差,这是数值截断和混叠造成的。如果偏差很大,优先检查 dt 是否足够小、观测时间是否足够长。

3.3 频域分析中三个容易忽略的细节

第一个是频率轴的单位。freqs用的是 rad/s,而很多实验报告要求 Hz,换算关系是 ω=2πf。如果画图时忘了换算,截止频率会差 6.28 倍,滤波器设计直接跑偏。

第二个是 FFT 的对称性。实信号的频谱是共轭对称的,正频率和负频率幅度相同、相位相反。画图时只取正频率部分是对的,但要注意索引范围是1:N/2还是1:N/2+1,差一个点在某些频率上会造成明显误差。

第三个是数值傅里叶变换的截断效应。如果 h(t) 在观测窗口结束时还没衰减到零,相当于给信号加了一个矩形窗,频谱会出现波纹。解决办法是增大 T,或者给 h(t) 加一个平滑窗函数。我一般会先画 h(t) 的尾部,确认它已经接近零再往下做。

4. 滤波器设计:从频率响应指标到可实现的传递函数

4.1 滤波器设计的本质:用有理函数逼近理想频率响应

理想低通滤波器在截止频率处是垂直下降的,但这样的频率响应对应的冲激响应是 sinc 函数,非因果且无限长,物理上不可实现。所以实际滤波器设计都是在做一件事:用一个可实现的有理传递函数 H(s) 去逼近理想特性,同时满足通带波纹、阻带衰减、过渡带宽度等指标。

常见的逼近方法有 Butterworth、Chebyshev、Elliptic 等。Butterworth 通带最平坦但过渡带最宽;Chebyshev 过渡带更窄但有通带波纹;Elliptic 过渡带最窄但通带和阻带都有波纹。选哪种取决于你的指标要求:如果对通带平坦度要求高,选 Butterworth;如果要求过渡带尽量窄,选 Elliptic。

在 Matlab 里,模拟滤波器设计主要用butter、cheby1、cheby2、ellip这几个函数,它们返回分子分母系数,再用freqs验证频率响应。

4.2 用 butter 设计低通滤波器并验证指标

下面代码设计一个截止频率 100 Hz、阶数可调的低通滤波器,并验证其幅频特性是否满足要求。

% 模拟低通滤波器设计:Butterworth clear; clc; close all; fc = 100; % 截止频率,单位Hz wc = 2*pi*fc; % 转换为rad/s order = 4; % 滤波器阶数 % 设计模拟低通滤波器 [b, a] = butter(order, wc, 's'); % 's'表示模拟滤波器 % 计算频率响应 f = logspace(0, 3, 1000); % 1Hz到1000Hz w = 2*pi*f; H = freqs(b, a, w); % 绘图验证 figure; subplot(2,1,1); semilogx(f, 20*log10(abs(H)), 'LineWidth', 1.5); hold on; yline(-3, 'r--', 'LineWidth', 1); % -3dB参考线 xline(fc, 'g--', 'LineWidth', 1); % 截止频率参考线 title('低通滤波器幅频特性'); ylabel('幅度/dB'); grid on; subplot(2,1,2); semilogx(f, angle(H)*180/pi, 'LineWidth', 1.5); title('相频特性'); ylabel('相位/度'); xlabel('频率/Hz'); grid on; % 验证-3dB点 [H_fc, ~] = freqs(b, a, wc); fprintf('截止频率处幅度:%.4f dB\n', 20*log10(abs(H_fc)));

这段代码的核心是butter(order, wc, 's'),其中order是滤波器阶数,wc是截止角频率,'s'表示设计模拟滤波器而不是数字滤波器。阶数越高,过渡带越窄,但相位非线性也越严重,实际实现时对元件精度要求也越高。

运行后你会看到幅频曲线在 100 Hz 处正好下降 3 dB,这就是 Butterworth 滤波器的定义。如果 -3dB 点不在 100 Hz,检查wc是否用了 rad/s 而不是 Hz。这个单位坑几乎每届学生都会踩一次。

4.3 阶数选择与过渡带指标的权衡

滤波器阶数不是越高越好。阶数每增加 1,过渡带衰减斜率大约增加 6 dB/倍频程,但同时也带来两个问题:一是相位非线性加剧,群延迟在截止频率附近变化剧烈;二是对元件容差更敏感,实际电路实现时更容易振荡。

我一般会先根据过渡带指标估算所需阶数。比如要求 100 Hz 截止、200 Hz 处衰减至少 40 dB,Butterworth 的衰减公式是 20n·log10(f/fc) dB,代入得 20n·log10(2)≈6n dB,要 40 dB 就需要 n≈7。然后取 n=7 或 8 跑一下,看实际曲线是否满足,再决定是否换 Chebyshev 来降低阶数。

如果对相位线性度有要求,比如要传输脉冲信号,那就要考虑 Bessel 滤波器,它的通带群延迟最平坦,但过渡带最宽。选型没有绝对优劣,只有是否匹配你的指标。

5. 避坑与排查:连续时间 LTI 系统实验里最常见的五个翻车点

5.1 卷积结果幅度不对:先查 dt 有没有乘

现象:时域卷积出来的输出幅度比理论值大几百倍或小几百倍。原因:连续卷积的数值近似是y = dt * conv(x, h),很多人直接写conv(x, h)忘了乘 dt。解决:先用手算的简单例子验证幅度,比如 x 和 h 都是矩形时,卷积结果是三角形,峰值等于重叠面积,用这个来校准。

5.2 频率响应曲线在高频段翘起来:混叠或截断

现象:FFT 算出来的幅频特性在高频段不降反升。原因:要么 dt 太大导致高频混叠,要么 h(t) 截断太早导致频谱泄漏。解决:把 dt 减半再跑一次,如果曲线改善说明是混叠;把 T 加倍再跑一次,如果改善说明是截断。两个都试,直到曲线稳定。

5.3 滤波器截止频率对不上:Hz 和 rad/s 混用

现象:设计 100 Hz 低通,结果 -3dB 点在 628 Hz。原因:butter的截止频率参数默认是 rad/s,直接填了 100 而不是 2π×100。解决:统一在 rad/s 下计算,画图时再换算成 Hz。养成习惯:所有频率变量加后缀_hz或_w,避免混用。

5.4 阶数太高导致数值不稳定:检查极点位置

现象:高阶滤波器(比如 10 阶以上)的频率响应出现异常尖峰或凹陷。原因:高阶传递函数的极点可能非常靠近虚轴,数值计算时精度不够。解决:用二阶节级联(SOS)形式代替直接形式,Matlab 里用zp2sos转换。或者降低阶数,换用 Chebyshev 或 Elliptic 逼近。

5.5 时域和频域结果对不上:检查变换对是否一致

现象:时域卷积得到的输出,做 FFT 后和「输入频谱×频率响应」对不上。原因:时域和频域用了不同的 dt 或不同的观测窗口。解决:时域和频域分析必须用同一套时间参数,先确定 dt 和 T,再分别做时域和频域计算,最后交叉验证。如果对不上,优先检查两边的 dt 是否一致。

6. 进阶技巧:用零极点分布快速判断系统特性

6.1 零极点图:比频率响应更直观的系统「指纹」

频率响应画出来是一条曲线,但零极点图是几个点。别小看这几个点,它们决定了系统的一切:极点位置决定稳定性,零点位置决定阻带特性,零极点之间的距离决定频率响应的形状。对于连续时间 LTI 系统,极点必须在左半平面系统才稳定;极点越靠近虚轴,对应频率处的增益越高;零点越靠近虚轴,对应频率处的增益越低。

我一般会在设计滤波器之前先画零极点图,确认极点都在左半平面,再往下做。如果发现极点在右半平面,不用往下跑了,系统本身就不稳定。

6.2 用 zplane 和 pzmap 快速检查稳定性

下面代码设计一个滤波器并画出零极点图,同时判断稳定性。

% 零极点分析:稳定性快速判断 clear; clc; close all; fc = 100; wc = 2*pi*fc; order = 4; [b, a] = butter(order, wc, 's'); % 求零极点 [z, p, k] = tf2zp(b, a); % 画零极点图 figure; zplane(z, p); title('零极点分布'); % 判断稳定性 if all(real(p) < 0) fprintf('系统稳定:所有极点都在左半平面\n'); else fprintf('系统不稳定:存在右半平面极点\n'); end % 打印极点位置 fprintf('极点位置:\n'); disp(p);

这段代码用tf2zp从传递函数系数求零极点,zplane画图,然后检查所有极点的实部是否小于零。Butterworth 滤波器的极点均匀分布在左半平面的半圆上,阶数越高,极点越靠近虚轴,这也是高阶滤波器数值敏感的原因。

6.3 从零极点图反推频率响应的三个经验规则

第一个规则:极点离虚轴越近,该频率处增益越高。如果极点正好在虚轴上,该频率处增益无穷大,这就是振荡器。

第二个规则:零点离虚轴越近,该频率处增益越低。如果零点在虚轴上,该频率处增益为零,这就是陷波器。

第三个规则:零极点成对出现时,如果零点在极点左侧,高频段衰减更快;如果零点在极点右侧,高频段可能出现增益回升。

这三个规则不用算频率响应就能快速判断系统的大致形状。我一般在设计滤波器时先用零极点图确认大致形状,再用freqs精确验证。这样比直接调参数快得多,也不容易陷入「改一个参数跑一次仿真」的循环。

最后说一个我自己的习惯:每次做完滤波器设计,都会把零极点图、幅频特性、相频特性、冲激响应四张图放在一起看。如果四张图讲的故事一致,这个设计基本就靠谱了;如果哪张图看起来不对劲,优先查那张图对应的参数。这个习惯帮我省了很多后悔药。希望帮到你。

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

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

科研全流程效率实测:把Codex auth.json改到TaoToken的6个月数据复盘

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

作者头像 李华
网站建设 2026/10/15 20:53:53

具身智能中的协同机理研究(104):多模态融合提升感知精度的策略与流程

前沿技术探索:TVA智能体(简称TVA) TVA智能体(亦称“AI智能体视觉”)是依托Transformer架构与“因式智能体”理论构建的新型工业视觉系统,也是当前最具代表性的具身视觉技术之一。它有机融合深度强化学习(DRL)、卷积神经网络(CNN)与因式分解算法(FRA),构成了具身智…

作者头像 李华
网站建设 2026/10/15 20:52:30

Kubernetes Pod 完全指南:从容器到调度单元的生命周期与排查实战

很多刚接触 Kubernetes 的朋友都有同一个困惑&#xff1a;容器已经能跑应用了&#xff0c;为什么还要在外面套一层 Pod&#xff1f;我当时带着这个疑问被派去维护一个模拟项目&#xff0c;直接在裸容器上跑服务&#xff0c;把整个环境折腾得乱七八糟&#xff0c;才开始真正理解…

作者头像 李华
网站建设 2026/10/15 20:49:05

基于D3D的YV12视频渲染实战:从原理到避坑

简介&#xff1a;基于D3D的YUV视频渲染源码&#xff0c;面向需要在Windows平台实现GPU加速视频显示的开发者和图形学爱好者。工程完整支持YV12、I420、NV12、YUY2、UYVY、RGB24、RGB32、RGB555、RGB565等多种输入&#xff0c;借助Shader完成YUV到RGB的GPU转换&#xff0c;并提供…

作者头像 李华
网站建设 2026/10/15 20:47:52

2000-2024年 31省工业增加值及其占GDP的比重数据 xlsx

01、数据概述‌ 工业增加值作为评估工业领域经济贡献的关键指标&#xff0c;体现了工业企业在特定时期内通过生产活动所创造的最终价值&#xff0c;以货币形式计量。这一数值不仅反映了工业生产的规模与效率&#xff0c;也是衡量工业对整体经济增长拉动作用的重要依据。同时&a…

作者头像 李华