4、Z反变换:部分分式展开法、幂级数展开法(长除法)、留数法、初值与终值定理

各位同学,咱们今天聊Z反变换。

说白了,Z变换是把离散信号从时域搬到复频域,方便我们分析系统。但最终,我们得把结果变回时域序列,才能知道系统实际怎么动作。这个“变回去”的过程,就是Z反变换。

我个人习惯把Z反变换比作“解方程”。你从时域出发,经过Z变换得到代数方程,一顿操作解出X(z),最后再用反变换找回x(n)。今天咱们就讲四种最常用的“解法”。

核心思路:Z反变换就是把有理分式形式的X(z)还原成时域序列x(n)。四种方法各有适用场景,没有万能药。

4.1 部分分式展开法

这是我最常用的方法,没有之一。为什么?因为它跟拉普拉斯反变换的套路一模一样,你只要会查表就行。

基本步骤很简单:

  1. 把X(z)写成真分式形式(分子次数低于分母)
  2. 因式分解分母
  3. 展开成部分分式之和
  4. 查Z变换表,逐项反变换

举个例子:

已知 X(z) = z / (z² - 3z + 2),求 x(n)

解:
1. 分母因式分解:z² - 3z + 2 = (z-1)(z-2)
2. 展开:X(z)/z = 1/[(z-1)(z-2)] = A/(z-1) + B/(z-2)
   解得 A = -1,B = 1
3. 所以 X(z) = -z/(z-1) + z/(z-2)
4. 查表:z/(z-1) → 1ⁿ = 1,z/(z-2) → 2ⁿ
5. 结果:x(n) = -1 + 2ⁿ,n ≥ 0

我的小技巧:做部分分式时,我习惯先处理X(z)/z,而不是直接处理X(z)。这样展开后每一项都是z/(z-p)的形式,查表特别方便。这个习惯是我当年做数字滤波器设计时养成的,省了不少事。

这里要注意一个坑:如果X(z)的分子分母次数相同,你得先做多项式除法,把整式部分提出来。我曾经在项目里因为忘了这步,算出来的结果差了整整一个脉冲项,排查了半天才发现。

4.2 幂级数展开法(长除法)

这个方法说白了就是做除法。你把X(z)写成分子分母多项式,然后直接做长除法,得到z的幂级数,系数就是x(n)。

为什么会这样?因为Z变换本身就是幂级数:X(z) = Σ x(n)z⁻ⁿ。所以长除出来的系数,就是序列值。

步骤:

  1. 把X(z)写成z⁻¹的多项式形式(降幂排列)
  2. 做长除法
  3. 商就是x(0) + x(1)z⁻¹ + x(2)z⁻² + ...

看个例子:

X(z) = z / (z - 0.5)

写成z⁻¹形式:X(z) = 1 / (1 - 0.5z⁻¹)

做长除法:
          1 + 0.5z⁻¹ + 0.25z⁻² + 0.125z⁻³ + ...
    ──────────────────────
1-0.5z⁻¹ ) 1
           1 - 0.5z⁻¹
           ──────────
               0.5z⁻¹
               0.5z⁻¹ - 0.25z⁻²
               ────────────────
                       0.25z⁻²
                       0.25z⁻² - 0.125z⁻³
                       ──────────────────
                               0.125z⁻³
                               ...

所以 x(0)=1, x(1)=0.5, x(2)=0.25, x(3)=0.125, ...
即 x(n) = (0.5)ⁿ,n ≥ 0

注意:长除法只能得到前几项的值,得不到闭式表达式。如果你需要x(n)的通项公式,还是得用部分分式法。长除法适合用来验证前几个值,或者当系统阶数很高、你只关心前几个采样点时用。

嗯,这里要提醒一下:做长除法时,分子分母的排列顺序一定要统一。我习惯都用z⁻¹的降幂排列,这样不容易出错。

4.3 留数法

留数法,说白了就是复变函数里的留数定理在Z反变换中的应用。公式长这样:

x(n) = Σ [Residue of X(z)z^(n-1) at pole z = p]

看着吓人,其实操作起来有套路:

  1. 找出X(z)z^(n-1)的所有极点
  2. 对每个极点求留数
  3. 所有留数加起来就是x(n)

对于单极点,留数公式很简单:

Res[X(z)z^(n-1), z=p] = (z-p) * X(z) * z^(n-1) |_{z=p}

举个例子:

X(z) = z / (z-0.5)(z-0.8)

X(z)z^(n-1) = zⁿ / (z-0.5)(z-0.8)

极点:z=0.5,z=0.8

Res at z=0.5: (z-0.5) * zⁿ/(z-0.5)(z-0.8) |_{z=0.5}
            = 0.5ⁿ / (0.5-0.8) = -0.5ⁿ/0.3

Res at z=0.8: (z-0.8) * zⁿ/(z-0.5)(z-0.8) |_{z=0.8}
            = 0.8ⁿ / (0.8-0.5) = 0.8ⁿ/0.3

所以 x(n) = (0.8ⁿ - 0.5ⁿ)/0.3,n ≥ 0

我的经验:留数法其实跟部分分式法本质是一样的,只是计算路径不同。我个人只有在极点比较多、或者有重极点的时候才用留数法。平时做单极点系统,部分分式法更快。你想想看,留数法还要算导数,多麻烦。

4.4 初值与终值定理

这两个定理特别实用,因为它们不需要做完整的反变换,就能直接得到序列的初值和终值。

初值定理:

x(0) = lim_{z→∞} X(z)

说白了,就是看X(z)在z趋向无穷时的极限。如果X(z)是真分式,那x(0)就是分子最高次项系数除以分母最高次项系数。

终值定理:

lim_{n→∞} x(n) = lim_{z→1} (z-1)X(z)

注意:终值定理只在系统稳定的前提下才成立。如果系统有极点在单位圆上或圆外,终值定理会给出错误结果。

举个例子:

X(z) = z / (z-0.5)(z-0.8)

初值:x(0) = lim_{z→∞} z/(z-0.5)(z-0.8) = 0
      因为分子一次,分母二次,z→∞时趋于0

终值:lim_{n→∞} x(n) = lim_{z→1} (z-1) * z/(z-0.5)(z-0.8)
      代入z=1:= 0 * 1/(0.5*0.2) = 0
      系统稳定,终值为0,合理

避坑指南:我曾经在一个电机控制项目里,用终值定理算稳态误差,结果怎么算都不对。后来发现系统有个极点在z=1(积分环节),终值定理的条件不满足。所以用终值定理前,一定先检查系统稳定性。

4.5 四种方法对比

方法 优点 缺点 适用场景
部分分式展开法 能得到闭式表达式,查表方便 需要因式分解,重极点处理麻烦 低阶系统,单极点为主
幂级数展开法(长除法) 操作简单,适合编程实现 得不到通项公式,只能算前几项 验证前几个值,或只需有限项
留数法 理论严谨,适合重极点 计算复杂,容易出错 高阶系统,重极点情况
初值与终值定理 快速得到边界值,无需完整反变换 信息有限,只给两个点 系统分析中的快速校验

我的建议:实际工程中,我90%的情况用部分分式法。长除法用来快速验证前几个值。留数法嘛,说实话,除了考试和写论文,我很少手算。现在MATLAB一个iztrans命令就搞定了。但理解原理很重要,不然你连结果对错都判断不了。

Z反变换方法选择流程图 已知 X(z) 需要通项公式? 有重极点? 部分分式展开法 留数法 幂级数展开法 初值/终值定理 得到 x(n)

好了,Z反变换的四种方法就讲到这里。记住,方法没有好坏之分,只有合不合适。你平时做项目,多练几次就知道哪种情况该用哪种方法了。


公众号:蓝海资料掘金营,微信deep3321