# *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 %}