1. 从时域到z域:为什么我们需要另一个“域”?
信号与系统这门课,学到这里,很多同学可能已经有点“域”疲劳了。先是时域,然后是傅里叶变换带来的频域,现在又冒出来一个z域。这玩意儿到底是干嘛的?是不是数学家们为了显得高深而发明的又一套复杂工具?作为一个在信号处理领域摸爬滚打多年的工程师,我可以负责任地告诉你,z变换和z域分析,绝不是花架子,而是解决一大类实际工程问题的“瑞士军刀”,尤其是在数字信号处理和离散时间系统分析中,它的地位无可替代。
简单来说,z变换之于离散时间信号和系统,就如同拉普拉斯变换之于连续时间信号和系统。如果你觉得拉普拉斯变换把微分方程变成了代数方程,让系统分析变得简单,那么z变换就是把差分方程变成了代数方程,让离散系统的分析、设计和实现变得清晰可控。我们日常接触的几乎所有数字设备,从手机的通话降噪、音乐播放器的均衡器,到图像处理软件的各种滤镜,其底层算法都离不开z域分析提供的理论框架。不理解z域,就很难真正理解一个数字滤波器是如何工作的,更谈不上自己去设计和优化它。
那么,z域到底提供了什么独特的视角?核心在于两点:收敛域和系统函数。时域信号是一个个孤立的采样点,我们很难一眼看出它的特性(比如是否稳定、能量如何分布)。通过z变换,我们将这个序列映射到复平面(z域)上,信号的特性,特别是其增长或衰减的趋势、频率成分,就变成了复平面上一个区域(收敛域)和一种函数形式(z变换表达式)的问题。系统对信号的处理,则变成了系统函数与信号z变换的简单乘法。这种从“序列操作”到“复函数运算”的降维打击,是z域分析强大威力的根源。接下来,我们就一步步拆解,看看这把“瑞士军刀”的每个部件到底怎么用。
2. z变换的核心:定义、收敛域与常见序列变换对
要进入z域,首先得拿到“门票”——z变换公式。对于一个离散时间序列 x[n],其双边z变换定义为: X(z) = ∑_{n=-∞}^{∞} x[n] z^{-n} 其中,z是一个复变量,z = re^{jω}。这个求和要能收敛,序列 x[n] 乘以 r^{-n} 后的结果必须是绝对可和的。所有使得该级数收敛的z的集合,就称为收敛域。
注意:收敛域是z变换不可分割的一部分!离开收敛域谈z变换表达式,就像离开定义域谈函数值,是没有意义的。同一个z变换表达式,搭配不同的收敛域,可能对应完全不同的时域序列。
为什么收敛域如此重要?因为它直接揭示了序列的因果性和稳定性等关键特性。记住几个基本规律:
- 右边序列:如果序列在 n < N 时全为零,其收敛域是某个圆的外部,即 |z| > R_x。特别地,因果序列(n<0时为零)的收敛域包含无穷远点。
- 左边序列:如果序列在 n > N 时全为零,其收敛域是某个圆的内部,即 |z| < R_x。
- 双边序列:可以看作一个左边序列和一个右边序列的和,其收敛域通常是这两个序列收敛域的交集,是一个圆环区域 R_{x-} < |z| < R_{x+}。如果这个环不存在(即 R_{x-} >= R_{x+}),则z变换不存在。
- 有限长序列:收敛域通常是整个z平面,可能除了z=0或z=∞。
理解了定义和收敛域,我们就能建立一些最常用的z变换对,这是后续分析的“工具箱”。下面这个表格是我在工程实践中反复用到的一些核心变换对,建议理解并记忆:
| 时域序列 x[n] | z变换 X(z) | 收敛域 |
|---|---|---|
| δ[n] (单位脉冲) | 1 | 全部z平面 |
| u[n] (单位阶跃) | z / (z - 1) | |z| > 1 |
| -u[-n-1] (反因果阶跃) | z / (z - 1) | |z| < 1 |
| a^n u[n] (因果指数) | z / (z - a) | |z| > |a| |
| -a^n u[-n-1] (反因果指数) | z / (z - a) | |z| < |a| |
| n a^{n-1} u[n] | z / (z - a)^2 | |z| > |a| |
| cos(ω₀n) u[n] | [z(z - cos ω₀)] / [z² - 2z cos ω₀ + 1] | |z| > 1 |
| sin(ω₀n) u[n] | [z sin ω₀] / [z² - 2z cos ω₀ + 1] | |z| > 1 |
这里有一个非常经典的“坑”:u[n] 和 -u[-n-1] 的z变换表达式一模一样,都是 z/(z-1),区别仅在于收敛域。这完美诠释了“收敛域是z变换一部分”的论断。在实际做题或分析系统时,如果只写出表达式而没注明收敛域,答案就是不完整的,甚至可能是错误的。
2.1 收敛域的图形化理解与系统稳定性
如何直观理解收敛域?我们可以把z写成极坐标形式 z = re^{jω}。那么 z^{-n} = r^{-n} e^{-jωn}。r^{-n} 扮演了一个“衰减或增长因子”的角色。
- 对于因果序列 a^n u[n],我们需要 r^{-n} 去“压制” a^n 的增长。如果 |a| < 1(序列衰减),那么只要 r > |a|, r^{-n} 乘以 a^n 的结果就会随着n增大而衰减,级数收敛。所以收敛域是 |z| > |a|。
- 如果 |a| > 1(序列增长),就需要 r 更大(> |a|)的衰减因子来压制它,收敛域依然是 |z| > |a|,但这个区域在单位圆外。
系统稳定性在z域有一个极其简洁的判据:一个线性时不变系统是稳定的,当且仅当其系统函数 H(z) 的收敛域包含单位圆(|z| = 1)。为什么?因为系统稳定的时域定义是单位脉冲响应绝对可和,即 ∑ |h[n]| < ∞。在z变换中,令 |z| = 1,即 r = 1,此时z变换的求和式就变成了 ∑ h[n] e^{-jωn},其存在要求 ∑ |h[n]| < ∞,这正是稳定性的条件。因此,当你拿到一个系统函数 H(z) 时,第一件事就是画出它的零极点图,然后看单位圆是否在收敛域内。这是z域分析送给我们的第一个大礼。
3. 系统函数H(z):离散系统的“DNA”
在时域,一个线性时不变离散系统完全由它的单位脉冲响应 h[n] 来描述。在z域,这个系统则由其系统函数 H(z) 来描述,它是 h[n] 的z变换:H(z) = Z{h[n]}。但H(z)更常见的来源是系统的差分方程。
考虑一个通用的N阶线性常系数差分方程: ∑_{k=0}^{N} a_k y[n-k] = ∑_{r=0}^{M} b_r x[n-r], 其中 a_0 = 1。 我们对等式两边同时取z变换,利用z变换的移位性质(Z{x[n-k]} = z^{-k} X(z)),可以得到: (∑_{k=0}^{N} a_k z^{-k}) Y(z) = (∑_{r=0}^{M} b_r z^{-r}) X(z) 于是,系统函数为: H(z) = Y(z)/X(z) = (∑_{r=0}^{M} b_r z^{-r}) / (∑_{k=0}^{N} a_k z^{-k}) = B(z) / A(z)
这个形式非常优美。分子多项式 B(z) 的根称为系统的零点,分母多项式 A(z) 的根称为系统的极点。零极点在复平面上的分布,就像系统的“DNA”,决定了该系统几乎所有的特性:频率响应、稳定性、瞬态行为、实现结构等。
例如,一个一阶系统:y[n] = x[n] + 0.8y[n-1]。其差分方程可写为 y[n] - 0.8y[n-1] = x[n]。对两边取z变换:Y(z) - 0.8z^{-1}Y(z) = X(z) => H(z) = Y(z)/X(z) = 1 / (1 - 0.8z^{-1}) = z / (z - 0.8)。这个系统有一个极点 z_p = 0.8,一个零点 z_z = 0。因为极点0.8在单位圆内,所以系统是稳定的。它的单位脉冲响应 h[n] = 0.8^n u[n] 是一个逐渐衰减的指数序列。
3.1 零极点图:一眼看穿系统特性
将H(z)的零极点画在复平面上,就是零极点图。这是z域分析中最强大的可视化工具。
- 极点位置决定模态(自然响应):每个极点 p_i 对应时域中的一个自然模式 p_i^n。如果 |p_i| < 1,模式衰减;|p_i| > 1,模式增长;|p_i| = 1,模式等幅振荡。稳定性要求所有极点都在单位圆内。
- 零点位置决定“阻塞”频率:在零点所在的频率上,系统的频率响应为零,即该频率的信号无法通过系统。例如,在 z = 1 (ω=0) 处的零点会阻隔直流信号;在 z = -1 (ω=π) 处的零点会阻隔最高频率信号。
- 几何法估算频率响应:频率响应 H(e^{jω}) 就是令 z = e^{jω} 代入 H(z)。在零极点图上,e^{jω} 是单位圆上的一个点。H(e^{jω}) 的幅度等于所有零点矢量长度之积除以所有极点矢量长度之积,再乘以一个常数增益。相位等于所有零点矢量相角之和减去所有极点矢量相角之和。通过观察动点在单位圆上移动时,这些矢量的长度和角度变化,可以快速定性画出幅频和相频特性曲线。这个方法在滤波器初步设计中非常有用。
我曾经在设计一个数字陷波器时,就需要滤除一个特定频率的工频干扰。我的思路就是:在单位圆上对应干扰频率 ω₀ 的点 e^{jω₀} 处,放置一对共轭零点,这样该频率的信号增益为零。但只有零点会引入尖锐的陷波,也会影响相位,为了在陷波频率附近获得更陡峭的衰减且保持相位线性,我还在靠近这对零点的单位圆内,放置了一对共轭极点。极点的作用是把频率响应在零点附近“拉”下来,让陷波更尖锐,但同时要确保极点严格在单位圆内以保持稳定。通过零极点图的几何分析,我很快确定了极点的合适半径(比如0.95),再通过计算确定具体系数。这种基于零极点分布的直观设计,比直接频域拟合要高效得多。
4. z域分析的实战应用:系统特性分析与滤波器设计
理论说得再多,不如实际操练一遍。我们通过一个具体的例子,把z域分析的全流程走通。假设我们有一个二阶系统,其差分方程为: y[n] = x[n] + x[n-1] - 0.5y[n-1] + 0.25y[n-2]
4.1 第一步:求系统函数H(z)与零极点
对差分方程两边取z变换: Y(z) = X(z) + z^{-1}X(z) - 0.5z^{-1}Y(z) + 0.25z^{-2}Y(z) 将所有包含Y(z)的项移到左边: Y(z) + 0.5z^{-1}Y(z) - 0.25z^{-2}Y(z) = X(z) + z^{-1}X(z) Y(z) (1 + 0.5z^{-1} - 0.25z^{-2}) = X(z) (1 + z^{-1}) 因此,系统函数为: H(z) = Y(z)/X(z) = (1 + z^{-1}) / (1 + 0.5z^{-1} - 0.25z^{-2})
为了得到零极点,将分子分母同时乘以 z²,化为z的正幂形式更方便: H(z) = (z² * (1 + z^{-1})) / (z² * (1 + 0.5z^{-1} - 0.25z^{-2})) = (z² + z) / (z² + 0.5z - 0.25)
现在,分子:z² + z = z(z+1), 零点为 z_z1 = 0, z_z2 = -1。 分母:z² + 0.5z - 0.25 = 0, 解得极点 z_p = [-0.5 ± sqrt(0.25+1)] / 2 = [-0.5 ± sqrt(1.25)] / 2 ≈ [-0.5 ± 1.118] / 2。所以两个极点为:z_p1 ≈ 0.309, z_p2 ≈ -0.809。
4.2 第二步:确定收敛域与系统稳定性
系统函数已经给出,但收敛域需要根据系统的因果性等额外条件来确定。通常,我们默认系统是因果的(物理可实现的系统输出不依赖于未来输入),那么收敛域必须是某个圆的外部,并且包含无穷远点。
观察两个极点:z_p1 ≈ 0.309, |z_p1| < 1; z_p2 ≈ -0.809, |z_p2| < 1。两个极点都在单位圆内。对于因果系统,其收敛域是距离原点最远的那个极点所在圆的外部,即 |z| > max(|z_p1|, |z_p2|) = 0.809。这个区域包含了单位圆(|z|=1)。因此,该系统是因果且稳定的。
如果题目说系统是反因果的,那么收敛域就会是 |z| < min(|z_p1|, |z_p2|) = 0.309,这个区域不包含单位圆,所以反因果的这个系统是不稳定的。这再次强调了收敛域的重要性。
4.3 第三步:分析频率响应
将 z = e^{jω} 代入 H(z): H(e^{jω}) = (e^{j2ω} + e^{jω}) / (e^{j2ω} + 0.5e^{jω} - 0.25)
我们可以用几何法定性分析。零点在0和-1(对应频率ω=π)。极点在0.309和-0.809。
- 当ω从0向π变化时,动点e^{jω}在单位圆上逆时针移动。
- 在ω=0(z=1)时,到零点z=0的矢量长度为1,到零点z=-1的矢量长度为2,到两个极点的矢量长度都小于1但具体不同。可以估算出低频增益。
- 在ω=π(z=-1)时,动点与零点z=-1重合,该零点矢量长度为0,因此幅频响应在ω=π处为零。这是一个典型的高频阻隔特性。
- 在ω=π/2(z=j)时,可以大致估算幅度。
更精确的做法是用Python(或MATLAB)快速计算并绘图。这里给出一个简单的Python代码片段作为参考:
import numpy as np import matplotlib.pyplot as plt from scipy import signal # 定义分子分母系数 (按z^{-1}升幂排列) b = [1, 1] # 对应 1 + z^{-1} a = [1, 0.5, -0.25] # 对应 1 + 0.5z^{-1} - 0.25z^{-2} # 计算频率响应 w, h = signal.freqz(b, a) # 绘图 fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 8)) ax1.plot(w, 20 * np.log10(abs(h)), 'b') ax1.set_ylabel('幅度 (dB)') ax1.set_title('系统频率响应') ax1.grid() ax2.plot(w, np.angle(h), 'g') ax2.set_xlabel('频率 [rad]') ax2.set_ylabel('相位 (rad)') ax2.grid() plt.show()运行这段代码,你会看到幅频响应在高频段(ω接近π)有一个很深的凹陷,验证了我们的几何分析。同时,观察相频响应,在通带内相位变化相对平缓。
4.4 第四步:求单位脉冲响应h[n]
对于因果稳定系统,我们可以通过部分分式展开法求逆z变换。H(z) = (z² + z) / (z² + 0.5z - 0.25)。注意,分子阶次等于分母阶次,需要先化为真分式,或者直接对 H(z)/z 展开。
H(z) = z(z+1) / ((z - 0.309)(z + 0.809)) 计算部分分式:H(z)/z = (z+1) / ((z - 0.309)(z + 0.809)) = A/(z-0.309) + B/(z+0.809) 通过留数法求A和B: A = (z - 0.309)[H(z)/z] 在 z=0.309 处的值 = (0.309+1)/(0.309+0.809) ≈ 1.309/1.118 ≈ 1.171 B = (z + 0.809)[H(z)/z] 在 z=-0.809 处的值 = (-0.809+1)/(-0.809-0.309) ≈ 0.191/(-1.118) ≈ -0.171 所以,H(z) = z * [1.171/(z-0.309) - 0.171/(z+0.809)] = 1.171 * z/(z-0.309) - 0.171 * z/(z+0.809)
查表可知,对于因果系统(收敛域|z|>0.809),z/(z-a) 的逆变换是 a^n u[n]。因此: h[n] = [1.171 * (0.309)^n - 0.171 * (-0.809)^n] u[n] 这个h[n]由两个衰减的指数序列叠加而成,因为两个极点的模都小于1,所以随着n增大,h[n]最终会衰减到0,这符合稳定系统的特征。
5. 从分析到设计:z域在数字滤波器设计中的核心作用
前面的例子更多是分析一个给定的系统。而z域更大的威力在于设计系统。数字滤波器设计,本质上就是在z平面上有策略地摆放零极点,以构造出期望的频率响应。
5.1 滤波器类型与零极点布局的关联
- 低通滤波器:通常将极点放置在单位圆内、靠近正实轴(z=1)附近。极点会吸引频率响应,在低频(ω≈0)产生峰值。为了进一步抑制高频,可以在高频段(z=-1附近)放置零点。例如,一个一阶低通:H(z) = (1-a) / (1 - a z^{-1}),极点z=a (0<a<1),在z=1处幅度最大,z=-1处幅度最小。
- 高通滤波器:与低通相反。极点放置在单位圆内、靠近负实轴(z=-1)附近,以吸引高频响应。在低频(z=1)放置零点以抑制直流。例如,H(z) = (1+a)/2 * (1 - z^{-1})/(1 + a z^{-1}),极点z=-a,零点z=1。
- 带通滤波器:在单位圆内目标频率点 e^{jω₀} 附近放置一对共轭极点,以提升该频带。在低频(z=1)和高频(z=-1)可以放置零点以增加阻带衰减。
- 带阻/陷波滤波器:如之前例子,在需要抑制的频率点 e^{jω₀} 处放置一对共轭零点。为了陷波尖锐,可以在靠近零点的单位圆内放置一对共轭极点。
- 全通滤波器:用于调整相位而不改变幅度。其零极点以单位圆为镜像对称:如果有一个极点 z_p = re^{jθ} (r<1),则必有一个零点 z_z = (1/r)e^{jθ}。这样,在单位圆上任何一点,到零点和极点的矢量长度之比恒为1/r * r =1,因此幅度响应恒为常数。
5.2 设计实例:一个简单的数字低通滤波器
假设我们要设计一个截止频率 ω_c = π/4 的简单低通滤波器。我们可以采用一个一阶系统,极点放在正实轴。为了在ω=π处有更好的抑制,我们增加一个在z=-1处的零点。
目标:极点 p = a (实数,0<a<1),零点 z = -1。 系统函数形式:H(z) = K * (z + 1) / (z - a) = K * (1 + z^{-1}) / (1 - a z^{-1}),其中K是增益常数。
确定参数a和K:
确定a:对于一阶系统,极点a决定了带宽。粗略经验是,-3dB截止频率 ω_c 满足 a = e^{-ω_c} 或类似关系。更准确的方法是,要求 |H(e^{jω_c})|^2 = 0.5。我们代入计算: |H(e^{jω})|^2 = |K|^2 * |1 + e^{-jω}|^2 / |1 - a e^{-jω}|^2 = |K|^2 * [2 + 2cosω] / [1 + a^2 - 2a cosω] 令 ω_c = π/4, cos(π/4)=√2/2≈0.707。设 |H(e^{jω_c})|^2 = 0.5,并先假设K=1(后续调整),有: 0.5 = [2 + 20.707] / [1 + a^2 - 2a0.707] = 3.414 / (1 + a^2 - 1.414a) 解得:1 + a^2 - 1.414a = 3.414 / 0.5 = 6.828 => a^2 - 1.414a -5.828 = 0。 解这个二次方程,取0<a<1的根:a ≈ 0.32。这就是我们需要的极点位置。
确定K:通常我们希望在通带中心(ω=0,即直流)有单位增益,即 |H(e^{j0})| = 1。 H(e^{j0}) = K * (1+1)/(1 - a) = K * 2 / (1 - a) 令其幅度等于1:|K * 2/(1-a)| = 1 => K = (1-a)/2 = (1-0.32)/2 = 0.34。 所以,最终的系统函数为:H(z) = 0.34 * (1 + z^{-1}) / (1 - 0.32 z^{-1})
这个滤波器非常简单,性能也有限(过渡带不陡),但它清晰地展示了从性能指标(截止频率、直流增益)到零极点位置,再到系统函数系数的完整设计链路。在实际工程中,我们会使用更成熟的方法(如双线性变换法、窗函数法)来设计性能更好的滤波器,但这些方法的背后,依然是z域和零极点在起作用。
6. 逆z变换:从z域回归时域的三种武器
分析系统最终往往需要得到时域的响应,这就需要进行逆z变换。常用的方法有三种,各有适用场景。
6.1 留数法(围线积分法)
这是最根本、最通用的方法,基于复变函数理论。公式是:x[n] = (1/2πj) ∮_C X(z) z^{n-1} dz,其中C是收敛域内的一条逆时针闭合围线。计算这个积分需要用到柯西留数定理。
- 优点:理论完备,对所有情况都适用。
- 缺点:计算复杂,尤其是高阶极点时。
- 实用场景:当其他方法失效或需要理论验证时使用。在实际工程计算中,除非是简单的极点,否则很少手动计算。
6.2 幂级数展开法(长除法)
根据z变换的定义式 X(z) = ∑ x[n] z^{-n},如果我们能把X(z)展开成关于 z^{-1} 的幂级数,那么级数的系数就是 x[n]。
- 操作方法:将X(z)的分子分母多项式按z^{-1}的降幂或升幂排列,然后进行多项式长除法。
- 优点:直接,可以一次得到序列的前若干项,适合求有限项或右边序列的开头几项。
- 缺点:难以得到闭合形式的通项公式;对于左边序列,需要按z的正幂排列进行长除。
- 示例:X(z) = 1 / (1 - az^{-1}), |z| > |a| (因果序列)。按z^{-1}降幂排列,直接长除:1 ÷ (1 - az^{-1}) = 1 + az^{-1} + a^2z^{-2} + a^3z^{-3} + ...。所以 x[n] = a^n u[n]。
6.3 部分分式展开法(最常用)
这是工程中最主流、最有效的方法,适用于X(z)是有理分式的情况。核心思想是将复杂的X(z)分解成多个简单分式之和,而这些简单分式的逆变换是已知的。
- 标准步骤:
- 将X(z)表示为关于z^{-1}的真分式(分子阶次不高于分母)。如果不是,先化为真分式加一个多项式。
- 更常见且方便的做法是:对X(z)/z进行部分分式展开。因为常见变换对如 z/(z-a) 的形式,其对应的X(z)/z 是 1/(z-a) 的形式,展开更规整。
- 将X(z)/z展开为 A1/(z-p1) + A2/(z-p2) + ... 的形式,其中p_i是极点。
- 等式两边乘以z,得到 X(z) = A1 * z/(z-p1) + A2 * z/(z-p2) + ...
- 根据收敛域,确定每一项对应的是因果序列 (|z|>|p_i|) 还是反因果序列 (|z|<|p_i|),然后查表得到逆变换。
- 优点:能直接得到闭合形式的通项表达式,计算系统化。
- 难点:极点有重根或共轭复根时,展开形式稍有不同。对于共轭复极点,通常将其配对,得到实系数的二阶项,对应时域的衰减正弦序列。
在实际项目中,我几乎总是首选部分分式展开法。它清晰、直接,并且大多数数学软件(如MATLAB的residue函数或Python SciPy的residue)都能直接完成计算,我们只需要正确解读结果并对应到时域序列即可。
7. z域中的系统连接与框图实现
在时域,系统有串联、并联和反馈连接。在z域,这些连接有更简单的对应关系。
- 串联:H(z) = H1(z) * H2(z)。整体系统函数等于子系统函数的乘积。
- 并联:H(z) = H1(z) + H2(z)。整体系统函数等于子系统函数的和。
- 反馈连接:这是构成复杂系统(如滤波器、控制系统)的基础。经典负反馈结构如图,前向通路为G(z),反馈通路为H(z),则闭环系统函数为 T(z) = G(z) / [1 + G(z)H(z)]。
得到系统函数H(z)后,我们可以用不同的结构来实现它,即画出其信号流图或框图。常见结构有:
- 直接型:直接根据差分方程或H(z)的系数画图。结构简单,但对系数误差敏感。
- 级联型:将H(z)分解为一阶或二阶节的乘积,每个节用直接型实现,然后串联。零极点可配对,调整灵活,是最常用的结构之一。
- 并联型:将H(z)分解为部分分式之和,每个一阶或二阶项并联实现。运算误差较小。
- 转置型:由直接型通过流图转置规则得到,具有相似的特性。
选择哪种结构,取决于对计算复杂度、存储量、以及对系数量化误差的敏感度要求。例如,在定点DSP芯片上实现滤波器时,并联型和级联型通常比直接型有更好的数值稳定性。
z域分析为我们提供了一套强大而统一的工具,将离散时间系统的描述、分析、设计和实现全部纳入复平面的框架之下。从理解一个系统的稳定性,到设计一个满足特定频率需求的滤波器,再到用硬件或软件实现它,每一步都离不开对z变换、零极点、收敛域和系统函数的深刻理解。掌握它,你就掌握了打开数字信号处理世界大门的钥匙。