從 s 平面到 z 平面
如果你接觸過 拉普拉斯轉換,你已經知道它的核心戲法:把時間域裡那團亂糟糟的微分方程,變成複變數 s 裡單純的代數。電容、電感不再是微積分,而變成簡單的阻抗;整個電路塌縮成兩個多項式的比值。z 轉換是完全相同的構想,移植到離散世界——取樣的世界,而非連續電壓的世界。拉普拉斯住在 s 平面,z 轉換則住在 z 平面;一旦你學會讀懂這個平面,任何 DSP 系統都能寫在一張餐巾紙背面。
為什麼非得要一個*新*的轉換?因為 離散時間訊號 x[n] 並不是平滑的函數——它是一串以一個取樣間隔分開的數字。z 轉換用它自己的語言來面對它。我們把 X(z) 定義成對這些取樣值求和,每一項都乘上一個 z⁻¹ 的次方:X(z) = Σ x[n]·z⁻ⁿ,n 從 0 往上加(針對 DSP 通常在意的因果訊號)。這一行就是完整的定義。變數 z 是複數,而真正的奧妙,完全藏在它的次方*代表什麼*。
z⁻¹ 就是一個記憶單元
想像一條輸送帶載著你的取樣值經過你面前,每個時脈一個。單位延遲 z⁻¹ 就是輸送帶上的一個格子:一個取樣值掉進去,正好一拍之後從另一端彈出來。在硬體裡,那個格子實際上就是一個暫存器——一個正反器或記憶單元——由取樣頻率來定時。在軟體裡,它就是你讀取的陣列裡的一個位置。這就是為什麼 DSP 工程師說 z⁻¹ *就是*記憶:你在方塊圖裡畫的每一個延遲,都是系統記住某個過去數值的地方。
現在來看一個*系統*——任何把輸入 x[n] 變成輸出 y[n] 的東西——被寫下來的樣子。幾乎所有有用的 DSP 系統都是線性非時變的(LTI 系統):把輸入放大,輸出也跟著放大;把輸入延遲,輸出就只是跟著延遲。對這類系統,規則永遠是同一種形狀:今天的輸出,是近期幾個輸入與近期幾個輸出的加權和。把這句話寫成數學式,就是差分方程。
Difference equation (what the code actually does each tick):
y[n] = b0*x[n] + b1*x[n-1] - a1*y[n-1]
Delay-line / block-diagram view (-> is one sample of flow):
x[n] --->(x b0)----+
| |
[z^-1] (+)---> y[n] ---+----> out
| | |
x[n-1]-->(x b1)----+ [z^-1]
|
(x -a1)<------ y[n-1]
(-a1 * y[n-1] fed back into the sum)
The two [z^-1] boxes are the only memory in the system.差分方程 → 轉移函數 H(z)
整台機器的回報就在這裡。我們把 z 轉換套用到差分方程的每一項。因為 z⁻¹ 不過就是「平移一個取樣」,這個代換是機械式的:看到 x[n−k],就寫成 z⁻ᵏ·X(z);看到 y[n−k],就寫成 z⁻ᵏ·Y(z)。那些帶著微積分味道的時間延遲,全變成單純地乘上 z⁻¹ 的次方。接著我們整理各項,求比值 Y(z)/X(z)。這個比值就是系統的[[ee-transfer-function|轉移函數]],寫作 H(z)——它正是你或許在連續控制裡認識的那個轉移函數的離散表親。
- 從差分方程出發:y[n] = b0·x[n] + b1·x[n−1] − a1·y[n−1]。
- 把每個延遲項代換掉:y[n−1] → z⁻¹·Y(z)、x[n−1] → z⁻¹·X(z)。方程變成 Y = b0·X + b1·z⁻¹·X − a1·z⁻¹·Y。
- 把所有 Y 收到左邊:Y·(1 + a1·z⁻¹) = X·(b0 + b1·z⁻¹)。
- 相除得到轉移函數:H(z) = Y(z)/X(z) = (b0 + b1·z⁻¹) / (1 + a1·z⁻¹)。
看看這個形狀:兩個 z⁻¹ 多項式的比值。分子來自輸入權重(b 們),分母來自回授權重(a 們)。令分子 = 0 得到零點——系統會抹除的輸入頻率。令分母 = 0 得到極點——系統的自然共振,它會放大的頻率與它震盪的模態。零點與極點合起來,極點與零點就是 LTI 系統的完整指紋:告訴我它們落在哪,我就能重建出系統的一切行為。
讀懂 z 平面:單位圓就是穩定的分界線
現在把極點與零點畫到複數 z 平面上,一個故事就浮現了。最重要的地標就是單位圓——離原點剛好距離 1 的所有點所成的圓。它是 s 平面裡虛軸的離散時間對應物,承載著龐大的意義。對因果系統,規則直截了當:每一個極點都必須嚴格落在單位圓內,否則系統不穩定。 極點在圓內,代表一個逐取樣衰減的模態;極點落在圓上,就永遠震盪而不消亡;極點在圓外,代表響應無界成長,終將爆掉。
Im(z)
| . . . .
. unit circle (|z| = 1)
. | .
. | .
. x <-- pole INSIDE .
. (stable, decays) .
---+--------o--------+-------+----- Re(z)
. zero (origin) .
. .
. x <-- pole ON circle = rings forever
. (marginally stable) .
. .
. . . . x <-- pole OUTSIDE = blows up
Inside circle -> stable
On circle -> oscillates, never settles
Outside circle -> unstable (output grows without limit)同一張圖也告訴你濾波器的形狀,而這部分簡直像是超能力。要求出 頻率響應——濾波器如何對待每一個頻率——你讓一個點沿著單位圓繞一整圈,從 z = 1(直流,最低頻率)一路繞到 z = −1(最高頻,由取樣定理決定的奈奎斯特頻率)。在每一點,增益大致等於*到各零點距離的乘積,除以到各極點距離的乘積*。滑到極點附近,分母縮小,增益就飆高——一個共振、一個峰。滑到零點附近,分子縮小,增益就下陷——一個凹槽。這個幾何,真的就替你畫出了濾波器的響應曲線。
一個一階範例:單極點平滑器
我們用最簡單卻好用的 IIR 濾波器把它落實——一個單極點低通平滑器,藏在每一個「指數移動平均」與每一個和緩的音量推桿裡的那種。它的差分方程是 y[n] = (1−α)·x[n] + α·y[n−1],其中 α 介於 0 與 1 之間。用白話說:新的輸出是新輸入與前一個輸出的某個比例 α 的混合。把 α 調大,濾波器就重重倚靠它的記憶,於是平滑得很用力、反應很慢;把 α 調小,它幾乎瞬間就跟上輸入。
Take the z-transform of y[n] = (1-a)*x[n] + a*y[n-1]
Y = (1-a)*X + a*z^-1 * Y
Y - a*z^-1*Y = (1-a)*X
Y*(1 - a*z^-1) = (1-a)*X
(1 - a)
H(z) = --------------- <-- transfer function
1 - a*z^-1
Pole: 1 - a*z^-1 = 0 -> z = a (a real pole on the +Re axis)
Zero: numerator is constant -> a zero at z = 0
DC gain (set z = 1): H(1) = (1-a)/(1-a) = 1 (passes DC perfectly)
Nyquist gain (z=-1): H(-1)= (1-a)/(1+a) < 1 (cuts high freq)
With a = 0.9 : pole at 0.9 (just inside circle) -> stable,
heavy smoothing, slow ~ settles in tens of samples
With a = 0.5 : pole at 0.5 -> light smoothing, fast settle免費讀一下 z 平面剛剛告訴我們的事。極點落在實軸上的 z = α。只要 α < 1,那個極點就在單位圓內,所以濾波器穩定——正是我們期望的條件。它以滿增益讓直流(訊號裡緩慢的、平均的部分)通過,並衰減靠近奈奎斯特的快速抖動:一個貨真價實的低通。而 α 越是逼近 1,極點就越逼近圓,濾波器就變得越遲緩、平滑得越用力。一個極點、一個參數,幾何就一次解釋了穩定性、通帶與速度。
為什麼這是 DSP 的拱心石
退一步,看看這一個想法替你買到了什麼。一個差分方程——晶片上實際執行的那段 C 程式——變成了多項式比值 H(z)。那個比值變成一撮極點與零點。那一撮點,對著單位圓畫出來,立刻揭露了穩定性與濾波器的整個形狀。在時間域裡對訊號做卷積,是個瑣碎的滑動加總運算,如今變成 z 轉換的單純*相乘*——正如卷積在任何轉換域裡都塌縮成乘法。把兩個濾波器串接?只要把它們的 H(z) 相乘。z 轉換就是讓這一切融成一場流暢對話的共通語言。
有一個誠實的提醒要帶著往下走。z 轉換能漂亮地告訴你系統在每個頻率的*增益*——但單位圓的距離只給了大小。要同時看見相位(每個頻率所承受的時間延遲),並從有限資料算出真正的頻譜,你會伸手去拿離散傅立葉轉換,它本質上就是把 H(z) 在單位圓上等間隔的點上求值。把 DFT 想成 z 轉換的捲尺:同一個圓,現在多了刻度。那是下一個工具,而再下一個——FFT——只是用快得驚人的方式去讀它。