☰
z变换与z域分析:收敛域、性质与系统函数精讲
2026/9/30 1:14:15 网站建设 项目流程

【信号与系统】(二十三) z变换与z域分析——z变换及其性质

学到离散时间系统这块,很多人会卡在一个坎上:前面拉普拉斯变换刚摸熟,转眼又冒出个z变换,符号长得像、性质也像,可一旦做起题来,收敛域怎么画、性质怎么套、系统函数怎么求,脑子就开始打结。我自己当年学这一章的时候,光收敛域就反复栽了三回跟头,后来带项目做数字滤波器设计,才真正把这些性质用进了工程里。z变换说白了就是离散信号世界的“拉普拉斯变换”,它把一串离散序列映射到复频域,让我们能用代数方法处理差分方程、分析系统稳定性、设计各类数字滤波器。这篇文章面向正在啃信号与系统教材的同学,也面向已经工作、想把离散系统分析捡起来的工程师,从定义、收敛域到性质逐条拆开讲,附带我用代码验证的过程和若干踩坑记录。看完你至少能做到:给定一个序列能写出它的z变换并画出收敛域,拿到一个系统函数能判断因果性和稳定性,用几条核心性质快速化简变换式。

1. 为什么离散信号分析绕不开z变换

1.1 从离散序列到复频域的桥梁

连续时间系统里,我们靠拉普拉斯变换把微分方程变成代数方程;到了离散时间系统,差分方程扮演同样的角色,而z变换就是把它代数化的那把工具。一个离散序列 x[n] 经过z变换后变成 X(z),其中 z 是一个复变量,通常写成 z = re^{jω}。这个 r 和 ω 的分解特别关键:ω 对应频率,r 对应幅度衰减或增长因子。当我们取 r = 1,也就是让 z 落在单位圆上,z变换就退化成离散时间傅里叶变换(DTFT),这时候 X(z) 直接反映了序列的频谱特征。所以你可以把z变换理解成傅里叶变换的“加强版”,它多了一个幅度维度,能处理那些傅里叶变换不收敛的信号,比如不断增长的序列。

我一开始学的时候总把 z 当成一个普通数字,后来才反应过来它是个复平面上的点,整个复平面才是z变换的“舞台”。一个序列的z变换 X(z) 通常是它自己复平面上的有理函数,分母的零点决定了这个函数在哪些地方“爆炸”,也就是极点。极点的位置直接决定了系统的稳定性,这一点在后面讲系统函数时是重中之重。

1.2 它到底解决了哪些实际问题

z变换在工程里的用处不只是解题。数字滤波器设计是它的主战场之一:给定通带、阻带、纹波这些指标,我们通过z域设计得到系统函数 H(z),再把 H(z) 的分子分母系数直接变成代码里差分方程的系数,落到FPGA或者DSP上运行。我一个做音频处理的朋友,他们团队做的降噪算法,核心就是几组巴特沃斯和切比雪夫数字滤波器,每一个都建立在z域分析之上。另一个典型场景是控制系统的离散化:连续控制器先在s域设计好,再用双线性变换之类的映射搬到z域,这样才能在单片机上按采样周期跑起来。还有通信里的信道均衡、语音编码里的线性预测,背后都有z变换的影子。也就是说,这一章不是纸上谈兵,它是整个数字信号处理的数学地基。

1.3 为什么不能只用傅里叶变换

这里我要专门解释一下“为什么要有z变换”这个新手最常问的问题。傅里叶变换要求序列绝对可和,也就是 Σ|x[n]| < ∞,可现实里有大把信号不满足,比如指数增长序列 a^n u[n](a > 1)。这些信号在傅里叶变换下是发散的,没法分析。z变换通过引入衰减因子 r^{-n},让 Σ|x[n]|r^{-n} 在某个 r 范围内收敛,把不收敛的信号“拽”回了可分析的区间。这个收敛的 r 范围就是收敛域(ROC)。等分析完了,再让 r 趋近于 1,就能反推出频域特性。所以z变换本质上是给傅里叶变换加了个可调的权重,让它能对付更广的一类信号。我当初理解这一点之后,收敛域那部分突然就通透了——收敛域不是凭空冒出来的约束,而是这个加权因子存在的前提。

2. z变换的定义与收敛域怎么吃透

2.1 双边z变换和单边z变换的区别

定义先摆出来。双边z变换:

X(z) = Σ_{n=-∞}^{∞} x[n] z^{-n}

单边z变换:

X(z) = Σ_{n=0}^{∞} x[n] z^{-n}

两者的差别就在求和下限。双边变换考虑 n 从负无穷到正无穷,适合分析非因果系统和双边序列;单边变换只管 n ≥ 0,适合分析因果系统,而且它有一个巨大优势:能把时移性质处理得很干净,用来解带初始条件的差分方程。很多人做课后题时分不清什么时候用哪个,我给你一个判断标准:如果题目强调“因果”“初始松弛”,基本用单边;如果让你分析一个双边序列或者反因果序列的变换,用双边。需要特别提醒的是,单边z变换对时移的处理有初始条件项,比如 x[n-1] 的单边变换是 z^{-1}X(z) + x[-1],这个 x[-1] 就是初始条件,解差分方程时千万别漏。

2.2 收敛域的判定逻辑和三种形态

收敛域是z变换最容易丢分的地方,因为同一个 X(z) 表达式配不同的收敛域,对应完全不同的序列。判定核心就一句话:让 Σ|x[n]|r^{-n} 收敛的 r 的范围。写成 z = re^{jω},代入定义,|z| = r 决定了收敛性,相位 ω 不影响收敛。所以收敛域在复平面上一定是关于原点对称的环状区域,只有三种形态:

  • 有限长序列:收敛域是整个z平面,可能去掉 z = 0 或 z = ∞。
  • 右边序列(因果):收敛域是某个圆的外面,|z| > r_max。
  • 左边序列(反因果):收敛域是某个圆的内部,|z| < r_min。
  • 双边序列:收敛域是两个圆之间的环,r_min < |z| < r_max。

我踩过的坑是这样的:算 X(z) 的时候把它化成分式和,然后只看极点就下结论。但收敛域的关键在于“看序列的支撑区间”,必须回到原序列,判断它是左边、右边还是双边,才能定下收敛域落在极点的哪一侧。举个例子,1/(1-az^{-1}) 这个表达式,如果 |z| > |a|,对应 a^n u[n];如果 |z| < |a|,对应 -a^n u[-n-1]。同一个式子,两个完全不同的序列。这就是为什么单看 X(z) 是不够的,必须带上收敛域,这也是考试里最常见的陷阱。

2.3 常见序列变换对照表

下面这张表是我复习和做项目时反复查的,建议直接记牢。记住这些再配合性质,绝大多数题都能拆出来。

序列 x[n]z变换 X(z)收敛域
δ[n]1整个z平面
u[n]1/(1-z^{-1})|z| > 1
-u[-n-1]1/(1-z^{-1})|z| < 1
δ[n-m]z^{-m}整个z平面(z≠0)
a^n u[n]1/(1-az^{-1})|z| > |a|
-a^n u[-n-1]1/(1-az^{-1})|z| < |a|
n a^n u[n]az^{-1}/(1-az^{-1})^2|z| > |a|
cos(ω₀n)u[n](1 - cosω₀ z^{-1})/(1 - 2cosω₀ z^{-1} + z^{-2})|z| > 1
sin(ω₀n)u[n]sinω₀ z^{-1}/(1 - 2cosω₀ z^{-1} + z^{-2})|z| > 1

注意:这张表里 a 可以是复数,收敛域判据 |z| > |a| 用的是模。当 a 是复数时,a^n 是复指数序列,实部和虚部分别对应衰减余弦和衰减正弦,很多教程只给实数情况,实际工程里复数 a 非常常见。

我个人的经验是,把 a^n u[n] 这一条背到滚瓜烂熟,其他的都能推:n a^n u[n] 就是对 a 参数求导再乘 -z,cos 和 sin 就是把 e^{jω₀n} 拆成两个复指数再叠加。你不用死记硬背整张表,理解推导链条比记忆有效得多。

3. z变换的核心性质逐条拆解

3.1 线性性质与时移性质

线性性质最简单也最常用:a·x₁[n] + b·x₂[n] 的z变换是 a·X₁(z) + b·X₂(z),收敛域至少是两者收敛域的交集。为什么说“至少”?因为如果两个函数相加时发生了极点相消,收敛域可能比交集更大。这一点在串联系统或者信号叠加时会用上,考试里也是个冷门考点。

时移性质是解差分方程的核心:x[n-n₀] 的双边z变换是 z^{-n₀}X(z)。这个性质直观理解就是序列右移 n₀ 位,相当于在z域乘上 z^{-n₀},也就是相位上多了个线性项。收敛域除了可能在 z = 0 或 z = ∞ 处有变化,基本不变。我实测下来,这个性质配合单边变换解差分方程是最顺手的路子。

实操心得:用单边z变换时,时移一定要小心初始条件。x[n-1] 的单边变换是 z^{-1}X(z) + x[-1],x[n-2] 是 z^{-2}X(z) + z^{-1}x[-1] + x[-2]。我最初做题经常漏掉这些初始项,导致结果差一项,检查半天才发现。建议把初始条件单独列出来,最后再回代。

3.2 z域尺度变换与时间反转

z域尺度变换(也叫序列乘指数):a^n x[n] 对应的z变换是 X(z/a),收敛域变为 |a|·r_min < |z| < |a|·r_max。用一句话记就是“序列乘 a^n,z 换成 z/a”。这个性质在分析衰减振荡、解带指数的差分方程时特别有用。

时间反转:x[-n] 对应 X(1/z),收敛域从 r_min < |z| < r_max 变成 1/r_max < |z| < 1/r_min。这个性质看起来简单,但和收敛域结合后能玩出很多花样。比如因果序列反转后变成反因果序列,收敛域从圆外翻到圆内。我在处理相关运算或者自相关序列分析时经常用到。

这两个性质放在一起记更牢:尺度变换改变的是收敛域的半径缩放,反转改变的是内外翻转。理解了它们在复平面上的几何意义,就不容易搞混。

3.3 卷积定理与系统函数

卷积定理是我认为整个z域分析里应用价值最高的一条:x₁[n] * x₂[n] 的z变换等于 X₁(z)·X₂(z)。这就把时域里复杂的卷积求和,变成了z域里简单的代数相乘。离散系统里,输出是输入与单位脉冲响应的卷积,所以 Y(z) = X(z)·H(z),于是系统函数 H(z) = Y(z)/X(z)。对于一个由线性常系数差分方程描述的系统,H(z) 就是两个多项式的比:

H(z) = (Σ_{k=0}^{M} b_k z^{-k}) / (1 + Σ_{k=1}^{N} a_k z^{-k})

分子多项式的根是系统的零点,分母多项式的根是系统的极点。系统的因果性和稳定性都藏在这组极点里。这里我要强调一个贯穿整章的判断标准:

  • 因果系统:收敛域在极点构成的圆的最外侧。
  • 稳定系统:收敛域包含单位圆 |z| = 1。
  • 因果且稳定:所有极点都在单位圆内 |z| < 1。

这三条几乎每道系统分析题都要用。我当初理解“稳定要求收敛域包含单位圆”花了很久,后来想通了:单位圆对应 r = 1,就是傅里叶变换存在的条件,收敛域包含单位圆说明傅里叶变换收敛,系统对每个频率都有有限增益,自然不会发散。这个物理解释比死记结论管用得多。

3.4 z域微分与序列加权

z域微分性质:n·x[n] 的z变换是 -z·(dX(z)/dz)。这条性质用来处理带 n 的序列,比如 n a^n u[n] 这种。推论就是如果已知 x[n] 的变换,那么 n x[n] 的变换可以求导得到。收敛域不变。我第一次看到这条性质觉得挺玄,其实推导就两步:对 X(z) 的定义式两边关于 z 求导,然后整理。理解了推导,用起来就很自然。

还有一个相关的累加性质:Σ_{k=-∞}^{n} x[k] 的z变换是 X(z)/(1-z^{-1}),相当于乘上 u[n] 再做卷积。这条在分析累积求和系统时会用到,比如数字积分器。不过累加会引入单位圆上的极点,稳定性判断时要特别留心。

3.5 初值定理与终值定理

初值定理(因果序列):x[0] = lim_{z→∞} X(z)。这条用来快速验证变换结果的合理性,或者已知 X(z) 求序列首项。原因也简单,当 z 趋于无穷,z^{-1} 趋于零,X(z) 只剩 x[0] 这一项。

终值定理:如果 x[n] 是因果序列且 n→∞ 时极限存在,则 x[∞] = lim_{z→1}(z-1)X(z)。这条在控制系统里判断稳态误差时极其常用:给一个闭环系统函数,直接代入就能算出稳态输出,不用做逆变换。

注意:终值定理有个前提——序列的终值必须存在,等价于 (z-1)X(z) 的极点全部在单位圆内。如果系统有在单位圆上的极点(比如持续振荡),终值定理会给出错误结果。我见过有人对一个振荡序列硬套终值定理,算出一个“假的稳态值”,结果被误导。所以用它之前先检查稳定性,这一步不能省。

4. 实操验证:用代码把性质跑一遍

4.1 用SymPy推导基本变换对

光看公式容易虚,我习惯用代码把关键变换对推一遍,加深记忆。用Python的SymPy可以符号化地算出求和结果:

import sympy as sp n, z, a = sp.symbols('n z a', real=True) # 单边z变换定义:x[n] * z^(-n) # 例1:a^n * u[n] expr = (a**n) * z**(-n) X = sp.summation(expr, (n, 0, sp.oo)) print(sp.simplify(X)) # 输出:1/(1 - a/z) = 1/(1 - a*z^-1),收敛条件 |z| > |a|

跑完你会发现结果正好是 1/(1-az^{-1}),和表里一致。你也可以把 a 换成 e^{jω₀},验证复指数序列的变换。

omega0 = sp.symbols('omega0', real=True) expr2 = (sp.exp(sp.I*omega0*n)) * z**(-n) X2 = sp.summation(expr2, (n, 0, sp.oo)) print(sp.simplify(X2)) # 得到 1/(1 - e^{jω0} z^-1),实部虚部拆分即得 cos、sin 变换对

这段代码对我帮助特别大,因为它把“为什么表里那个公式长这样”直接演示了出来。建议你自己动手跑一次,比看十遍推导都管用。

4.2 数值验证卷积定理

卷积定理说时域卷积等于z域相乘。数值上验证的思路是:构造两个有限长序列,用numpy算卷积,再分别求z变换在某个 z 点的值,看是否相等。

import numpy as np x1 = np.array([1, 2, 3]) x2 = np.array([4, 5]) # 时域卷积 conv_time = np.convolve(x1, x2) print("时域卷积:", conv_time) # 在某个具体 z 点上,卷积结果的z变换 z0 = 1.5 + 0.5j X1 = sum(x1[k] * z0**(-k) for k in range(len(x1))) X2 = sum(x2[k] * z0**(-k) for k in range(len(x2))) X_conv = sum(conv_time[k] * z0**(-k) for k in range(len(conv_time))) print("X1*X2 =", X1 * X2) print("卷积的变换 =", X_conv) # 两者应当几乎相等

实测下来两者在浮点误差范围内完全吻合。这种数值验证特别适合考试前检查自己有没有把性质记错,因为公式可以记混,但数字不会骗你。

实操心得:用代码验证时,选 z 点要避开极点,否则数值会炸。选 |z| 大于所有收敛域半径的点最稳妥,比如 z0 = 1.5 + 0.5j 这种落在单位圆外又远离极点的位置。

4.3 画收敛域和极零点图

做系统分析时,我强烈建议把极零点图画出来。用matplotlib几行代码就能搞定:

import matplotlib.pyplot as plt import numpy as np # H(z) = (1 - 0.5 z^-1) / (1 - 0.8 z^-1 + 0.15 z^-2) # 分子分母系数(按 z^-1 升幂) b = [1, -0.5] a = [1, -0.8, 0.15] zeros = np.roots(b) poles = np.roots(a) theta = np.linspace(0, 2*np.pi, 200) plt.plot(np.cos(theta), np.sin(theta), 'k--', label='单位圆') plt.scatter(zeros.real, zeros.imag, marker='o', label='零点') plt.scatter(poles.real, poles.imag, marker='x', label='极点') plt.axis('equal') plt.legend() plt.show()

盯着一张图能读出很多信息:极点都在单位圆内,说明系统因果且稳定;零点位置影响频响的凹陷位置。我养成画图的习惯之后,判断稳定性再没出过错。

5. 常见问题与排查技巧实录

5.1 收敛域判断的典型错误

我自己和身边人最常犯的错误,是把收敛域和 X(z) 表达式割裂。再强调一遍:z变换必须“表达式 + 收敛域”成对出现才有意义。我整理了几个高频错误:

错误表现根本原因正确做法
只写 1/(1-az^{-1}) 不写收敛域忽略收敛域信息必须补上 |z|>|a| 或 |z|<|a|
双边序列当单边算没看序列支撑区间先判断 n<0 有无非零值
因果序列收敛域画成圆内左右序列混淆因果=右边序列=圆外
极点相消后仍按原收敛域忽略相消扩展相消后收敛域可能变大

我记这个的办法是:把右(因果)记成“向外的箭头”,把左(反因果)记成“向内的箭头”,画图时先标极点,再根据序列方向选取极点外侧或内侧。

5.2 性质使用中的坑

时移性质乘以 z^{-n₀},很多人会搞反符号,以为左移乘 z^{-1},其实是右移乘 z^{-1}。序列右移(延迟)才是乘 z 的负幂,因为 z^{-n} 本身带负指数,可以理解为一种延迟算子。这个和拉普拉斯变换里 e^{-sτ} 对应时延是一脉相承的。

z域微分性质里的负号也容易丢:n x[n] ↔ -z dX/dz,前边那个负号不能少。我推过一次就再没记错,因为求导 d(z^{-n})/dz = -n z^{-n-1},那个负号是求导自带的。

终值定理前面已经强调,用它之前先检查极点是否都在单位圆内,否则结果无意义。

5.3 系统稳定性速查表

最后给一张我在实际工作中直接查表用的稳定性判据,尤其是拿到一个 H(z) 时快速判断:

条件因果性稳定性结论
收敛域 |z| > r_max,r_max < 1因果稳定可用
收敛域 |z| > r_max,r_max > 1因果不稳定需重新设计
收敛域包含单位圆但不含无穷非因果稳定需双向处理
收敛域不包含单位圆—不稳定弃用
单位圆上有单极点因果临界稳定振荡,注意

实操心得:我实测过一个二阶滤波器,极点算出来在 0.98 和 0.99,属于“稳定但不安全”的区间,舍入误差一大会飘到单位圆外。工程上一般要求极点模值留出余量,比如控制在 0.95 以内,这样定点实现时才有保障。这是课本不会告诉你、但实际做DSP必须考虑的事。

再说一个排查思路。如果逆z变换得到的结果和预期差了一个常数项或者一个指数项,先怀疑初始条件有没有漏,再看收敛域是不是选错了,最后检查有没有把单边当双边。这三步覆盖了我遇到的九成问题。等这些性质彻底消化,你会发现z域分析比时域分析高效太多:时域里要一步步卷积、递推,z域里往往几次代数化简就出结果。真正的功力体现在看到序列就能条件反射想到它落在哪个收敛域,看到系统函数就能判断稳定性——这种直觉没有捷径,只能靠把每条性质背后的推导亲手过一遍。

我个人的体会是,初学的时候别贪快,把 a^n u[n] 这一个序列的变换从定义一路推到收敛域,再拿它去推其他所有变换对,比你硬背整张表牢固得多。后面学逆z变换、差分方程求解、数字滤波器设计,全都是建立在这一章的根基上。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询