ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

z变换与ROC收敛域:反变换、系统函数与稳定性

z变换与ROC收敛域:反变换、系统函数与稳定性 信号与系统这门课走到离散这条线之后z变换和z域分析基本就是绕不过去的一道坎。它的定义式短得吓人X(z)Σ x[n]z^(−n)一个求和符号配一个负指数因子看上去比DTFT还朴素。真正让人翻车的从来不是这个式子的形式而是这个无穷级数到底在哪些z上收敛——也就是收敛域ROC。我带过几轮习题课见过太多人能把部分分式展开算得飞快却在最后一步把a^n u[n]和−a^n u[−n−1]写反根源就是对ROC没建立起直觉。这篇内容适合三类人正在学这门课、被作业和考试按在地上摩擦的同学已经学过但只记得公式、想重新把逻辑理顺的人以及做数字信号处理、需要拿H(z)判断滤波器稳不稳的工程人。下面我把定义、变换对、ROC、性质、反变换、差分方程求解和工程落地这几块按我自己理解的顺序拆开讲一遍重点放在为什么这么规定和哪里最容易错。1. 从DTFT的短板说起z变换到底补上了哪块拼图1.1 傅里叶分析为什么会在u[n]这类序列上失灵离散时间傅里叶变换的定义是X(e^{jω})Σ x[n]e^{−jωn}它要求这个无穷级数绝对可和也就是Σ|x[n]|∞。这个条件对很多教科书里天天见的序列是不成立的。最典型的就是单位阶跃u[n]它的模一直是1求和直接发散再比如a^n u[n]只要|a|≥1模随n指数增长更是彻底没戏。但物理意义上这些信号并没有不存在只是我们用的那把尺子太苛刻了。傅里叶变换相当于把信号投影到单位圆上的一族复指数探针的模恒为1遇到增长的信号就只能眼睁睁看着积分炸掉。要救它唯一的办法是让探针本身带一个可调的衰减包络这个包络就是z变换里那个z的来历。1.2 一个实指数加权因子换来的收敛自由度把单位圆上的e^{jω}推广成zr·e^{jω}那么z^(−n)r^(−n)·e^{−jωn}。相比DTFT这里多出来的就是r^(−n)这个实指数加权。对于右边序列n≥0才有值只要r取得足够大r^(−n)就能把任何指数增长的x[n]压下去让求和收敛对于左边序列n0才有值n是负的r^(−n)变成r^{|n|}这时候反而需要r足够小才能收敛。你看同一个r对右边序列和左边序列的作用方向是相反的这就是为什么右边序列的ROC一定在某个圆的外面左边序列的ROC一定在某个圆的里面。理解这一层后面背ROC规则就变成了一句废话式的自然结论。另外当r1时z变换退化成DTFT所以DTFT存在这件事在z域里被翻译成ROC包含单位圆这也是判断系统稳定性的全部依据后面第6节会展开。1.3 双边和单边两套定义各自的用武之地书上会给两个定义。双边z变换是X(z)Σ_{n−∞}^{∞}x[n]z^(−n)求和范围铺满整条时间轴单边z变换是X(z)Σ_{n0}^{∞}x[n]z^(−n)只管n≥0的部分。很多人第一次看会以为单边是双边的简化版随便挑一个用就行这个想法会让你在解差分方程时吃大亏。双边的服务对象是序列本身研究系统的频率响应、卷积、稳定性时用它因为它保留了两侧信息单边的服务对象是带初始条件的因果问题它的位移性质里会天然带着x[−1]、x[−2]这些初值项这正是解差分方程时能把初始条件塞进方程的唯一入口。有个好用的判据当序列是因果的也就是n0时x[n]0两个定义给出的结果完全一样。我在做题时会先扫一眼有没有初始条件、有没有n0的样子再决定用哪套这一步花五秒钟能省掉后面十分钟的返工。2. 把定义式拆开算几组必背变换对背后的同一套推导2.1 几何级数求和是所有变换对的地基如果你把所有常见信号的z变换推导过程翻一遍会发现它们九成以上都是同一个动作把定义式凑成等比数列然后套几何级数求和公式Σ_{n0}^{N}a^n(1−a^{N1})/(1−a)当|a|1时极限是1/(1−a)。以a^n u[n]为例X(z)Σ_{n0}^{∞}(a z^{−1})^n公比是a z^{−1}收敛条件是|a z^{−1}|1也就是|z||a|结果是1/(1−a z^{−1})。这里有个很多人忽略的细节收敛条件的来源不是公式要求而是这个等比级数本身只在公比模小于1时才收敛。所以|z||a|是严格不等式z落在|z||a|这个圆上时|a z^{−1}|1级数部分和一直在振荡不趋近于任何极限这是真正的发散不是边界上也算一个。做题时如果在za处硬代公式得到的1/(1−1)是无穷大它对应的是极点而不是函数值这两个概念千万别混。2.2 从δ[n]到a^n u[n]四组核心变换对的推导单位冲激δ[n]是最省事的定义式里只有n0那一项z^01所以X(z)1在整个z平面包括z0和无穷远都收敛。稍微挪一下位置δ[n−m]m0得到的是z^{−m}注意这时z0变成了一个m阶极点ROC把z0排除掉了——这就是有限长右边序列的ROC是除z0外的整个平面这句话的来历。单位阶跃u[n]直接套前面的结果令a1得到1/(1−z^{−1})ROC是|z|1。至于n·a^n u[n]正经推法是利用z域微分性质也可以直接对Σ a^n z^{−n}1/(1−a z^{−1})两边关于z求导左边会掉出−Σ n a^n z^{−n−1}−(1/z)Σ n a^n z^{−n}右边是−a z^{−2}/(1−a z^{−1})²两边整理完得到X(z)a z^{−1}/(1−a z^{−1})²。你自己动手推一遍比盯着结果背十遍都记得牢因为你会顺便记住分母是平方、分子多了一个z^{−1}这两个特征在反变换时是识别重根的信号。2.3 右边、左边、双边序列的结果对照下面这张表建议直接手抄一遍抄的过程中留意每一行的ROC是怎么随着序列方向变化的。序列 x[n]z变换 X(z)收敛域 ROCδ[n]1全z平面δ[n−m], m0z^{−m}全平面除去 z0u[n]1/(1−z^{−1})|z|1a^n u[n]1/(1−a z^{−1})|z||a|−a^n u[−n−1]1/(1−a z^{−1})|z||a|n·a^n u[n]a z^{−1}/(1−a z^{−1})²|z||a|cos(ω₀n)u[n](1−cosω₀ z^{−1})/(1−2cosω₀ z^{−1}z^{−2})|z|1sin(ω₀n)u[n]sinω₀ z^{−1}/(1−2cosω₀ z^{−1}z^{−2})|z|1第四行和第五行值得盯着看三十秒它们的X(z)表达式一模一样只有ROC不同。这不是排版偷懒而是在告诉你一件根本性的事——z变换的完整身份是表达式ROC这个二元组少一个都是残缺的。cos和sin这两行可以现场验证把e^{jω₀n}u[n]和e^{−jω₀n}u[n]的变换结果加起来除以2通分后分母就是1−2cosω₀ z^{−1}z^{−2}分子虚部消掉剩下实部整个过程顺手就把欧拉公式和线性性质都用了一遍。3. 收敛域才是z变换的真正身份信息3.1 ROC的四条硬规则与环形结构ROC的规则可以压缩成四条我用自己习惯的说法列出来。第一ROC一定是以原点为中心的环形区域特殊情况可以退化成圆外、圆内或者整个平面但绝不会是两个不相邻的环形拼起来——因为使级数收敛的|z|取值范围本身就是一段连续区间不可能断成两截。第二ROC内部不能包含任何极点。理由很直接极点是X(z)模趋于无穷的位置而收敛要求|X(z)|∞二者天然矛盾反过来如果所有极点都在某个环外面那么把环缩到贴着最外层极点也是可行的。第三右边序列的ROC向无穷远延伸形态是最外层极点之外左边序列的ROC向内收缩到原点形态是最内层极点之内。第四双边序列的ROC夹在最外层极点和最内层极点之间如果最外层极点的模不大于最内层极点的模这个双边序列的z变换压根不存在。这四条里第一条和第二条是性质第三、第四条是怎么用它考试和应用里真正高频的是后两条。3.2 同一个有理式为什么会对应两个完全不同的序列假设有人只给你F(z)1/(1−0.5z^{−1})让你求逆变换。这个题目本身是无解的因为它缺了ROC。若ROC是|z|0.5对应的是右边序列0.5^n u[n]若ROC是|z|0.5对应的是左边序列−0.5^n u[−n−1]。我用数值求和的方式把这件事摊开给人看过效果比讲十遍都强取x₁[n]0.5^n u[n]、x₂[n]−0.5^n u[−n−1]分别在z0.6和z0.4这两个实数点上算Σ x[n]z^{−n}。z0.6时x₁收敛、x₂发散z0.4时正好反过来。也就是说|z|0.5这个圆是分水岭圆外的点只认右边序列圆内的点只认左边序列。这个实验你花两分钟就能在Python里跑一遍比背结论有用得多。同样的逻辑放到1/(1−1.5z^{−1}0.5z^{−2})这类双极点式子上就能枚举出三种可能两个极点都在ROC之外右边、都在之内左边、一个在外一个在内双边环形三种情况对应三个完全不同的时域序列。3.3 从零极点图直接读出ROC与稳定性做完变换我习惯立刻画一张零极点图把X(z)化成z的正幂有理式分母的根是极点画叉分子的根是零点画圈然后以原点为圆心过最外层极点画一个大圆。右边序列的ROC就是这个圆之外的区域图上涂个阴影就行。这套动作在系统分析里更值钱一个LTI系统的系统函数H(z)它的极点模决定了冲激响应是衰减还是发散。判据只有两条但必须同时用因果性要求ROC在某个圆之外且延伸到无穷远等价于最外层极点在某个有限半径内且ROC包含∞稳定性要求ROC包含单位圆因为单位圆上就是DTFT存在且有界才叫稳定。两条一起用得到工程上最常挂在嘴边的那句话因果稳定的离散LTI系统全部极点严格位于单位圆内部。注意严格两个字极点恰好落在单位圆上时系统是临界振荡的冲激响应不衰减输入含有该频率成分时输出会无界增长这在理论上就不满足有界输入有界输出稳定。做滤波器时把极点贴着单位圆放是在拿稳定性换选择性这条边界踩不得。4. 性质不是拿来背的是用来省算力的4.1 线性、移位、z域尺度变换的适用时机线性的用法很直白a₁x₁[n]a₂x₂[n]对应a₁X₁(z)a₂X₂(z)但有个坑要提醒结果的ROC至少包含两个原ROC的交集实际可能更大。原因是两个分量在某个区域各自发散但加起来恰好抵消了比如1/(1−z^{−1})和−1/(1−z^{−1})相加得0ROC直接扩到全平面。做题时写ROC为两者交集一般不给错但知道它有可能会被放大能帮你在对答案时不被吓一跳。移位性质x[n−n₀]对应z^{−n₀}X(z)ROC基本不变只是在n₀0时会在z0处增加零点、在无穷远处增加极点所以严格来说可能增删z0和∞这两点。z域尺度变换是a^n x[n]对应X(z/a)ROC的半径整体乘上|a|这条性质在降低考试难度的同时也很实用遇到0.8^n cos(ω₀n)这种带阻尼的正弦不用重新推直接拿cosω₀n的变换把z换成z/0.8即可代价只是ROC从|z|1变成|z|0.8。4.2 卷积定理与差分方程的代数化时域卷积对应z域相乘这条性质是整个z域分析里最值钱的一条。推导也就三行Σ_n(Σ_k x₁[k]x₂[n−k])z^{−n}把两个求和交换次序令mn−k内层变成Σ_m x₂[m]z^{−m}外层是Σ_k x₁[k]z^{−k}两个X乘起来就完事。它的价值在于把卷积这个又臭又长的操作变成两个有理式的乘法而乘法是初中生都会的事。更进一步一个线性常系数差分方程y[n]Σ b_k x[n−k]−Σ a_k y[n−k]两边做z变换之后会变成一个关于Y(z)和X(z)的代数方程整理一下就得到Y(z)H(z)X(z)其中H(z)(Σ b_k z^{−k})/(1Σ a_k z^{−k})。整个过程里差分方程这个递推关系被彻底翻译成了传递函数这个有理式把求解问题降维成了代数运算。工程上所有的滤波器设计工具本质上都是在玩弄这个H(z)的分子分母系数。4.3 z域微分和累加性质的实战价值z域微分性质写出来是n·x[n]对应−z·dX(z)/dz它的用途是处理序列前面乘了n的情况。前面推n·a^n u[n]用的就是这条路。这条性质还能连续用比如n²a^n u[n]就是对X求两次导再乘z²注意符号虽然考场上不常出现但理解它能让你在遇到任何多项式×指数型序列时都有底气。累加性质对应的是x[n]的累加和结果是X(z)/(1−z^{−1})看着眼熟吧就是乘了一个u[n]的变换。它和时域卷积定理是一回事累加本身就是和u[n]做卷积所以z域上自然就是乘以u[n]的变换。我在做滤波器时会用一个反向应用如果不小心在某个地方漏了一级积分离散域就是累加现象往往是低频增益多了一个无限大的极点频率响应在直流附近直接飙到天上这种坏味道可以从零极点图上瞬间识别出来——多出来的那个z1极点就是罪魁祸首。4.4 初值定理与终值定理的成立前提初值定理对于因果序列x[0]lim_{z→∞}X(z)。这条很简单把定义式展开只有当n0时z^01其他项都趋于0所以极限就剩下x[0]。但有个隐含前提X(z)在无穷远处的极限必须存在且有限。如果X(z)1z^{−1}极限是1对应x[0]1同时z^{−1}那一项告诉你在n1处还有一个冲激这没关系。可如果X(z)z极限是无穷大这时候x[n]里含有n0的分量因果前提就不成立了硬套会得到荒谬的结果。终值定理lim_{n→∞}x[n]lim_{z→1}(1−z^{−1})X(z)它的前提比初值定理严得多——(1−z^{−1})X(z)的全部极点必须严格在单位圆内。换句话说X(z)的极点要么在单位圆内要么只能在z1处有一个一阶极点。很多人拿cos(ω₀n)u[n]去套这条定理得到(1−z^{−1})X(z)在z1处不为零算出一个有限数然后坚信序列收敛。这是错的。cos(ω₀n)的极点在单位圆上但不在z1终值定理根本不适用序列永远在振荡。我个人的习惯是用终值定理之前先把X(z)的极点模逐个打印出来看一眼只要有一个模大于等于1且不等于1直接放弃这条定理。5. 反变换三条路部分分式、幂级数、留数5.1 部分分式展开的手算流程与X(z)/z技巧反变换手算最常用的就是部分分式法但直接对X(z)展开是个陷阱正确做法是对X(z)/z展开展开完再乘回z。原因在于X(z)习惯写成z^{−1}的有理式直接展开得到的项是A_k/(1−p_k z^{−1})逆变换是A_k p_k^n u[n]看着也行但当分子分母同阶时会出现常数项k对应δ[n]处理起来容易漏。用X(z)/z的写法得到的项是A_k z/(z−p_k)而z/(z−p_k)的逆变换恰好是p_k^n u[n]形式干净、不用记特例。具体流程分四步第一步把X(z)写成z^{−1}有理式分子分母同乘z的适当幂次变成z的正幂有理式第二步确认是真分式分子次数小于分母次数不是就先做多项式除法第三步对X(z)/z做部分分式用留数法求系数A_k[(z−p_k)X(z)/z]|_{zp_k}第四步乘回z按ROC选择p_k^n u[n]或−p_k^n u[−n−1]。举个我课上必讲的例子X(z)1/((1−0.5z^{−1})(1−0.8z^{−1}))两个极点分别在0.5和0.8。X(z)/zz/((z−0.5)(z−0.8))系数A0.5/(0.5−0.8)−5/3B0.8/(0.8−0.5)8/3所以X(z)−5/3·z/(z−0.5)8/3·z/(z−0.8)。ROC是|z|0.8时x[n]−5/3·0.5^n8/3·0.8^nn≥0。顺手验一下n0−5/38/31和长除法首项一致安心。5.2 长除法在数值验证和初值检查里的作用长除法看起来笨但它有两个别的方法替代不了的价值。第一个是快速拿到前几个样值。右边序列就把X(z)按z^{−1}降幂排列做除法商的多项式系数直接就是x[0]、x[1]、x[2]……左边序列反过来按z的升幂除。做作业时先除两三项就知道自己后面部分分式的系数有没有算错这比从头再算一遍快得多。第二个价值更有意思数字滤波器在硬件上跑的时候它的运算过程本身就是在做长除法。直接型结构的差分方程递推等价于把X(z)按z^{−1}逐项除下去输出的每个采样值就是商的一个系数。所以长除法不是考试技巧它是滤波器实现的数学原型。我个人在写定点代码前习惯先手算五六个样值和理论值对齐这能帮我提前发现系数抄错、符号搞反这类低级但致命的错误。用长除法时有一个细节容易出错商的排列顺序和ROC绑定。ROC在圆外对应往负幂方向排因果ROC在圆内对应往正幂方向排反因果排反了会得到一堆看似合理的错误系数。5.3 用Python给手算结果做交叉验证手算容易出错我推荐用几行代码做交叉验证把出错的概率压到接近零。下面这段脚本用上面那个双极点的例子同时算出部分分式系数、前若干个冲激响应样值并用递推法独立生成一遍。import numpy as np import scipy.signal as sig # X(z) 1 / ((1 - 0.5 z^-1)(1 - 0.8 z^-1)) b np.array([1.0, 0.0, 0.0]) a np.array([1.0, -1.3, 0.4]) # 部分分式z^-1 形式 r, p, k sig.residuez(b, a) print(留数 r , np.round(r, 4)) # 期望 [-1.6667, 2.6667] print(极点 p , np.round(p, 4)) # 期望 [0.5, 0.8] print(直接项 k , np.round(k, 4)) # 期望 [] # 递推法生成冲激响应 n np.arange(8) imp np.zeros(8); imp[0] 1.0 h_rec sig.lfilter(b, a, imp) print(递推 h[n] , np.round(h_rec, 4)) # 用部分分式结果直接合成 h_par sum(r[i] * p[i] ** n for i in range(len(p))) print(合成 h[n] , np.round(h_par, 4)) # 频率响应 w, H sig.freqz(b, a, worN512) print(直流增益 |H(1)| , round(np.abs(H[0]), 4))跑出来两组h[n]会完全重合这时候你对手算结果的信心就建立起来了。再补一个实验验证ROC的位置。把同一个序列分别除以r^nr取0.79和0.81做有限项求和你会看到0.79那一侧数值爆到十几位数、0.81那一侧稳定在某个有限值附近。这个亲眼看见分界的体验比任何文字说明都管用。n np.arange(0, 4000) x (-5/3) * 0.5 ** n (8/3) * 0.8 ** n for rr in [0.79, 0.81]: s np.sum(x / rr ** n) print(fr {rr}, 部分和 {s:.6g})5.4 留数法适合处理重极点和理论推导留数法的公式是x[n](1/2πj)∮X(z)z^{n−1}dz等于X(z)z^{n−1}在ROC内所有极点处的留数之和。它的优势在于处理重极点时规则清晰且更适合做一般的理论推导。单极点的留数计算就是(z−p)X(z)z^{n−1}在zp处的值m阶极点则需要求m−1次导数再除以阶乘手算麻烦但机械。实际做题时我基本只用留数法处理分母有平方或者高次的情况其余一律用部分分式。另外提醒一句用留数法时选取的闭合围线必须整个落在ROC内部围线取错方向会导致结果符号全错这类错误在考卷上很常见但很难自查我的办法是算出最前面两个样值跟长除法对一下对上了再往下写。6. 差分方程、系统函数和工程实现的三次对号入座6.1 单边z变换怎样把初始条件一起带进方程单边z变换的移位性质是它存在的全部理由。x[n−1]对应z^{−1}X(z)x[−1]x[n−2]对应z^{−2}X(z)z^{−1}x[−1]x[−2]规律是每多移一位就多带一批初值项。举个完整的例子解y[n]−0.5y[n−1]x[n]输入x[n]u[n]初始条件y[−1]1。两边做单边z变换Y(z)−0.5(z^{−1}Y(z)y[−1])1/(1−z^{−1})代入y[−1]1并整理得到Y(z)[1/(1−z^{−1})0.5]/(1−0.5z^{−1})拆成两项后得到y[n]2−(0.5)^{n1}n≥0。验算一下y[0]0.5×111.5公式给2−0.51.5对上了y[1]0.5×1.511.75公式给2−0.251.75也对。这一步的副产品是零输入响应和零状态响应的分离1/((1−z^{−1})(1−0.5z^{−1}))那部分由输入驱动逆变换是2−(0.5)^n属于零状态响应0.5/(1−0.5z^{−1})那部分由初值驱动逆变换是(0.5)^{n1}属于零输入响应。两者相加正好是上面的结果。能一眼看出这两块的来源说明你对单边变换的理解到位了。import numpy as np import scipy.signal as sig # y[n] - 0.5 y[n-1] x[n], x[n]u[n], y[-1]1 x np.ones(12) zi np.array([0.5 * 1.0]) # 对应 0.5*y[-1] y, zf sig.lfilter([1.0], [1.0, -0.5], x, zizi) n np.arange(12) print(递推解:, np.round(y, 4)) print(解析解:, np.round(2 - 0.5 ** (n 1), 4))6.2 极点位置、因果性与稳定性的连线把因果性和稳定性两个判据并列成表做题和做设计时照着查最快ROC形态因果性稳定性典型应用场景最外层极点之外含∞因果需全部极点模1才稳定实时滤波器、递推实现最内层极点之内含0反因果需全部极点模1才稳定后向平滑、离线处理环形区域非因果需包含单位圆零相位滤波、双向处理单位圆是边界不确定临界不稳定纯振荡器、临界谐振表里第三行是我在实际工作中用得最多的一行。做离线数据处理时如果我们能接受非因果因为数据已经全部拿到手里就可以设计一个ROC包含单位圆的系统做零相位滤波避免相位失真。filtfilt这类函数背后的思路就与它相关正向滤一遍再反向滤一遍等效于把极点和零点都做一次倒数映射合并后整个系统变成零相位。反过来做实时系统时你只能要因果解这时候如果原始设计里有限制在圆内的极点就必须接受它带来的相位滞后。6.3 从H(z)到定点实现系数、量化和频率响应的坑最后说几个从纸面走到代码才会遇到的坑。第一个坑是系数量化导致极点漂移。一个二阶系统的极点由分母系数a₁、a₂唯一确定但如果系数被截断到有限位宽实际的极点位置会偏离设计值。极点离单位圆越近这个偏移带来的影响越大本来0.998的极点半径量化误差可能把它推到1.0002一个稳定滤波器瞬间变成发散系统。我的应对做法是把高阶系统一律拆成级联的二阶节biquad每个二阶节单独量化和缩放绝不把六阶系统的系数直接丢进定点运算。第二个坑是直流增益和奈奎斯特增益的检查。改完系数后务必重新算一遍H(z)在z1直流和z−1最高频处的模值看它跟设计值差多少。如果直流增益偏移超过几个百分点通常意味着某个极点被推得太靠外了得回头调系数或者提高位宽。第三个坑是把理论稳定当成实现稳定。理论上极点模是0.99的系统完全稳定但在定点实现里冲激响应的尾部会一直卡在最低有效位上形成小幅度不衰减的极限环振荡听感上就是沙沙的底噪。遇到这个现象我会在反馈回路里加一点极小的噪声整形dither或者干脆把极点半径调小到0.98左右用一点点选择性损失换干净的本底。import numpy as np import scipy.signal as sig # H(z) (1 - 0.5 z^-1) / (1 - 1.2 z^-1 0.72 z^-2) b np.array([1.0, -0.5]) a np.array([1.0, -1.2, 0.72]) z, p, k sig.tf2zpk(b, a) print(零点:, np.round(z, 4)) print(极点:, np.round(p, 4)) print(极点模:, np.round(np.abs(p), 4)) # 约 0.8485在单位圆内 # 量化实验把 a 截断到 3 位小数 a_q np.round(a, 3) _, p_q, _ sig.tf2zpk(b, a_q) print(量化后极点模:, np.round(np.abs(p_q), 4))这段代码跑出来的两个极点模都在0.85附近是安全的所以我把它当作教学例子。你可以把a₂改到0.95左右再看量化前后极点模的差异会明显放大那时候就能亲眼看到系数少一位、系统性格变一样这句话的分量。还有一个习惯我保持了几年算是个人经验里回报率最高的一条每次算完一个z变换题目或者设计完一个H(z)都强制自己回答三个问题——最外层极点的模是多少、ROC朝哪个方向、单位圆在不在ROC里。这三句话答完稳定性、因果性、时域序列的基本形态就都清楚了剩下的代数运算只是体力活。刚开始强迫自己这么做会觉得啰嗦做上二十道题之后它变成本能你在考场上和调试滤波器时都会少掉一大半的盲目试错。
返回列表