理论实验目的
在本实验中,我们将使用 MATLAB 分析 LTI(线性时不变)系统。本实验的主要目的是:
- 学习如何用差分方程描述一个离散时间系统
- 掌握通过MATLAB画出系统函数对应的零极点图
- 通过零极点分布分析系统的稳定性
- 了解差分方程系数与 MATLAB 中
filter函数参数的对应关系
系统的零极点分布直接决定了系统的时域特性(如稳定性、因果性)和频域特性(如频率响应)。掌握这一点对于滤波器设计至关重要。
理论理论基础
1. 差分方程 (Difference Equation)
LTI 系统可以用差分方程表示,如下所示:
$$\sum_{k=0}^{K} a_k y[n-k] = \sum_{m=0}^{M} b_m x[n-m]$$
其中 $x[n]$ 是系统输入,$y[n]$ 是系统输出。
MATLAB 实现 (filter 函数):
在 MATLAB 中,如果 x 是输入向量,filter(b, a, x) 指令返回满足以下差分方程的结果:
$$\sum_{k=0}^{K} a[k+1]y[n-k] = \sum_{m=0}^{M} b[m+1]x[n-m]$$
MATLAB 数组索引从 1 开始,而差分方程通常从 0 开始。因此:
a[1]对应 $a_0$(通常为 $y[n]$ 的系数,常归一化为 1)a[2]对应 $a_1$($y[n-1]$ 的系数)- 例如方程 $y[n] + 2y[n-1] = x[n]$,则
a = [1, 2]
2. 双边 Z 变换与系统函数
离散时间信号 $x[n]$ 的双边 Z 变换定义为:
$$X(z) = \sum_{n=-\infty}^{\infty} x[n]z^{-n}$$
对于满足线性常系数差分方程的 LTI 系统,其系统函数 $H(z)$ 为有理函数:
$$H(z) = \frac{Y(z)}{X(z)} = \frac{N(z)}{D(z)}$$
$N(z)$ 的根称为零点 (Zeros),$D(z)$ 的根称为极点 (Poles)。
3. 零极点画图工具 (dpzplot)
通常系统函数写成 $z^{-1}$ 的多项式形式。如果分子分母阶次不同,MATLAB roots 函数可能会忽略 $z=0$ 处的根。为了正确画出零极点图,我们需要处理系数向量长度。以下是一个自定义函数 dpzplot:
function dpzplot(b,a)
% dpzplot(b,a) 绘制离散时间系统函数的零极点图
la = length(a);
lb = length(b);
if (la > lb)
b = [b zeros(1, la-lb)]; % 补零以对齐长度
elseif (lb > la)
a = [a zeros(1, lb-la)];
end
ps = roots(a); % 极点
zs = roots(b); % 零点
mx = max(abs([ps' zs' 0.95])) + 0.5;
clf;
axis([-mx mx -mx mx]); axis('equal'); hold on;
w = [0 : 0.01 : 2*pi];
plot(cos(w), sin(w), '.'); % 画单位圆
plot([-mx mx], [0 0]); plot([0 0], [-mx mx]);
plot(real(ps), imag(ps), 'rx', 'markersize', 10); % 极点用叉号
plot(real(zs), imag(zs), 'ko', 'markersize', 10); % 零点用圆圈
hold off;
4. 因果稳定性 (Causality & Stability)
- 因果性:如果系统的单位脉冲响应满足 $h[n]=0, n<0$,则系统是因果的。对于因果系统,ROC(收敛域)在某个圆的外部。
- 稳定性:如果系统单位脉冲响应绝对可和 $\sum |h[n]| < \infty$,则系统是稳定的。这意味着 ROC 必须包含单位圆。
- 结论:一个因果稳定的 LTI 系统,其所有极点必须位于单位圆内($|p_k| < 1$)。
实践交互演示:极点位置与系统稳定性
移动极点观察冲激响应
调节极点的模值(半径r)和角度(theta),观察单位圆内的极点位置以及对应的时域冲激响应 $h[n]$。
假设单极点系统: $H(z) = \frac{1}{1 - p z^{-1}}$,则 $h[n] = p^n u[n]$
Z平面 (零极点图)
时域冲激响应 h[n]
- 当 $r < 1$ (极点在圆内):$h[n]$ 衰减趋于0,系统稳定。
- 当 $r = 1$ (极点在圆上):$h[n]$ 等幅振荡或恒定,系统临界稳定。
- 当 $r > 1$ (极点在圆外):$h[n]$ 发散趋于无穷,系统不稳定。
- 角度 $\theta$ 决定了震荡的频率。
实践示例讲解
例题 1:FIR 系统的响应
题目:描述因果 LTI 系统 $y[n] = 0.5x[n] + x[n-1] + 2x[n-2]$。如果输入信号为 $x=[1, 2, 3, 4, 0, 0, ...]$,求系统响应。
a = [1]; b = [0.5, 1, 2];
x = [1, 2, 3, 4, zeros(1,10)]; % 扩展输入以便观察
y = filter(b, a, x);
图示:例题1系统响应 y[n] (有限长,前后各补2个0)
例题 2:IIR 系统的响应
题目:描述系统 $y[n] - 0.8y[n-1] = 2x[n]$。输入信号同上,求系统响应。
a = [1, -0.8]; b = [2];
x = [1, 2, 3, 4, zeros(1,20)];
y = filter(b, a, x);
图示:例题2系统响应 y[n] (无限长,画24个点)
实践练习一:差分方程与响应
任务
对于以下三个差分方程,请在 MATLAB 中分别写出其系数向量 a 和 b,并使用 filter 函数求出当输入为单位阶跃信号 $x[n]=u[n]$(取前10个点)时系统的响应 $y[n]$,最后用 stem 画出响应图。
- $y[n] = 0.5x[n] + x[n-1] + 2x[n-2]$
- $y[n] = 0.8y[n-1] + 2x[n]$
- $y[n] - 0.8y[n-1] = 2x[n-1]$
结果解读
将你生成的三个图像与下方给出的预期图像进行对比,它们是否一致?请思考并回答:
- 为什么第一个系统的响应在 $n=2$ 之后就稳定在一个常数?(提示:思考输入 $u[n]$ 的特点和FIR滤波器的"记忆"长度)
- 为什么第二个系统的响应会持续增长,并逐渐趋近于一个稳定值?这个稳定值大约是多少?
预期图像
1) 响应图(FIR,20个点)
2) 响应图(IIR,25个点)
3) 响应图(IIR,25个点)
实践练习二:零极点图绘制与分析
任务
对于以下三个系统,请在 MATLAB 中确定其系统函数 $H(z)$ 的分子分母系数 b 和 a,并使用提供的 dpzplot 函数绘制它们的零极点图。
- $H(z) = \frac{z^3 - z}{z^3 + 3z + 2}$
- $y[n] + y[n-1] + 0.5y[n-2] = x[n]$
- $y[n] - 1.25y[n-1] + 0.75y[n-2] - 0.125y[n-3] = x[n] + 0.5x[n-1]$
结果解读
对比你绘制的零极点图与下方的预期图,它们是否一致?根据你绘制的图,逐一判断每个系统的稳定性(稳定、临界稳定、或不稳定),并解释你的判断依据(即**极点**与**单位圆**的位置关系)。
预期图像
1) 零极点图
2) 零极点图
3) 零极点图
实践练习三:系统分析与逆向设计
背景
本题旨在检验你对零极点、系统稳定性以及差分方程之间关系的深刻理解。我们将从一个理想的系统特性出发,反向构建并分析它。
任务一:理想谐振器设计与验证
假设我们想设计一个数字谐振器,其谐振角频率为 $\omega_0 = \pi/4$。为了实现无衰减的持续振荡,我们将一对极点精确地放置在单位圆上,即 $p_{1,2} = e^{\pm j\pi/4}$。假设系统没有有限零点(分子为1)。
- 推导:请推导出该系统的差分方程。(提示:系统函数分母 $D(z) = (1 - p_1 z^{-1})(1 - p_2 z^{-1})$。利用欧拉公式 $e^{j\theta} + e^{-j\theta} = 2\cos(\theta)$ 来简化系数。)
- 仿真:使用
dpzplot绘制其零极点图,并计算和绘制该系统前50个点的单位冲激响应 $h[n]$。
任务二:参数化分析与稳定性
实际应用中,临界稳定系统很危险。因此,我们通常会引入一个衰减因子 $r$($0 < r < 1$),将极点变为 $p_{1,2} = r \cdot e^{\pm j\pi/4}$。现在,我们将任务一的差分方程参数化为:
$y[n] - \sqrt{2} \cdot r \cdot y[n-1] + r^2 \cdot y[n-2] = x[n]$
- 分析:请问参数
K的取值范围是什么时,这个系统是因果稳定的? - 关联:
K的值与极点模长r之间有什么数学关系? - 仿真:设定
K=0.9,画出新系统的零极点图和单位冲激响应。
结果解读
你的仿真结果是否与下方的预期图像一致?请思考并回答:
- 为什么任务一的冲激响应是等幅振荡,而任务二(当`K=0.9`时)的响应是衰减振荡?
- 这个从"等幅"到"衰减"的变化,在Z平面的零极点图上是如何体现的?
预期图像
理想谐振器响应 (K=1)
阻尼振荡器响应 (K=0.9)
实践练习四:自定义函数与系统特性
背景
本题要求你手动实现一个简单的递归方程求解器,并通过它来深入理解初始条件、线性度以及稳定性的概念。考虑差分方程:$y[n] = ay[n-1] + x[n]$
任务一:函数实现
编写一个自定义MATLAB函数 y = diffeqn(a, x, yn1) 来计算上述因果系统。其中 a 是系数,$x$ 是输入序列,$yn1$ 是初始状态 $y[-1]$ 的值。
任务二:零状态响应分析 (a=1)
设定 $a=1, y[-1]=0$。使用你的函数分别计算当输入为 $x_{1n}=\delta[n]$ 和 $x_{2n}=u[n]$ 时的响应($0 \le n \le 30$),并画出它们的 stem 图。
任务三:非零状态与线性度检验 (a=1)
设定 $a=1, y[-1]=-1$。计算当输入为 $x_{1n}=u[n]$ 和 $x_{2n}=2u[n]$ 时的响应 $y_1[n]$ 和 $y_2[n]$。然后,计算并画出 $(2y_1[n] - y_2[n])$ 的图像。
任务四:稳定性与初始条件 (a=0.5)
设定 $a=0.5, x=u[n]$。分别计算在 $y[-1]=0$ 和 $y[-1]=0.5$ 两种初始条件下系统的响应,并画图对比。
结果解读
将你生成的图像与下方的预期图像对比,它们是否一致?请重点回答:
- 为什么在任务三中,$2y_1[n] - y_2[n]$ 的结果不是恒等于0?这是否违背了线性系统的定义?
- 在任务四中,初始条件的不同对最终的系统稳态输出有影响吗?为什么?这说明了稳定系统的什么重要特性?