---
# System prepended metadata

title: '*9.5 常用zT轉換表'

---

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