離散時間システムとZ変換:定義・性質・応用
1. Z変換の定義
離散時間信号 $x[n]$($n$ は離散時間インデックス)のZ変換 $X(z)$ は、信号の値を複素変数 $z$ のべき乗の係数として持つべき級数として定義されます。
$$\mathcal{Z}{x[n]} = X(z) = \sum_{n=0}^{\infty} x[n] z^{-n}$$
- 解説: Z変換は、時間領域の信号 $x[n]$ を、複素周波数領域の関数 $X(z)$ に変換します。これは、連続時間システムにおけるラプラス変換に相当するものです。システム解析においては、複素平面(Z平面)上の $z$ の振る舞い(特に極と零点の位置)を調べることで、システムの安定性や周波数特性を把握します。
2. Z変換の主要な性質
Z変換の性質は、差分方程式を代数的な操作に変換する上で不可欠です。
| 性質 | 時間領域の式 | Z領域の式 | 解説 |
|---|---|---|---|
| 線形性 | $\mathcal{Z}{a x[n] + b y[n]}$ | $a X(z) + b Y(z)$ | 信号の重ね合わせの原理が成り立ちます。 |
| $q$ クロック遅延 | $\mathcal{Z}{x[n-q]}$ | $z^{-q} X(z)$ | 1クロックの遅延は $z^{-1}$ を乗じることに相当します。時間シフトが $z$ のべき乗の乗算に変換されます。 |
| $q$ クロック進み | $\mathcal{Z}{x[n+q]}$ | $z^q X(z) - z^q x[0] - \cdots - z x[q-1]$ | 時間が進む場合は $z^q$ を乗じますが、因果性($n<0$ で $x[n]=0$)を満たすために初期値 $x[0], x[1], \dots$ を引く項が必要になります。 |
| 複素微分 | $\mathcal{Z}{n x[n]}$ | $-z \frac{d}{dz} X(z)$ | 時間インデックス $n$ の乗算は、$z$ 領域での微分操作に対応します。これは、極が多重根を持つ場合の逆Z変換にも使われます。 |
| 畳み込み | $\mathcal{Z}{x[n] \ast y[n]}$ | $X(z) Y(z)$ | 時間領域の畳み込み(システムへの入力とインパルス応答の演算)は、$z$ 領域での単純な乗算に変換されます。この性質が伝達関数の基礎となります。 |
$$\text{ただし、} x[n-q] \text{の変換では } x[n] = 0 \quad (n < 0) \text{を仮定しています。}$$
3. Z変換の定理(初期値・最終値)
システムの過渡特性や定常特性を、逆変換せずに $X(z)$ から直接予測するために使われます。
-
初期値定理
$$x[0] = \lim_{z \to \infty} X(z)$$- 解説: 時刻 $n=0$ における信号の値は、$X(z)$ において $z \to \infty$ とすることで得られます。これは、定義式 $\sum x[n] z^{-n}$ のうち、$n=0$ の項($x[0] z^0$)のみが残るためです。
-
最終値定理
$$\lim_{n \to \infty} x[n] = \lim_{z \to 1} (z-1) X(z)$$- 解説: $n$ が無限大に近づいたときの信号の定常値は、$(z-1) X(z)$ の $z \to 1$ の極限として求められます。これは、システムが最終的に安定した値に収束するかどうかを判断するのに有用です。(ただし、収束しない信号には適用できません。)
4. 逆Z変換(部分分数展開)
Z変換された有理関数 $X(z) = B(z)/A(z)$ を時間領域の信号 $x[n]$ に戻すための主要な手法です。
$$\frac{X(z)}{z} = c_0 + \frac{c_1}{z-p_1} + \frac{c_2}{z-p_2} + \cdots + \frac{c_N}{z-p_N}$$
$$\text{(極 } p_i \text{ が相異なる場合)}$$
- 解説: $X(z)/z$ を分母の根(極 $p_i$)を用いて部分分数に分解します。こうすることで、各項が基本となるZ変換対(例: $\mathcal{Z}{a^n u[n]} = z/(z-a)$)の形に容易に対応できるようになります。
-
係数 $c_i$ の計算(留数)
$$c_i = \left[ \frac{X(z)}{z} (z-p_i) \right]_{z=p_i} \quad i=1, 2, 3, \ldots, N$$- 解説: $c_i$ は留数定理を用いて計算され、その極 $p_i$ における関数の寄与度を表します。この $c_i$ を用いて逆変換すると、インパルス応答 $x[n]$ の一般形が得られます。
5. 入出力差分方程式と伝達関数
線形時不変(LTI)離散時間システムは、入出力の差分方程式で記述されます。
-
伝達関数の定義
$$H(z) = \frac{Y(z)}{X(z)}$$- 解説: 伝達関数 $H(z)$ は、システムへの入力 $X(z)$ に対する出力 $Y(z)$ の比として定義されます。これは、システム固有の特性(インパルス応答 $h[n]$ のZ変換)を表し、初期条件をゼロとした差分方程式をZ変換することで導出されます。
-
$N$次の系における伝達関数
$$H(z) = \frac{B(z)}{A(z)} = \frac{b_M z^M + b_{M-1} z^{M-1} + \cdots + b_0}{z^N + a_{N-1} z^{N-1} + \cdots + a_0} \quad (N \ge M)$$- 解説: 一般に、伝達関数は $z$ の有理関数(多項式の比)で表されます。分母の根が極、分子の根が零点となり、これらがシステムの安定性や周波数特性を決定します。
-
入出力関係
$$Y(z) = H(z) X(z)$$- 解説: 畳み込み定理により、出力 $Y(z)$ は伝達関数 $H(z)$ と入力 $X(z)$ の積で計算されます。システム解析の基本となる関係式です。
6. 離散時間システムの安定性
システムの安定性は、時間応答 $h[n]$ が発散せず有限に収まるかどうかを示す重要な特性です。
-
安定性の条件
$$\text{安定} \iff |p_i| < 1 \quad i=1, 2, \ldots, N$$- 解説: システムが安定であるためには、すべての極 $p_i$ がZ平面上の単位円 $|z|=1$ の内部に存在しなければなりません。
-
不安定性の条件
$$\text{不安定} \iff \begin{cases} \text{単極}: |p| > 1 \ \text{多重極}: |p| \ge 1 \end{cases}$$- 解説: 単位円の外に極がある場合や、単位円上($|z|=1$)に多重極がある場合は、インパルス応答 $h[n]$ が時間とともに無限に発散するか、振動しながら増大するため、システムは不安定となります。
7. 主なZ変換対
| $x[n]$ (時間領域) | $X(z)$ (Z領域) | 解説 |
|---|---|---|
| $\delta[n]$ (単位インパルス) | $1$ | 単位インパルス $\delta[0]=1$ のみを持つため、定義式から $1 \cdot z^0 = 1$ となります。 |
| $u[n]$ (単位ステップ) | $\frac{z}{z-1}$ | 連続時間でのステップ関数 $\frac{1}{s}$ に対応します。極は $z=1$ です。 |
| $a^n u[n]$ (指数関数) | $\frac{z}{z-a}$ | 離散システム解析の基本要素であり、極は $z=a$ です。安定性は $ |
| $n u[n]$ | $\frac{z}{(z-1)^2}$ | $\frac{z}{z-1}$ に複素微分の性質を適用することで導出されます。極 $z=1$ に多重極を持ちます。 |
| $(\cos \Omega n) u[n]$ | $\frac{z(z-\cos \Omega)}{z^2 - 2z \cos \Omega + 1}$ | 減衰のない振動信号の変換です。極は $z=e^{\pm j\Omega}$ となり、単位円上に位置します。 |
| $a^n (\cos \Omega n) u[n]$ | $\frac{z(z-a \cos \Omega)}{z^2 - 2az \cos \Omega + a^2}$ | 極 $z=a e^{\pm j\Omega}$ となり、振動しながら減衰($ |
Z変換と離散時間システム:応用と理論の統合
1. Z変換の基礎と演算子の役割
Z変換 $\mathcal{Z}{x[n]} = X(z) = \sum_{n=0}^{\infty} x[n] z^{-n}$ は、離散信号 $x[n]$ を複素変数 $z$ の関数に変換し、時間領域の操作を代数的な操作に変換する道具です。
1.1 時間シフトの物理的・代数的な意味
$q$ クロック遅延 $\mathcal{Z}{x[n-q]} = z^{-q} X(z)$ は、デジタルシステムにおいて $q$ 回の単位遅延(メモリ要素)を通過することを意味します。演算子 $z^{-1}$ は、デジタルフィルタや制御システムを構成する上での基本的なブロック(1サンプルの記憶)を表します。
$q$ クロック進み $\mathcal{Z}{x[n+q]} = z^q X(z) - z^q x[0] - \cdots - z x[q-1]$ の初期値項は、非因果的な部分を補正するために必要です。Z変換は通常、信号が $n<0$ でゼロである一方向Z変換を用いますが、進み操作では $n \ge 0$ の信号をシフトするため、初期値 $x[0]$ から $x[q-1]$ までの項を引いて、本来の $z$ 変換の定義に合わせます。
1.2 畳み込みと伝達関数の関係の深化
畳み込み $\sum_{k=0}^{\infty} x[n-k]v[k] \leftarrow X(z)V(z)$ は、システム解析において、以下の関係を確立します。
$$\boldsymbol{Y(z) = H(z)X(z)}$$
ここで $H(z)$ はインパルス応答 $h[n]$ のZ変換であり、伝達関数です。この関係により、複雑な差分方程式の解析は、$z$ の多項式による代数計算に置き換えられます。
2. 逆Z変換の構造と時間応答の構成
2.1 逆Z変換の方法論
逆Z変換には主に以下の2つの方法があります。
- べき級数展開: $X(z)$ を $z^{-1}$ のべき級数 $\sum x[n] z^{-n}$ に展開し、係数 $x[n]$ を順次求めます。これは、時間応答の初期値を具体的に知るのに役立ちます。
- 部分分数展開と留数定理: $X(z)/z$ を分母の極 $p_i$ で展開し、各極の留数 $c_i = \left[ \frac{X(z)}{z} (z-p_i) \right]_{z=p_i}$ を求めます。この $c_i$ が、インパルス応答の各モード(基本関数)の重みとなります。
2.2 インパルス応答 $x[n]$ のモード分解
インパルス応答 $x[n] = c_0 \delta[n] + c_1 p_1^n + c_2 p_2^n + \cdots + c_N p_N^n$ は、システムの自然応答(極 $p_i$)の線形結合として表されます。
- 各項の意味: 各 $p_i^n$ の項は、システムが持つ固有の振動モード(指数減衰、持続振動など)を表しています。たとえば、実極 $p$ は指数関数的な減衰($p^n$)、複素極 $p = r e^{\pm j\Omega}$ は減衰を伴う振動($r^n \cos(\cdot)$)に対応します。
- 初期値の寄与: $c_0 \delta[n]$ 項は、分子 $B(z)$ の次数 $M$ と分母 $A(z)$ の次数 $N$ が等しい($M=N$)場合に現れる、直達項(入力が遅延なく出力に伝わる成分)です。
3. Z平面上の極零点配置とフィルタ設計
3.1 Z平面と安定性の深い関係
ラプラス変換における $s$ 平面の左半平面(安定領域)は、Z変換では $z = e^{s T_s}$ の関係により、単位円 $|z|=1$ の内部に写像されます。
-
不安定条件の比較:
- $|p|>1$ の単極が不安定なのは、応答が $p^n$ の形式で指数関数的に発散するためです。
- $|p| \ge 1$ の多重極が不安定なのは、応答に $n p^n$ や $n^2 p^n$ の項が含まれ、単位円上であっても係数 $n$ のために発散(時間とともに増大)するためです。
3.2 周波数特性と極零点配置の幾何学的解釈
伝達関数 $H(z)$ の単位円上での評価 $H(e^{j\omega T_s})$ は周波数特性を与えます。
$$|H(z)| \propto \frac{\prod (\text{零点までの距離})}{\prod (\text{極までの距離})}$$
-
フィルタ設計: フィルタ設計とは、Z平面上に意図的に極と零点を配置することで、特定の周波数 $\omega$ でのゲイン $|H(e^{j\omega T_s})|$ を制御することです。
- ハイパスフィルタ(HPF): $z=1$(DC成分)の近くに零点を配置し、$z=-1$(ナイキスト周波数)の近くに極を配置します。
- バンドパスフィルタ(BPF/共振器): 目的の共振周波数 $\Omega$ に対応する角度 $e^{\pm j\Omega}$ の位置に、単位円に近い極を配置します。極が単位円に近いほど、フィルタの**Q値(シャープさ)**が高くなります。
4. Z変換の定理の制約
4.1 最終値定理の制約
最終値定理 $\lim_{n \to \infty} x[n] = \lim_{z \to 1} (z-1) X(z)$ は、その使用に厳密な制約があります。
$$\boldsymbol{x[n] \text{が } n \to \infty \text{ で振動値をもつならば、} \lim_{z \to 1} (z-1) X(z) \text{は意味をなさない。}}$$
-
理由: 最終値定理が意味を持つのは、$x[n]$ が $n \to \infty$ で有限の値に収束する場合のみです。
- 収束するためには、$(z-1)X(z)$ のすべての極が単位円 $|z|=1$ の内部に存在する必要があります。
- もし $X(z)$ が $z=1$ 以外に単位円上または外部に極を持つ場合、信号 $x[n]$ は発散するか、減衰しない振動となり、定理は適用できません。
!pip install numpy matplotlib scipy
import numpy as np
import matplotlib.pyplot as plt
from scipy import signal
# ==========================================
# パラメータ設定 / Parameters
# ==========================================
a = 0.8 # system pole coefficient
fs = 1.0 # sampling frequency
num = [1.0] # numerator coefficients B(z)
den = [1.0, -a] # denominator coefficients A(z)
n = np.arange(0, 40) # discrete time index
x = (a**n) # input signal (a^n)
z = np.exp(1j * np.linspace(0, 2*np.pi, 512)) # z-plane points
# ==========================================
# Z変換と周波数応答 / Z-transform & Frequency response
# ==========================================
w, h = signal.freqz(num, den, worN=512)
Xz_mag = np.abs(h)
Xz_phase = np.angle(h)
# ==========================================
# Z平面上の極・零点図 / Pole-zero plot
# ==========================================
zeros = np.roots(num)
poles = np.roots(den)
plt.figure(figsize=(5,5))
plt.title("Pole-Zero Map of H(z)")
plt.axhline(0, color='gray', linewidth=0.5)
plt.axvline(0, color='gray', linewidth=0.5)
unit_circle = plt.Circle((0,0), 1, color='black', fill=False, linestyle='--')
plt.gca().add_artist(unit_circle)
plt.scatter(np.real(zeros), np.imag(zeros), marker='o', label='Zeros')
plt.scatter(np.real(poles), np.imag(poles), marker='x', label='Poles')
plt.xlabel("Real axis")
plt.ylabel("Imag axis")
plt.legend()
plt.grid(True)
# ==========================================
# 周波数応答の振幅特性 / Magnitude response
# ==========================================
plt.figure(figsize=(7,4))
plt.plot(w/np.pi, 20*np.log10(Xz_mag))
plt.title("Magnitude Response |H(e^jw)|")
plt.xlabel("Normalized Frequency (×π rad/sample)")
plt.ylabel("Magnitude [dB]")
plt.grid(True)
# ==========================================
# 時間領域信号の確認 / Time-domain sequence
# ==========================================
plt.figure(figsize=(7,3))
plt.stem(n, x, use_line_collection=True)
plt.title("Time-domain Signal: a^n u[n]")
plt.xlabel("n (sample index)")
plt.ylabel("Amplitude")
plt.grid(True)
plt.show()
# ==========================================
# 数値確認 / Numerical verification
# ==========================================
print("Poles:", poles)
print("Zeros:", zeros)
print("Stability:", np.all(np.abs(poles) < 1))