# *9.5 常用zT轉換表 以下表列信號與系統中常見的函數以及其雙邊z轉換。對於單邊z轉換來說,取ROC為同心圓以外者或信號為因果者,其轉換與雙邊轉換相同。 ## 總表 |時域|頻域| ROC: $\|z\|$| |:-----:|:-----:|:-----:| |$\delta[n]$|1|all| |$\delta[n-n_0]$ | $z^{-n_0}$ | $\neq0$ | |$u[n]$|$\frac{1}{1-z^{-1}}$|$>1$| |$-u[-n-1]$|$\frac{1}{1-z^{-1}}$|$<1$| |$nu[n]$|$\frac{z^{-1}}{(1-z^{-1})^2}$|$>1$| |$-nu[-n-1]$|$\frac{z^{-1}}{(1-z^{-1})^2}$|$<1$| |$a^nu[n]$|$\frac{1}{1-az^{-1}}$|$>\|a\|$| |$-a^nu[-n-1]$|$\frac{1}{1-az^{-1}}$|$<\|a\|$| |$\cos(\omega_0n)u[n]$|$\frac{1-\cos(\omega_0)z^{-1}}{1-2\cos(\omega_0)z^{-1}+z^{-2}}$|$>1$| |$\sin(\omega_0n)u[n]$|$\frac{\sin(\omega_0)z^{-1}}{1-2\cos(\omega_0)z^{-1}+z^{-2}}$|$>1$| |$-\cos(\omega_0n)u[-n-1]$|$\frac{1-\cos(\omega_0)z^{-1}}{1-2\cos(\omega_0)z^{-1}+z^{-2}}$|$<1$| |$-\sin(\omega_0n)u[-n-1]$|$\frac{\sin(\omega_0)z^{-1}}{1-2\cos(\omega_0)z^{-1}+z^{-2}}$|$<1$| ## 時域多項式 前面四個只要套用定義就可直接得到,不予證明。第5和第6個則是可以用頻域微分的性質得到。如果我們重複套用頻域微分的性質,我們可以得到形如: $$ n^ku[n] $$的z轉換。 ### *正轉換 為了推導一個一般式,我們先定義$t=z^{-1}$方便計算,並分別定義分子分母為$t$的多項式: $$ nu[n]\leftrightarrow \frac{z^{-1}}{(1-z^{-1})^2} \triangleq \frac{t}{(1-t)^2} \triangleq \frac{N_1(t)}{D(t)^2} $$ 然後根據性質,我們有: $$ \frac{N_2(t)}{D(t)^3} = -t^{-1} \frac{d}{dz}(\frac{N_1(t)}{D(t)^2})=-t^{-1} (-t^2\frac{d}{dt})(\frac{N_1(t)}{D(t)^2}) $$$$ =t(\frac{N_1'(t)D(t)-2N_1(t)D'(t)}{D(t)^3}) $$$$ \Rightarrow N_2(t)=t(N_1'(t)D(t)-2N_1(t)D'(t)) $$ 因為以上推導對於所有$n^k$都有效,所以我們可以改寫成: $$ N_k(t)=t(N_{k-1}'(t)D(t)-kN_{k-1}(t)D'(t)) $$然後展開$D(t)=1-t, D'(t)=-1$: :::info $$ N_k(t)=t(N_{k-1}'(t)(1-t)+kN_{k-1}(t)) $$ ::: 我們得到了一個遞迴的定義式。透過這個關係,我們可以一步步計算所有z轉換。但是我們更希望可以直接得到一個封閉形式,否則使用這個遞迴跟逐步計算沒有任何分別。 首先我們可以透過「觀察」發現,$N_k(t)$會比$N_{k-1}(t)$高出一個degree。而$\deg N_1=1$,所以$\deg N_k=k$。另外$N_k(0)=0$,所以$N_k$皆沒有常數項。於是我們就能令: $$ N_k(t)\triangleq\sum_{i=1}^{k}a_{k,i}t^i $$接著將它丟進上面的遞迴式,觀察每個係數之間的關係。我們先處理左式,得: $$ \sum_{i=1}^{k-1}ia_{k-1,i}t^i-\sum_{i=1}^{k-1}ia_{k-1,i}t^{i+1}+\sum_{i=1}^{k-1}ka_{k-1,i}t^{i+1} $$$$ =a_{k-1,1}t+a_{k-1,k-1}t^k+\sum_{i=2}^{k-1}(ia_{k-1,i}-(i-1)a_{k-1,i-1}+ka_{k-1,i-1})t^i $$ 他看起來很醜,實際上也真的很醜。不過如果我們假設$a_{k-1,0}=0, a_{k-1,k}=0$,那麼整個式子可以被簡化成係數之間的關係: :::info $$ a_{k,i}=ia_{k-1,i}+(k-i+1)a_{k-1,i-1} $$ ::: 接下來,神奇的部分就來了。這個遞迴式會給出一個已知的數列。請看下面的定理: :::danger **Eulerian Numbers** $A(n,k)$,$k=0,1,...,n-1$,$n\in\mathbb{N}$稱作Eulerian Numbers,他們滿足: 1. $A(1,0)=1$ 2. $A(n,k)=(n-k)A(n-1,k-1)+(k+1)A(n-1,k)$ 前面幾個$n$對應的Eulerian Numbers分別為: - $n=1:\{1\}$ - $n=2:\{1,1\}$ - $n=3:\{1,4,1\}$ - $n=4:\{1,11,11,1\}$ ::: 所以我們可以奇蹟似的定義: :::info $$ a_{k,i}=A(k,i-1),\,a_{k,0}=0 $$ ::: 則我們導出的係數關係,恰好跟Eulerian Number的遞迴式相同! 所以我們可以用它來寫下z轉換的結果: :::danger **多項式的z轉換** $$ n^ku[n]\leftrightarrow \frac{z^{-1}(\sum_{i=0}^{k-1} A(k,i)z^{-i})}{(1-z^{-1})^{k+1}} $$ 其中$A(k,i)$表示Eulerian Number。 ::: 如果你真的需要比如說$n^{12}u[n]$的z轉換的話,因為Eulerian Number是一個已知數列,你可以透過OEIS查詢: [A008292](https://oeis.org/A008292)。裡面有前幾項的結果,以及能用來計算的其他方式,例如參照其他數列,或是使用程式計算。 ### 反轉換 一般而言,如果給定一個型如: $$ \frac{1}{(1-z^{-1})^{k+1}} $$的z轉換,想要透過增減項配出上面的公式太過複雜。這時候我們可以利用洛朗級數的性質,先將分式轉換成級數,再取它的係數即得反z轉換。透過微積分學到的技巧,可得: :::danger **分母為一次式的次方的逆z轉換** $$ \frac{1}{(1-z^{-1})^{k+1}} \leftrightarrow \binom{n+k}{k} $$ ::: ## 有理函數的反z轉換 ### 解法 同樣的,最重要的步驟就是將整個函數拆分為部分分式(partial fractions),而一個有理函數必可以被拆成下列四種之一: 1. 分母一次項 2. 分母一次項的n次方 3. 分母不可約的二次項 4. 分母不可約的二次項的n次方 也就是說,所有有理函數的時域都將是以上四種函數的線性組合,並且我們保證所有有理函數都有逆z轉換。最後一種遇到的機會最小,而且式子很醜,所以我放在最後推導,有興趣再看即可。 另外,所有有理函數都可以**用長除法轉換成級數形式**,並且利用在[9.1 zT](/@seanyih/signal-9-1)提到過的性質,直接提取出時域信號。因此,若不是一定需要一個封閉形式,用這種方法更快。e.g. 利用程式。我(叫chatGPT)寫了一個簡單的Python函數,放在下面給有需要的人參考。 總之我們怎麼算的並不重要,重要的是我們知道可以算。可以算就代表利用有理函數去設計系統是可行的,因為我們可以輕易地掌控結果。就如同拉普拉斯轉換提到過的,線性差分方程式最終也會帶來有理函數,所以我們就可以利用線性差分方程去設計DT的LTI系統。 ### *分母不可約的二次項的n次方的逆z轉換 這個標題已經長到快要看不懂了。總之我們想求: $$ \frac{1+az^{-1}}{(1-bz^{-1}-cz^{-2})^{k+1}} $$的逆z轉換。我們一樣利用級數展開: $$ \frac{1+az^{-1}}{(1-(bz^{-1}+cz^{-2})))^{k+1}} \leftrightarrow \sum_{n=0}^{\infty}\binom{n+k}{k}(bz^{-1}+cz^{-2})^{n}(1+az^{-1}) $$提出$z^{-n}$然後爆開那$n$次方的項,利用二項式定理: $$ \sum_{n=0}^{\infty}\binom{n+k}{k}\Bigg( \sum_{i=0}^{n}\binom{n}{i}b^{n-i}c^{i}z^{-i} \Bigg)z^{-n}(1+az^{-1}) $$ 下一步是「觀察」給定$z$的負次方項,它的係數是多少? 我們把上面式子出現的三個z的次方分別標註為$z^{-\alpha}, z^{-\beta}, z^{-\gamma}$,然後分析: - 對於$\gamma=0$,最低的$\beta$可能性是$\lceil n/2\rceil$,此時$\alpha=n-\lceil n/2\rceil$,反之最高的$\beta=n, \alpha=0$。所以我們應該相加$\beta=[\lceil n/2\rceil, n], \alpha=n-\beta$。 - 對於$\gamma=1$,相當於上述狀況在$n-1$的條件。我們應該相加$\beta=[\lceil (n-1)/2\rceil, n-1], \alpha=n-\beta-1$。並且此處的係數都要再乘以$a$。 我們接著將他們加起來: $$ \sum_{\beta=\lceil n/2\rceil}^{n} \binom{\beta+k}{k}\binom{\beta}{\alpha}b^{\beta-\alpha}c^{\alpha}+ a\sum_{\beta=\lceil (n-1)/2\rceil}^{n-1} \binom{\beta+k}{k}\binom{\beta}{\alpha}b^{\beta-\alpha}c^{\alpha} $$ 接下來將$\alpha$的定義帶入,只留下$\beta$作為求和的index,就得到了一個關於$n$的式子。它就是最後的結果了。正如我們所想的,非常醜。 $$ \sum_{\beta=\lceil n/2\rceil}^{n} \binom{\beta+k}{k}\binom{\beta}{n-\beta}b^{2\beta-n}c^{n-\beta}+ a\sum_{\beta=\lceil (n-1)/2\rceil}^{n-1} \binom{\beta+k}{k}\binom{\beta}{n-\beta-1}b^{2\beta-n+1}c^{n-\beta-1} $$ 老實說,這個東西除非你真的就是超想看到封閉形式,不然真的沒什麼用。經過我實驗之後,直接用長除法算比用這個公式快上20倍(程式)。 ### *程式: 利用級數展開求有理函數的時域信號 ```python= def series_division(A, B, length=20): """ Compute C such that: (a0 + a1 x + a2 x^2 + ...) / (b0 + b1 x + b2 x^2 + ...) = c0 + c1 x + c2 x^2 + ... Parameters: A (list): coefficients [a0, a1, ...] B (list): coefficients [b0, b1, ...], must not be all zeros len (int): number of coefficients to return Returns: list: coefficients [c0, c1, ..., c_{len-1}] term0: the order of the first term. e.g. 1/(x(x+1))=(x^-1)-1+x-(x^2)+..., then the term0 will be -1. """ term0 = 0; C = [0.0] * length while B[0] == 0.0: term0 -= 1 B.pop(0) if not B: raise ValueError("B must not be all zero") while A[0] == 0.0: term0 += 1 A.pop(0) if not A: return C, 0 for n in range(length): if(n < len(A)): total = A[n] else: total = 0.0 for k in range(n): if n - k < len(B): total -= B[n - k] * C[k] C[n] = total / B[0] return C, term0 if __name__ == "__main__": a = [1, 2, 3] b = [1, 0, 4, 1] c, term0 = series_division(a, b) print(c) print(term0) """ Resulting C is [1.0, 2.0, -1.0, -9.0, 2.0, 37.0, 1.0, -150.0, -41.0, 599.0, 314.0, ...]. You can check this result on WolframAlpha by the command "expand (1+2x+3x^2)/(1+4x^2+x^3) to order 10". """ ``` {%hackmd @seanyih/signal-main %}