实验二 - LTI 系统的系统函数和频率响应

数字信号处理 | 差分方程与Z变换实验
南京工业大学浦江学院 | 计算机与通信工程学院 | 通信工程专业 | DSP课程实验

理论实验目的

在本实验中,我们将使用 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)

例题1系统响应 n y[n] -2 -1 0 1 2 3 4 5 6 7 0 10 20

例题 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个点)

例题2系统响应 n y[n] 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 10 20

实践练习一:差分方程与响应

任务

对于以下三个差分方程,请在 MATLAB 中分别写出其系数向量 ab,并使用 filter 函数求出当输入为单位阶跃信号 $x[n]=u[n]$(取前10个点)时系统的响应 $y[n]$,最后用 stem 画出响应图。

  1. $y[n] = 0.5x[n] + x[n-1] + 2x[n-2]$
  2. $y[n] = 0.8y[n-1] + 2x[n]$
  3. $y[n] - 0.8y[n-1] = 2x[n-1]$

结果解读

将你生成的三个图像与下方给出的预期图像进行对比,它们是否一致?请思考并回答:

  • 为什么第一个系统的响应在 $n=2$ 之后就稳定在一个常数?(提示:思考输入 $u[n]$ 的特点和FIR滤波器的"记忆"长度)
  • 为什么第二个系统的响应会持续增长,并逐渐趋近于一个稳定值?这个稳定值大约是多少?

预期图像

1) 响应图(FIR,20个点)

n 0 2 10 19 3.5

2) 响应图(IIR,25个点)

n 0 5 10 15 20 10

3) 响应图(IIR,25个点)

n 0 5 10 15 20 10

实践练习二:零极点图绘制与分析

任务

对于以下三个系统,请在 MATLAB 中确定其系统函数 $H(z)$ 的分子分母系数 ba,并使用提供的 dpzplot 函数绘制它们的零极点图。

  1. $H(z) = \frac{z^3 - z}{z^3 + 3z + 2}$
  2. $y[n] + y[n-1] + 0.5y[n-2] = x[n]$
  3. $y[n] - 1.25y[n-1] + 0.75y[n-2] - 0.125y[n-3] = x[n] + 0.5x[n-1]$

结果解读

对比你绘制的零极点图与下方的预期图,它们是否一致?根据你绘制的图,逐一判断每个系统的稳定性(稳定、临界稳定、或不稳定),并解释你的判断依据(即**极点**与**单位圆**的位置关系)。

预期图像

1) 零极点图

2) 零极点图

3) 零极点图

实践练习三:系统分析与逆向设计

背景

本题旨在检验你对零极点、系统稳定性以及差分方程之间关系的深刻理解。我们将从一个理想的系统特性出发,反向构建并分析它。

知识提示:在信号处理中,我们有时希望创建一个能够产生特定频率振荡的系统,这被称为"谐振器"。最纯粹的振荡对应于Z平面单位圆上的一对共轭复数极点。

任务一:理想谐振器设计与验证

假设我们想设计一个数字谐振器,其谐振角频率为 $\omega_0 = \pi/4$。为了实现无衰减的持续振荡,我们将一对极点精确地放置在单位圆上,即 $p_{1,2} = e^{\pm j\pi/4}$。假设系统没有有限零点(分子为1)。

  1. 推导:请推导出该系统的差分方程。(提示:系统函数分母 $D(z) = (1 - p_1 z^{-1})(1 - p_2 z^{-1})$。利用欧拉公式 $e^{j\theta} + e^{-j\theta} = 2\cos(\theta)$ 来简化系数。)
  2. 仿真:使用 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]$

  1. 分析:请问参数 K 的取值范围是什么时,这个系统是因果稳定的?
  2. 关联K 的值与极点模长 r 之间有什么数学关系?
  3. 仿真:设定 K=0.9,画出新系统的零极点图和单位冲激响应。

结果解读

你的仿真结果是否与下方的预期图像一致?请思考并回答:

  • 为什么任务一的冲激响应是等幅振荡,而任务二(当`K=0.9`时)的响应是衰减振荡?
  • 这个从"等幅"到"衰减"的变化,在Z平面的零极点图上是如何体现的?

预期图像

理想谐振器响应 (K=1)

理想谐振器响应n1.0

阻尼振荡器响应 (K=0.9)

阻尼振荡器响应n1.0

实践练习四:自定义函数与系统特性

背景

本题要求你手动实现一个简单的递归方程求解器,并通过它来深入理解初始条件、线性度以及稳定性的概念。考虑差分方程:$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?这是否违背了线性系统的定义?
  • 在任务四中,初始条件的不同对最终的系统稳态输出有影响吗?为什么?这说明了稳定系统的什么重要特性?

预期图像

任务二:阶跃响应 (a=1, 31个点完整画出)

阶跃响应 阶跃响应 (斜坡信号) n 0 10 20 30 30

任务三:线性检验结果(31个点)

线性检验 2*y1[n] - y2[n] = -1 (常数) n 0 10 20 30 -1

任务四:稳定性分析 (a=0.5)

稳定性分析不同初始条件下的响应n1.02.0