Leobert's Blog

痛苦系列 | DSP-03 跨越单位圆:Z变换与零极点分析

作者:Leobert

痛苦系列 | DSP-03 跨越单位圆:Z变换与零极点分析

文中代码及相关仿真脚本均可在 BlogCode 中获取,本篇代码集中于 DSP/dsp03 目录下。

痛苦系列 DSP 专栏:抛弃死记硬背与纯符号堆砌,从工程中的真实痛点切入,剖析直觉误区,由第一性原理推导数学工具与物理边界,并结合 Python 仿真验证。

前言

在《痛苦系列 01》与《02》中,我们讨论了连续信号的时域离散化,以及借助 DTFT 和 DFT 将时域波形转换到频域进行分析的方法。

在前面的讨论中,我们主要分析有限长序列,以及能够满足常规傅里叶变换收敛条件的序列。对于离散时间序列,绝对可和条件:

∑n=−∞∞∣x[n]∣<∞\sum_{n=-\infty}^{\infty} |x[n]| < \infty

是保证 DTFT 绝对收敛且频谱连续的充分条件,但并非 DTFT 在所有数学意义下存在的必要条件(例如有限能量序列可以在均方意义下定义 DTFT,某些周期信号也可以借助 Dirac 冲激广义函数进行描述)。

本篇为了清晰地讨论级数收敛与系统稳定性,重点关注 Z 变换的绝对收敛域(ROC)。在离散系统分析中,信号或系统的冲激响应并不总是衰减的。例如一个包含正反馈的二阶系统,或者一个指数增长的序列:

x[n]=2nu[n](n=0,1,2,… )x[n] = 2^n u[n] \quad (n = 0, 1, 2, \dots)

如果直接将其代入常规的 DTFT 级数:

X(ejω)=∑n=0∞2ne−jωn=∑n=0∞(2e−jω)nX(e^{j\omega}) = \sum_{n=0}^{\infty} 2^n e^{-j\omega n} = \sum_{n=0}^{\infty} \left(2 e^{-j\omega}\right)^n

由于公比的模长大于 1,级数求和必然发散。此时,仅在单位圆(∣e−jω∣=1|e^{-j\omega}| = 1)上评估的常规傅里叶级数便失去了计算意义。

为了统一分析发散、临界以及稳定的各类离散序列,并深入探究系统的稳定性边界,我们需要将分析范围从一维的单位圆拓展到整个二维复平面。这就是引入 Z 变换(Z-Transform) 的核心原因。

本篇阅读导图:

  1. 从 DTFT 到 Z 变换:引入衰减因子与复变量 zz 的定义。
  2. 收敛域(ROC)的作用:为什么代数表达式必须配合 ROC 才能唯一确定时域系统?
  3. 收敛域的几何形态:从等比数列求和推导因果外域、反因果内域及系统稳定性条件。
  4. 零极点与频率响应:借助复平面曲面模型理解极点与零点对幅频特性的塑造。
  5. 极点分布与时域响应:部分分式展开的物理意义,以及极点坐标对时域波形形态的控制。
  6. 仿真设计与差分方程:以 50Hz 陷波器为例,探讨极点取舍的工程代价,并推导差分方程进行代码验证。

一、 从 DTFT 到 Z 变换:衰减因子与复变量 z

对于指数发散的序列 x[n]=2nu[n]x[n] = 2^n u[n],直接求和会导致发散。一个直接的数学处理思路是:人为给序列乘以一个指数衰减因子 r−nr^{-n}(其中 r>0r > 0),强行将其压制为收敛序列。

设原始序列每步放大 2 倍,我们选取 r=3r = 3(即衰减项 3−n3^{-n}),则加权后的序列变为:

x[n]⋅r−n=2n⋅3−n=(23)nx[n] \cdot r^{-n} = 2^n \cdot 3^{-n} = \left(\frac{2}{3}\right)^n

由于公比模长小于 1,随着 nn 的增大,加权后的序列迅速衰减趋向于 0。

仿真对比:衰减因子对发散信号的压制 拯救发散信号 左图是指数增长的序列 x[n]=1.2nx[n] = 1.2^n;中图是直接求和时的数值发散;右图是在乘以衰减因子 r−nr^{-n}(取 r=1.5r = 1.5)后,序列被有效压制并顺利收敛。

对加权后的收敛序列重新进行傅里叶变换:

X=∑n=−∞∞(x[n]r−n)e−jωn=∑n=−∞∞x[n](rejω)−nX = \sum_{n=-\infty}^{\infty} \left( x[n] r^{-n} \right) e^{-j\omega n} = \sum_{n=-\infty}^{\infty} x[n] \left( r e^{j\omega} \right)^{-n}

将括号内的复数项 rejωr e^{j\omega} 统一定义为复变量 zz:

z=rejωz = r e^{j\omega}

由此便得到了 Z 变换的定义式:

X(z)=∑n=−∞∞x[n]z−nX(z) = \sum_{n=-\infty}^{\infty} x[n] z^{-n}

作者按:zz 是复平面上的一个点。其模长 ∣z∣=r|z| = r 代表径向缩放尺度(衰减/增长率),辐角 ∠z=ω\angle z = \omega 代表角频率。当 r=1r = 1(即点落在单位圆上)时,Z 变换退化为 DTFT。因此,DTFT 只是 Z 变换在单位圆上的一个特例切片。


二、 为什么必须关注收敛域(ROC)

在实际计算中,容易产生一种误区:认为只要通过公式代数化简得到了 X(z)X(z) 的分式表达式,就完全确定了系统。

我们来看一组对比示例。

代数式完全相同的两个不同信号

分别求以下两个时域信号的 Z 变换:

  • 信号 A(因果序列): x1[n]=(0.5)nu[n]={1,  0.5,  0.25,  … }x_1[n] = (0.5)^n u[n] = \{1, \; 0.5, \; 0.25, \; \dots\}
  • 信号 B(反因果序列): x2[n]=−(0.5)nu[−n−1]={…,  −4,  −2,  0}x_2[n] = -(0.5)^n u[-n-1] = \{\dots, \; -4, \; -2, \; 0\}

1. 求解信号 A:

代入定义式:

X1(z)=∑n=0∞(0.5)nz−n=∑n=0∞(0.5z)nX_1(z) = \sum_{n=0}^{\infty} (0.5)^n z^{-n} = \sum_{n=0}^{\infty} \left(\frac{0.5}{z}\right)^n

这是一个公比为 q=0.5zq = \frac{0.5}{z} 的等比数列。该级数收敛的充要条件为公比模长小于 1:

∣q∣=∣0.5z∣<1  ⟹  ∣z∣>0.5|q| = \left|\frac{0.5}{z}\right| < 1 \implies |z| > 0.5

在收敛区域内求和,结果为:

X1(z)=11−0.5z−1=zz−0.5(收敛域:∣z∣>0.5)X_1(z) = \frac{1}{1 - 0.5 z^{-1}} = \frac{z}{z - 0.5} \quad (\text{收敛域:}|z| > 0.5)

2. 求解信号 B:

代入定义式:

X2(z)=∑n=−∞−1−(0.5)nz−nX_2(z) = \sum_{n=-\infty}^{-1} -(0.5)^n z^{-n}

令 m=−nm = -n(mm 从 11 到 ∞\infty):

X2(z)=−∑m=1∞(0.5)−mzm=−∑m=1∞(2z)mX_2(z) = -\sum_{m=1}^{\infty} (0.5)^{-m} z^m = -\sum_{m=1}^{\infty} (2z)^m

该等比数列的公比为 q=2zq = 2z。级数收敛的充要条件同样是模长小于 1:

∣2z∣<1  ⟹  ∣z∣<0.5|2z| < 1 \implies |z| < 0.5

在收敛区域内求和,利用等比数列首项为 2z2z 的求和公式:

X2(z)=−2z1−2z=2z2z−1=zz−0.5(收敛域:∣z∣<0.5)X_2(z) = - \frac{2z}{1 - 2z} = \frac{2z}{2z - 1} = \frac{z}{z - 0.5} \quad (\text{收敛域:}|z| < 0.5)

若改写为负幂次形式,即 11−0.5z−1\frac{1}{1 - 0.5 z^{-1}}。但需要注意,反因果序列的收敛域 ∣z∣<0.5|z| < 0.5 包含了原点 z=0z=0。级数在 z=0z=0 处直接求和的值为 00,采用正幂次形式 zz−0.5\frac{z}{z - 0.5} 在 z=0z=0 处取值为 00,两相吻合;而负幂次形式在 z=0z=0 处则会出现形式上的未定义。


对比计算结果:

X1(z)=zz−0.5(∣z∣>0.5)与X2(z)=zz−0.5(∣z∣<0.5)X_1(z) = \frac{z}{z - 0.5} \quad (|z| > 0.5) \quad \text{与} \quad X_2(z) = \frac{z}{z - 0.5} \quad (|z| < 0.5)

两者的有理函数代数表达式完全一致,但对应的时域序列一个因果且衰减,另一个反因果且发散。

作者按:脱离了收敛域(ROC),单独的 Z 变换代数表达式是不完备的。代数式描述了极点的位置,而 ROC 则决定了时域信号是向未来延展还是向过去延展,二者共同确定了系统的因果性与稳定性。


三、 收敛域的几何形态与稳定性条件

收敛域在复平面上的几何形状并非随机产生,而是直接由等比级数公比模长小于 1 的条件决定:

  1. 因果序列(右边序列,n≥0n \ge 0):

    • 展开项中含 z−nz^{-n},即 zz 位于分母;
    • 公比形式为 q∝1zq \propto \frac{1}{z};
    • 为使 ∣q∣<1|q| < 1,要求分母模长足够大,即 ∣z∣>R|z| > R;
    • 收敛域表现为某个圆盘向外的开阔区域。
  2. 反因果序列(左边序列,n<0n < 0):

    • 展开项中含 z∣n∣z^{|n|},即 zz 位于分子;
    • 公比形式为 q∝zq \propto z;
    • 为使 ∣q∣<1|q| < 1,要求分子模长足够小,即 ∣z∣<R|z| < R;
    • 收敛域表现为某个圆盘向内的区域。
  3. 双边序列:

    • 同时包含正负时间项,收敛域一般为内外极点之间的圆环区域 R1<∣z∣<R2R_1 < |z| < R_2(边界可能根据信号具体情况退化)。

系统 BIBO 稳定的充要条件

线性时不变系统(LTI)满足 BIBO(有界输入有界输出)稳定的充要条件是:其冲激响应绝对可和:

∑n=−∞∞∣h[n]∣<∞\sum_{n=-\infty}^{\infty} |h[n]| < \infty

由于在单位圆上(∣z∣=1|z| = 1),有 ∣z−n∣=1|z^{-n}| = 1,因此单位圆上的 Z 变换级数绝对收敛,当且仅当冲激响应绝对可和。

由此可得,LTI 系统满足 BIBO 稳定的充要条件是其系统函数的收敛域完整包含单位圆:

{z:∣z∣=1}⊆ROC{H(z)}\{z : |z| = 1\} \subseteq \text{ROC}\{H(z)\}

对于因果有理系统,由于其收敛域是从最外侧极点向外延伸的开阔区域,这一条件又等价于:其全部未被消去的极点严格位于单位圆内部(∣pk∣<1|p_k| < 1)。

仿真对比:不同系统的收敛域划分 收敛域可视化 左图:因果稳定系统,极点在圆内,ROC 包含单位圆并向外发散;中图:反因果系统,ROC 向内收缩且未包含单位圆;右图:双边系统,ROC 位于两圆之间。


四、 零极点与系统频率响应

将离散系统的传递函数写为零极点形式:

H(z)=B(z)A(z)=b0(z−z1)(z−z2)…(z−zM)(z−p1)(z−p2)…(z−pN)H(z) = \frac{B(z)}{A(z)} = \frac{b_0 (z - z_1)(z - z_2)\dots(z - z_M)}{(z - p_1)(z - p_2)\dots(z - p_N)}

  • 分子为 0 的根 zkz_k 称为零点(Zeros);
  • 分母为 0 的根 pkp_k 称为极点(Poles)。

1. 复平面上的曲面模型

为了直观理解零极点如何塑造系统的频响特性,我们可以将复平面上的模值 ∣H(z)∣|H(z)| 视作一张受零极点约束的三维曲面:

  1. 极点:分母趋向于 0,使曲面向上隆起形成高耸的山峰。极点靠近单位圆时,会在对应频率处产生明显的谐振或通带放大;
  2. 零点:分子为 0,使曲面高度降为零。零点落在单位圆上时,会将对应频率的响应完全压低至零(陷波);
  3. 频率响应(DTFT):正是沿着单位圆周 ∣z∣=1|z| = 1 截取的一圈曲面高度变化。

三维曲面:复平面零极点曲面与单位圆截面频响 3D零极点曲面 图中山峰由极点顶起,青色粗线为沿单位圆截取的频率响应曲线。

2. 零点与极点的相互影响

零极点对频率响应的作用可以用复数矢量的几何距离来解释。对于单位圆上的任意一点 ejωe^{j\omega}:

∣H(ejω)∣=∣b0∣∏k=1M∣ejω−zk∣∏k=1N∣ejω−pk∣|H(e^{j\omega})| = |b_0| \frac{\prod_{k=1}^M |e^{j\omega} - z_k|}{\prod_{k=1}^N |e^{j\omega} - p_k|}

即该频率点的响应幅度,等于该点到所有零点的距离连乘,除以到所有极点的距离连乘。

当零点与极点具有相同或相近的辐角、但模长不同时,它们会共同塑造该频率附近的响应形态:

仿真对比:零点对极点共振峰的抑制 零极点相杀 左图为纯极点系统的频响尖峰;右图为在同角度引入零点后,零点将对应频率处的幅度压低为 0,消除了共振。

零点位于单位圆上时,会将对应数字角频率处的响应压低为 0;而靠近该零点的极点,则有助于收窄陷波宽度,使远离陷波中心的频率响应更快地回升平坦。

需要澄清的是:只有当零点与极点位于完全相同的复数位置时,才构成严格的代数极零相消。零点与极点仅处于同一角度但模长不同,并不发生代数约分,而是通过几何距离的比值变化共同影响频带特性。


五、 极点分布与时域冲激响应

极点不仅在频域上塑造了滤波器的幅频形状,在时域上,它更直接决定了系统冲激响应 h[n]h[n] 的衰减与振荡特性。

1. 逆 Z 变换与并联基本项

严格的逆 Z 变换通过复平面上的闭合围线积分定义:

h[n]=12πj∮CH(z)zn−1dzh[n] = \frac{1}{2\pi j} \oint_C H(z) z^{n-1} dz

其中积分路径位于 H(z)H(z) 的收敛域内,并按逆时针方向围绕原点积分。

在实际分析中,更通用且直观的方法是部分分式展开(Partial Fraction Expansion)。对于极点互异、且分子阶数小于分母阶数的严格真分式有理系统,传递函数可以拆解为若干一阶分式之和:

H(z)=∑k=1NAk1−pkz−1H(z) = \sum_{k=1}^N \frac{A_k}{1 - p_k z^{-1}}

(若系统包含直接通路项,还需增加常数项 DD;若存在重极点,则需引入更高阶的分式项)。

这一展开说明:极点互异的有理系统,其时域冲激响应可以看作多个一阶基本子系统(单极点模态)响应的线性叠加。对单个因果子系统求逆变换得到:

11−pkz−1⟷因果pknu[n]\frac{1}{1 - p_k z^{-1}} \quad \stackrel{\text{因果}}{\longleftrightarrow} \quad p_k^n u[n]

因此,每个极点 pkp_k 的位置分别决定了一个独立模态的时域表现。

2. 极点位置与时域波形对应关系

设极点坐标为 p=rpejωpp = r_p e^{j\omega_p}:

极点位置几何特征时域响应的典型形态(因果系统)系统特性
0<p<10 < p < 1实轴右侧,圆内pnu[n]p^n u[n],单调指数衰减衰减模态
−1<p<0-1 < p < 0实轴左侧,圆内pnu[n]p^n u[n],正负交替且幅值衰减交替衰减模态
p=re±jω0,r<1p = r e^{\pm j\omega_0}, r < 1复平面上下共轭,圆内rncos⁡(ω0n+ϕ)u[n]r^n \cos(\omega_0 n + \phi) u[n],带指数包络的振荡阻尼振荡模态
p=e±jω0p = e^{\pm j\omega_0}单位圆边界 $p= 1$
**$p> 1$**单位圆外侧 $

注:表中 ϕ\phi 为相位常数,波形的具体幅值与相位由零点分布和激励条件决定。特别需要区分的是:单位圆上的单极点虽能产生有界的等幅持续振荡,但其冲激响应不满足绝对可和条件,且在受到同频正弦波输入时输出会线性增长发散,因此严格来说不满足 BIBO 稳定性。

仿真对比:极点位置变化对应的时域响应 极点越狱 左图(r=0.95r=0.95,圆内):能量自然衰减收敛;中图(r=1.0r=1.0,圆上):等幅持续振荡;右图(r=1.05r=1.05,圆外):幅值迅速发散溢出。


六、 仿真设计:50Hz 陷波器与差分方程实现

在尚未系统展开 FIR 与 IIR 滤波理论之前,我们通过一个 50Hz 陷波器的极简设计,来演示前面讨论的零极点几何关系是如何直接转化为工程代码的。这不仅是一次“复平面图纸到硬件实现”的演练,更展示了 Z 变换如何回答“时域差分方程系数从何而来”的核心问题。

设计设定

假定系统采样率为 fs=1000 Hzf_s = 1000\text{ Hz}。我们希望滤除信号中存在的 50Hz 干扰,同时尽量保证其他频率信号的幅值不受影响。

1. 计算目标角频率

采样率 fs=1000 Hzf_s = 1000\text{ Hz} 对应角频率 2π2\pi。因此 50Hz 对应的数字角频率为:

ω0=2πf0fs=2π501000=0.1π rad/sample\omega_0 = 2\pi \frac{f_0}{f_s} = 2\pi \frac{50}{1000} = 0.1\pi\text{ rad/sample}

2. 放置零点以形成陷波点

为了在 50Hz 处实现完全抑制,在单位圆对应的角度上配置一对共轭零点(模长为 1,角度为 ±0.1π\pm 0.1\pi):

z1=ej0.1π,z2=e−j0.1πz_1 = e^{j 0.1\pi}, \quad z_2 = e^{-j 0.1\pi}

分子多项式展开为:

B(z)=(1−z1z−1)(1−z2z−1)=1−2cos⁡(0.1π)z−1+z−2B(z) = (1 - z_1 z^{-1})(1 - z_2 z^{-1}) = 1 - 2\cos(0.1\pi)z^{-1} + z^{-2}

3. 放置极点以收窄阻带

若只使用这一对零点,零点引起的衰减会波及较宽的邻近频带。

为了收窄陷波宽度,在完全相同的角度方向、略微靠内的位置(取半径 r=0.95r = 0.95)放置一对共轭极点:

p1=0.95ej0.1π,p2=0.95e−j0.1πp_1 = 0.95 e^{j 0.1\pi}, \quad p_2 = 0.95 e^{-j 0.1\pi}

分母多项式展开为:

A(z)=(1−p1z−1)(1−p2z−1)=1−2(0.95)cos⁡(0.1π)z−1+0.952z−2A(z) = (1 - p_1 z^{-1})(1 - p_2 z^{-1}) = 1 - 2(0.95)\cos(0.1\pi)z^{-1} + 0.95^2 z^{-2}

在偏离 50Hz 的频带上,极点与零点距离接近,幅值相互抵消,使得通带响应迅速恢复平坦。

4. 极点参数的工程取舍:频带宽度与时域代价

在这里,可能会产生一个实际追问:为什么极点半径选 r=0.95r = 0.95?如果为了让陷波凹槽更窄、更陡峭,直接选 r=0.999r = 0.999 是否更好?

在实际工程设计中,极点位置的选择是一个典型的综合权衡(Trade-off):

  • 频域陡度 vs 时域瞬态振铃(Ringing): 极点模长 rr 越逼近 1,陷波凹槽确实越狭窄,对 50Hz 以外信号的误伤越小;但根据前文的模态分析,冲激响应衰减速度由 rnr^n 决定。若取 r=0.999r = 0.999,系统冲激响应衰减极慢。一旦输入信号中混入脉冲或台阶阶跃扰动,时域会拖出长达数百甚至上千个采样点的高频振荡(振铃),系统需要很长时间才能恢复平稳;
  • 定点硬件截断与极点外漂(有限字长效应): 在 PC 端的双精度浮点环境下,r=0.999r = 0.999 是稳定的;但在许多基于 16 位定点 DSP 或低成本微控制器的嵌入式系统中,多项式系数必须定点截断。极点如果紧贴着单位圆、缺乏足够的安全裕量(Safety Margin),极微小的量化舍入误差就可能将极点踢出单位圆(∣p∣≥1|p| \ge 1),导致硬件系统一通电就自激震荡或输出顶死满轨。

工程中选择 r=0.95r = 0.95,正是频域过渡带宽度、时域收敛速度与硬件数值安全三者权衡折中的结果。

5. 差分方程推导与时延实现

得到系统函数后,需要将其转化为可在代码中递推执行的差分方程。

传递函数表示为:

H(z)=Y(z)X(z)=1+b1z−1+b2z−21+a1z−1+a2z−2H(z) = \frac{Y(z)}{X(z)} = \frac{1 + b_1 z^{-1} + b_2 z^{-2}}{1 + a_1 z^{-1} + a_2 z^{-2}}

其中 z−1z^{-1} 对应时域中的单步时延操作(z−1X(z)↔x[n−1]z^{-1} X(z) \leftrightarrow x[n-1])。交叉相乘后移项整理:

y[n]=x[n]+b1x[n−1]+b2x[n−2]−a1y[n−1]−a2y[n−2]y[n] = x[n] + b_1 x[n-1] + b_2 x[n-2] - a_1 y[n-1] - a_2 y[n-2]

多项式系数分别为:

  • b1=−2cos⁡(0.1π)b_1 = -2\cos(0.1\pi)
  • b2=1b_2 = 1
  • a1=−2×0.95cos⁡(0.1π)a_1 = -2 \times 0.95 \cos(0.1\pi)
  • a2=0.952a_2 = 0.95^2

这就是 scipy.signal.lfilter(b, a, x) 在内部递推执行的标准差分方程形式。

6. 直流增益归一化考量

代入直流处(ω=0\omega = 0,即 z=1z = 1)计算当前系统的幅度响应:

H(1)=B(1)A(1)=2−2cos⁡(0.1π)1−2(0.95)cos⁡(0.1π)+0.952≈1.02507H(1) = \frac{B(1)}{A(1)} = \frac{2 - 2\cos(0.1\pi)}{1 - 2(0.95)\cos(0.1\pi) + 0.95^2} \approx 1.02507

计算可得 20log⁡10∣H(1)∣≈0.215 dB20\log_{10}|H(1)| \approx 0.215\text{ dB},直流增益存在微小的抬升。若需要使直流增益精确归一化为 1(0 dB),可在输入端添加缩放因子:

G=1H(1)=A(1)B(1)≈0.97554G = \frac{1}{H(1)} = \frac{A(1)}{B(1)} \approx 0.97554

这一校正保证了直流增益严格为 0 dB,避免滤波后信号整体幅度发生系统性放大。

仿真对比:50Hz 陷波器零极点布局、频响与滤波效果 50Hz陷波器仿真验证 左图为零极点复平面布局;中图为系统频响曲线,在 50Hz 处呈现明显的凹陷;右图为时域仿真,合成波形经过滤波后滤除了 50Hz 干扰成分。


七、 总结

Z 变换通过引入径向缩放因子,将原本局限于单位圆的傅里叶分析拓展到了整个复平面。

  • 收敛域(ROC) 是连接代数多项式与时域物理系统的桥梁,界定了系统的因果性与稳定性;
  • 极点 决定了系统的固有模态与稳定性边界,极点全部落在单位圆内是因果系统 BIBO 稳定的充要条件;
  • 零极点分布 直观反映了系统在各频段的响应特征,通过合理配置零极点的几何位置,可以直接推导出对应的时域差分方程。

Z 变换与傅里叶变换的工程分工

在实际工程中,很多初学者容易混淆 Z 变换与傅里叶变换的使用场景。其实二者有着清晰的分工:

  • 运行期(Runtime)看 FFT:FFT 吃进实时数据流、吐出离散频谱,直接用于波形监测、特征识别与频域滤波;
  • 设计期(Design Time)看 Z 变换:在工程代码跑起来的时候,硬件几乎不会去计算连续复变函数 X(z)X(z)。Z 变换的真正角色,是工程师在写代码之前,用来把频域滤波意图翻译成时域差分方程系数、并在部署前验算系统稳定边界与量化容错的“离线审查图纸”。

在下一篇中,我们将进一步讨论数字滤波器的具体设计方法,聚焦于 FIR 滤波器中的线性相位特性与窗函数的选择权衡。


附录:本篇仿真代码

本篇涉及的仿真脚本可在代码仓库中获取:DSP/dsp03/pain_series_03_demo.py。

# 依赖安装
pip install numpy matplotlib scipy

# 运行仿真实验
python DSP/dsp03/pain_series_03_demo.py