高周波回路を設計していると、「アンテナのインピーダンスが 73 Ω なのに、給電線は 50 Ω。このままつないだら反射が起きて電力が戻ってきてしまう」といった場面に必ず出会います。低周波回路なら導線で素直につなげば済みますが、波長が回路寸法と同程度になるマイクロ波帯では、インピーダンスの不整合がそのまま反射波として跳ね返り、送信電力の損失・受信感度の低下・送信機の発熱を引き起こします。この不整合をどう解消するか — それが「インピーダンス整合(impedance matching)」の問題です。
整合回路の設計には伝統的に スミスチャート(Smith chart) という円形のグラフが使われてきました。1939 年に Phillip Smith が考案したこの図は、複素反射係数の平面上にインピーダンスの目盛りを刻んだもので、計算機のなかった時代に「定規とコンパスだけで整合回路を設計できる」道具として絶大な力を発揮しました。現代では電卓も計算機もありますが、スミスチャートは今なお RF エンジニアの共通言語であり、ネットワークアナライザの画面にもそのまま表示されます。なぜなら、スミスチャートは整合の「軌跡」を直感的に見せてくれるからです。直列素子を足せば点はある円に沿って動き、並列素子を足せば別の円に沿って動く — この幾何が、設計のセンスそのものを育ててくれます。
スミスチャートと整合設計を理解すると、以下のような場面で見通しが一気によくなります。
- アンテナ給電: ダイポールやパッチアンテナの複素インピーダンスを 50 Ω 系に整合し、反射損失を最小化する設計
- 増幅器設計: トランジスタの入出力インピーダンスを整合し、最大利得や最小雑音指数を実現する整合回路の設計
- フィルタ・結合器: 分布定数線路(スタブ)を使った整合は、そのままフィルタや方向性結合器の設計手法につながります
本記事の内容
- 反射係数 $\Gamma$ 平面と正規化インピーダンスを結ぶ双一次変換 $z = (1+\Gamma)/(1-\Gamma)$ の復習
- 定抵抗円・定リアクタンス円・定アドミタンス円が $\Gamma$ 平面で円になることの導出
- 任意負荷を 50 Ω に整合する L型整合 の素子値を代数的に導出
- 単一スタブ整合 のスタブ位置・スタブ長を作図手順から代数式に落とす
- Python でスミスチャートを描画し、与えた負荷から整合回路を自動設計して軌跡を可視化
前提知識
この記事を読む前に、以下の記事を読んでおくと理解が深まります。
スミスチャートの基本的な読み方(反射係数とインピーダンスの対応)と、L型整合の素子配置の考え方を押さえておくと、本記事の導出が一段とスムーズに追えます。本記事では、それらの幾何を「なぜそうなるのか」という導出から再構築し、最終的に Python で自動設計するところまで一気通貫でつなげます。
なぜ整合が必要なのか — 反射という現象
整合の話に入る前に、「不整合だと何が困るのか」を具体的にイメージしておきましょう。特性インピーダンス $Z_0$ の伝送線路の先に負荷 $Z_L$ をつないだとします。線路を進んできた電圧波が負荷にぶつかると、負荷が線路と「同じ電圧と電流の比」を要求していない限り、一部が反射して戻ってきます。この反射の度合いを表すのが 反射係数(reflection coefficient) $\Gamma$ です。
$$ \Gamma = \frac{Z_L – Z_0}{Z_L + Z_0} $$
この式を眺めると、$Z_L = Z_0$ のとき分子がゼロになり $\Gamma = 0$、すなわち反射が完全に消えることがわかります。これが「整合がとれた」状態です。逆に $Z_L$ が $Z_0$ から離れるほど $|\Gamma|$ は大きくなり、極端な例として負荷が開放($Z_L \to \infty$)なら $\Gamma = +1$、短絡($Z_L = 0$)なら $\Gamma = -1$ となって、入射波が丸ごと跳ね返ります。
反射波があると何が問題なのでしょうか。第一に、反射した電力は負荷に届かないので、送信電力のロスになります。第二に、入射波と反射波が線路上で重なり合って 定在波(standing wave) を作り、場所によって電圧が大きく振れます。この振れ幅の比を表すのが電圧定在波比 $\mathrm{VSWR} = (1+|\Gamma|)/(1-|\Gamma|)$ で、VSWR が大きいほど特定の場所で電圧が高くなり、絶縁破壊や素子の発熱を招きます。第三に、反射波が送信機(信号源)まで戻ると、増幅器の動作点を狂わせたり発振を引き起こしたりします。
これらを避けるために、負荷と線路の間に「整合回路」を挿入して、線路から見たインピーダンスを $Z_0$ に変換します。整合回路は基本的に 損失のないリアクタンス素子(インダクタ・キャパシタ) や 分布定数線路(スタブ) で作ります。損失がないので電力を消費せず、ただインピーダンスを「回転・移動」させるだけで反射をゼロにできるのです。この「回転・移動」を視覚化する舞台がスミスチャートです。次節では、まずスミスチャートの土台となる反射係数と正規化インピーダンスの関係を、双一次変換として整理します。
反射係数と正規化インピーダンスの双一次変換
スミスチャートを理解する鍵は、「インピーダンス平面」と「反射係数平面」という 2 つの世界が、ある変換でぴたりと対応しているという事実です。インピーダンスは $0$ から無限大まで広がる開いた量ですが、反射係数は損失のない負荷に対しては必ず半径 1 の円の内側に収まります。無限に広い世界を有限の円板に押し込めるこの変換が、スミスチャートをコンパクトな図にしている正体です。
まず、計算を見通しよくするためにインピーダンスを $Z_0$ で割った 正規化インピーダンス(normalized impedance) $z$ を導入します。
$$ z = \frac{Z}{Z_0} = r + jx $$
ここで $r$ は正規化抵抗、$x$ は正規化リアクタンスです。これを使うと反射係数の式は次のように簡潔になります。
$$ \Gamma = \frac{Z – Z_0}{Z + Z_0} = \frac{z – 1}{z + 1} $$
この式を $z$ について解き直してみましょう。両辺に $(z+1)$ を掛けると $\Gamma(z+1) = z – 1$、すなわち $\Gamma z + \Gamma = z – 1$ です。$z$ を含む項を左辺に集めると $\Gamma z – z = -1 – \Gamma$、つまり $z(\Gamma – 1) = -(1 + \Gamma)$ となります。両辺を $(\Gamma – 1)$ で割り、符号を整理すると次が得られます。
$$ z = \frac{1 + \Gamma}{1 – \Gamma} $$
この $z = (1+\Gamma)/(1-\Gamma)$ と $\Gamma = (z-1)/(z+1)$ は互いに逆変換の関係にあり、どちらも分子・分母が 1 次式の比になっています。このような変換を 双一次変換(メビウス変換, Möbius transformation) と呼びます。双一次変換には「円(直線を半径無限大の円とみなす)を円に写す」という美しい性質があり、これがスミスチャートの幾何のすべてを生み出します。具体的には、インピーダンス平面上の「抵抗一定の直線」「リアクタンス一定の直線」が、反射係数平面上ではそれぞれ「円」「円弧」に写るのです。
ここで反射係数を実部と虚部に分けて $\Gamma = u + jv$ と書いておきましょう。スミスチャートは、この $(u, v)$ 平面(半径 1 の円板)に、$r$ が一定の曲線群と $x$ が一定の曲線群を描き込んだものです。次節では、これらの曲線が本当に円になることを、座標を陽に計算して確かめます。
定抵抗円と定リアクタンス円の導出
双一次変換が円を円に写すという一般論はわかりましたが、具体的にどんな円なのか — 中心と半径はいくつなのか — を知らなければ図は描けません。ここでは $z = (1+\Gamma)/(1-\Gamma)$ を実部・虚部に分解し、$r$ 一定・$x$ 一定の軌跡が $(u,v)$ 平面でどんな円になるかを導出します。少し計算は続きますが、一度導いておけば後の Python 実装がそのまま書けるようになります。
$\Gamma = u + jv$ を代入すると、
$$ z = r + jx = \frac{1 + u + jv}{1 – u – jv} $$
複素数の割り算なので、分母の共役 $(1 – u + jv)$ を分子・分母に掛けて分母を実数化します。
$$ z = \frac{(1 + u + jv)(1 – u + jv)}{(1 – u – jv)(1 – u + jv)} $$
分母は $(1-u)^2 + v^2$ という実数になります。分子を展開すると、実部は $(1 + u)(1 – u) – v \cdot v$… と進めるよりも、丁寧に掛け算した方が安全です。分子を展開すると、
$$ (1 + u + jv)(1 – u + jv) = (1 – u^2 – v^2) + j(2v) $$
ここで実部は $(1+u)(1-u) + jv(1-u) + jv(1+u) + (jv)^2$ を整理した結果で、$1 – u^2 – v^2$ となり、虚部は $v(1-u) + v(1+u) = 2v$ です。したがって、
$$ r + jx = \frac{(1 – u^2 – v^2) + j\,2v}{(1 – u)^2 + v^2} $$
実部と虚部を分離すると、正規化抵抗 $r$ と正規化リアクタンス $x$ がそれぞれ次のように $(u, v)$ で表されます。
$$ r = \frac{1 – u^2 – v^2}{(1 – u)^2 + v^2}, \qquad x = \frac{2v}{(1 – u)^2 + v^2} $$
定抵抗円
まず $r$ を一定値に固定したときの軌跡を求めます。$r$ の式の分母を払うと $r\left[(1-u)^2 + v^2\right] = 1 – u^2 – v^2$ です。左辺を展開すると $r(1 – 2u + u^2 + v^2)$ なので、
$$ r – 2ru + r u^2 + r v^2 = 1 – u^2 – v^2 $$
$u, v$ の 2 次の項を左辺にまとめます。両辺に $u^2 + v^2$ を足し、$r$ で割れるように整理すると、
$$ (1 + r)u^2 – 2ru + (1 + r)v^2 = 1 – r $$
全体を $(1+r)$ で割ると、
$$ u^2 – \frac{2r}{1 + r}u + v^2 = \frac{1 – r}{1 + r} $$
$u$ について平方完成します。$u$ の 1 次の係数の半分は $-r/(1+r)$ なので、その 2 乗 $\left(\frac{r}{1+r}\right)^2$ を両辺に足すと、
$$ \left(u – \frac{r}{1 + r}\right)^2 + v^2 = \frac{1 – r}{1 + r} + \frac{r^2}{(1 + r)^2} $$
右辺を通分して整理しましょう。$\frac{(1-r)(1+r) + r^2}{(1+r)^2} = \frac{1 – r^2 + r^2}{(1+r)^2} = \frac{1}{(1+r)^2}$ となるので、最終的に次の円の方程式が得られます。
$$ \boxed{\left(u – \frac{r}{1 + r}\right)^2 + v^2 = \left(\frac{1}{1 + r}\right)^2} $$
これは中心 $\left(\dfrac{r}{1+r},\, 0\right)$、半径 $\dfrac{1}{1+r}$ の円です。これを 定抵抗円(constant-resistance circle) と呼びます。$r = 0$ なら中心 $(0,0)$・半径 $1$ の外周円(リアクタンスのみの負荷はすべて外周上にある)、$r \to \infty$ なら点 $(1, 0)$ に収縮します。どの定抵抗円も右端の点 $(1, 0)$ を必ず通ることに注目してください。
定リアクタンス円
次に $x$ を一定にした軌跡です。$x$ の式の分母を払うと $x\left[(1-u)^2 + v^2\right] = 2v$ です。両辺を $x$ で割って整理すると、
$$ (1 – u)^2 + v^2 – \frac{2}{x}v = 0 $$
$v$ について平方完成します。$v$ の 1 次の係数の半分は $-1/x$ なので、その 2 乗 $1/x^2$ を両辺に足すと、
$$ (u – 1)^2 + \left(v – \frac{1}{x}\right)^2 = \frac{1}{x^2} $$
したがって、定リアクタンスの軌跡は次の円です。
$$ \boxed{(u – 1)^2 + \left(v – \frac{1}{x}\right)^2 = \left(\frac{1}{x}\right)^2} $$
これは中心 $\left(1,\, \dfrac{1}{x}\right)$、半径 $\dfrac{1}{|x|}$ の円で、定リアクタンス円(constant-reactance circle) と呼びます。どの定リアクタンス円も点 $(1, 0)$ を通り、$x > 0$(誘導性)なら上半分、$x < 0$(容量性)なら下半分に弧を描きます。$x = 0$(純抵抗)の軌跡は半径無限大の円、すなわち実軸そのものになります。
ここで重要なのは、定抵抗円と定リアクタンス円が常に 直交 することです。これは双一次変換が等角写像(角度を保つ写像)であることの帰結で、もとのインピーダンス平面で $r$ 一定の直線と $x$ 一定の直線が直交していたのが、変換後も保たれているのです。この直交格子こそがスミスチャートの目盛りであり、任意の点に対して $r$ と $x$ を同時に読み取れる仕組みになっています。次節では、整合設計でもう一つ欠かせない「アドミタンス」の表示について見ていきます。
アドミタンスとスミスチャートの回転
整合回路には直列素子と並列素子の両方が登場します。直列素子(線路に直列に入るインダクタ・キャパシタ)はインピーダンス $z$ に $jx$ を足し算するので、定抵抗円に沿って点を動かします。一方、並列素子(線路とグラウンドの間に入る素子)は、インピーダンスではなく アドミタンス(admittance) $y = 1/z$ で考えると足し算になります。並列素子は $y$ に $jb$(サセプタンス)を足すので、定コンダクタンス円に沿って点を動かすのです。整合設計では、この「直列ならインピーダンス・並列ならアドミタンス」の切り替えが核心になります。
正規化アドミタンスを $y = g + jb$ とすると、反射係数との関係はインピーダンスの式で $z \to 1/y$ と置き換えればよく、
$$ \Gamma = \frac{z – 1}{z + 1} = \frac{1/y – 1}{1/y + 1} = \frac{1 – y}{1 + y} = -\frac{y – 1}{y + 1} $$
となります。すなわち、アドミタンスに対する反射係数は、インピーダンスに対する反射係数の符号を反転させたものに等しいのです。符号反転は複素平面で「原点まわりに 180° 回転」することを意味します。
$$ \Gamma_y = -\Gamma_z = \Gamma_z \, e^{j\pi} $$
この事実から、アドミタンスのスミスチャートは、インピーダンスのスミスチャートを 180° 回転させたもの になります。実際の設計では、インピーダンスチャートの上で点を 180° 回した位置を読めばアドミタンスがわかります。定コンダクタンス円・定サセプタンス円は、定抵抗円・定リアクタンス円を 180° 回転(左右・上下とも反転)した円群です。導出は完全に同じ計算で、$r \to g$、$x \to b$ と置き換えたうえで $u \to -u$、$v \to -v$ とすればよく、定コンダクタンス円は中心 $\left(-\dfrac{g}{1+g}, 0\right)$・半径 $\dfrac{1}{1+g}$、定サセプタンス円は中心 $\left(-1, -\dfrac{1}{b}\right)$・半径 $\dfrac{1}{|b|}$ となります。
もう一つ、スミスチャート上で重要なのが「線路長による回転」です。負荷から信号源側へ距離 $\ell$ だけ離れた点で線路を見ると、反射係数は位相だけが回ります。
$$ \Gamma(\ell) = \Gamma_L \, e^{-j 2\beta \ell} $$
ここで $\beta = 2\pi/\lambda$ は位相定数です。$|\Gamma|$ は変わらず位相だけが回るので、スミスチャート上では 原点を中心とする半径一定の円(定 VSWR 円) に沿って、負荷から信号源へ向かうと時計回りに回転します。指数の肩が $2\beta\ell$ なので、線路を $\lambda/2$ 動かすと位相が $2\pi$ 回って一周し、元に戻ります。つまりスミスチャートの一周は半波長に対応します。
このように、スミスチャートでは「直列素子=定抵抗円に沿う移動」「並列素子=定コンダクタンス円に沿う移動」「線路の延長=定 VSWR 円に沿う回転」という 3 種類の動きで整合を組み立てます。次節では、まず素子 2 個で整合する L型整合を、これらの動きを使って代数的に設計します。
L型整合回路の設計と導出
最もシンプルな整合回路は、インダクタとキャパシタを 1 個ずつ、L字型に配置する L型整合(L-section matching) です。直列素子と並列素子を 1 つずつ組み合わせ、負荷インピーダンスを 50 Ω に変換します。スミスチャートの上では、「定抵抗円に沿う移動」と「定コンダクタンス円に沿う移動」を 1 回ずつ行って、負荷点から中心($\Gamma = 0$)まで到達させる操作にあたります。
ここでは、負荷 $Z_L = R_L + jX_L$ を特性インピーダンス $Z_0$(実数、たとえば 50 Ω)に整合する場合を考えます。整合回路の配置には「並列素子を負荷側、直列素子を電源側」と「直列素子を負荷側、並列素子を電源側」の 2 通りがありますが、ここでは負荷の抵抗 $R_L$ が $Z_0$ より大きいか小さいかで使い分ける標準的な構成を導きます。
負荷抵抗が $Z_0$ より大きい場合($R_L > Z_0$)
この場合は、まず負荷に 並列にサセプタンス $B$ を足し、その後 直列にリアクタンス $X$ を足して整合します。並列素子はアドミタンスで考えるので、負荷アドミタンスを $Y_L = 1/Z_L = G_L + jB_L$ とし、並列に $jB$ を足したアドミタンスを直列素子側から見たインピーダンスに変換します。
整合条件は「電源から見た全インピーダンスが $Z_0$ になること」です。並列に $jB$ を足した後のアドミタンスは $Y_L + jB$、そのインピーダンスは $1/(Y_L + jB)$、それに直列に $jX$ を足したものが $Z_0$ に等しくなければなりません。
$$ Z_0 = jX + \frac{1}{Y_L + jB} = jX + \frac{1}{(G_L + jB_L) + jB} $$
右辺第 2 項を実部・虚部に分けるため、$1/(G_L + j(B_L + B))$ の分母を実数化します。$B’ = B_L + B$ と置くと、
$$ \frac{1}{G_L + jB’} = \frac{G_L – jB’}{G_L^2 + B’^2} $$
整合のためには、この実部が $Z_0$、そして直列素子と合わせた虚部が 0 になればよいので、実部の条件は、
$$ \frac{G_L}{G_L^2 + B’^2} = Z_0 $$
これを $B’$ について解きます。両辺を入れ替えて $G_L^2 + B’^2 = G_L / Z_0$ なので、
$$ B’^2 = \frac{G_L}{Z_0} – G_L^2 $$
したがって $B’ = \pm\sqrt{G_L/Z_0 – G_L^2}$ となり、必要な並列サセプタンスは $B = B’ – B_L$ です。$\pm$ の 2 つの解は、それぞれ並列素子をキャパシタにするかインダクタにするかの選択に対応します。続いて虚部の条件から直列リアクタンスが決まります。$jX$ と第 2 項の虚部 $-B’/(G_L^2 + B’^2)$ の和がゼロなので、
$$ X = \frac{B’}{G_L^2 + B’^2} $$
ここで $G_L^2 + B’^2 = G_L/Z_0$ を代入すると、より簡潔に $X = B’ Z_0 / G_L$ と書けます。これで並列サセプタンス $B$ と直列リアクタンス $X$ が両方求まりました。
負荷抵抗が $Z_0$ より小さい場合($R_L < Z_0$)
この場合は配置を逆にし、まず 直列にリアクタンス $X$ を足してから 並列にサセプタンス $B$ を足します。直列素子はインピーダンスで考えるので、$Z_L + jX$ のアドミタンスをとり、それに並列に $jB$ を足したものが $1/Z_0$(= $Y_0$)になる条件です。
$$ Y_0 = \frac{1}{Z_0} = jB + \frac{1}{Z_L + jX} = jB + \frac{1}{(R_L + jX_L) + jX} $$
$X’ = X_L + X$ と置き、第 2 項を実数化すると $\dfrac{R_L – jX’}{R_L^2 + X’^2}$ です。実部が $1/Z_0$ になる条件から、
$$ \frac{R_L}{R_L^2 + X’^2} = \frac{1}{Z_0} $$
これを $X’$ について解くと $R_L^2 + X’^2 = R_L Z_0$、すなわち、
$$ X’^2 = R_L Z_0 – R_L^2 = R_L(Z_0 – R_L) $$
$R_L < Z_0$ なので右辺は正となり、実数解 $X' = \pm\sqrt{R_L(Z_0 - R_L)}$ が存在します。必要な直列リアクタンスは $X = X' - X_L$ です。虚部の条件から並列サセプタンスは、
$$ B = \frac{X’}{R_L^2 + X’^2} = \frac{X’}{R_L Z_0} $$
と求まります。ここでも $\pm$ の 2 解があり、片方はハイパスフィルタ型、もう片方はローパスフィルタ型の整合回路に対応します。
素子値への変換
リアクタンス $X$ とサセプタンス $B$ が求まったら、動作周波数 $f$(角周波数 $\omega = 2\pi f$)でのインダクタンスやキャパシタンスに変換します。直列素子が誘導性($X > 0$)ならインダクタ $L = X/\omega$、容量性($X < 0$)ならキャパシタ $C = -1/(\omega X)$ です。並列素子が容量性($B > 0$)ならキャパシタ $C = B/\omega$、誘導性($B < 0$)ならインダクタ $L = -1/(\omega B)$ となります。
L型整合は素子数が 2 個と最小で、必ず解が存在する(負荷が純リアクタンスでない限り)という利点があります。一方、整合できる帯域幅は素子値で一意に決まってしまい、設計の自由度が低いという制約もあります。次節では、集中定数素子を使わずに線路だけで整合する単一スタブ整合を導出し、もう一つの設計の流儀を見ていきます。
単一スタブ整合の理論と作図手順
マイクロ波帯になると、インダクタやキャパシタといった集中定数素子は寄生成分が大きくなって扱いにくくなります。そこで、伝送線路そのものを整合素子として使う スタブ整合(stub matching) が活躍します。スタブとは、本線から枝のように分岐させた短い伝送線路で、その先端を短絡または開放しておくと、長さに応じて任意のリアクタンス(サセプタンス)を作り出せます。単一スタブ整合では、本線上のある位置にスタブを 1 本だけ並列または直列に接続して整合をとります。
ここでは最もよく使われる 並列単一スタブ整合(shunt single-stub matching) を導出します。アイデアはこうです。負荷から本線をたどっていくと、ある位置でアドミタンスの実部(コンダクタンス)がちょうど $Y_0$(正規化すれば $1$)に等しくなる地点が見つかります。その地点では正規化アドミタンスが $y = 1 + jb$ という形をしており、虚部 $jb$ さえ打ち消せば $y = 1$、すなわち完全整合になります。この $jb$ を打ち消すために、適切な長さのスタブを並列に接続して $-jb$ のサセプタンスを供給するのです。
設計手順は次の 2 段階に分かれます。
- スタブを接続する 位置 $d$ を決める(コンダクタンスが $Y_0$ になる地点を探す)
- 残った虚部を打ち消す スタブの長さ $\ell$ を決める
ステップ1: スタブ位置 $d$ の導出
正規化負荷インピーダンスを $z_L = Z_L/Z_0$、対応する反射係数を $\Gamma_L = (z_L – 1)/(z_L + 1)$ とします。負荷から距離 $d$ だけ電源側に進んだ点での反射係数は、前述の通り位相が回って、
$$ \Gamma(d) = \Gamma_L \, e^{-j2\beta d} $$
この点での正規化アドミタンスを $y(d) = g(d) + jb(d)$ とします。スタブを接続できるのは $g(d) = 1$ となる位置です。アドミタンスと反射係数の関係 $y = (1 – \Gamma)/(1 + \Gamma)$ を使うと、$\Gamma(d) = |\Gamma_L| e^{j(\theta – 2\beta d)}$($\theta$ は $\Gamma_L$ の偏角)と書いたうえで $g(d) = 1$ を課すことになります。
少し計算を進めましょう。$\Gamma = u + jv$ のとき、アドミタンスの実部(コンダクタンス)は定抵抗円・定コンダクタンス円の導出と同様に、
$$ g = \frac{1 – u^2 – v^2}{(1 + u)^2 + v^2} $$
となります(インピーダンスの $r$ の式で $u \to -u$ としたもの)。$g = 1$ という条件は $1 – u^2 – v^2 = (1+u)^2 + v^2$、整理すると $1 – u^2 – v^2 = 1 + 2u + u^2 + v^2$、すなわち $2u^2 + 2v^2 + 2u = 0$、よって、
$$ u^2 + v^2 + u = 0 \quad\Longleftrightarrow\quad |\Gamma|^2 = -u $$
つまり $g = 1$ の軌跡は、$|\Gamma|^2 = u^2 + v^2$ が $-u$ に等しくなる点の集合(中心 $(-1/2, 0)$・半径 $1/2$ の円)です。負荷の定 VSWR 円(半径 $|\Gamma_L|$)とこの $g=1$ 円との交点が、スタブを接続できる候補位置になります。一般に 2 つの交点があり、これが「スタブ位置に 2 つの解がある」ことの幾何的な理由です。
実用上は、定 VSWR 円上で負荷点から時計回り(電源側)に回転していき、$g = 1$ 円と最初に交わるところまでの回転角から距離 $d$ を求めます。回転角 $\phi = 2\beta d$ と距離 $d = \phi/(2\beta) = \phi \lambda/(4\pi)$ の関係を使えば、波長で規格化した位置が得られます。Python 実装では、$d$ を細かく動かしながら $g(d) = 1$ となる最小の $d$ を数値的に探す方法が簡単で確実です。
ステップ2: スタブ長 $\ell$ の導出
スタブ位置 $d$ が決まると、その点でのアドミタンスは $y(d) = 1 + jb_0$ という形になります($b_0$ はその点の残留サセプタンス)。並列に接続するスタブは、ちょうど $-jb_0$ のサセプタンスを供給して虚部を打ち消す必要があります。
スタブは先端を短絡または開放した長さ $\ell$ の線路です。先端短絡スタブの入力アドミタンス(正規化)は、伝送線路のインピーダンス変換式から、
$$ y_{\text{stub}}^{\text{short}} = -j\cot(\beta \ell) $$
先端開放スタブの場合は、
$$ y_{\text{stub}}^{\text{open}} = +j\tan(\beta \ell) $$
となります。たとえば先端短絡スタブで $-jb_0$ を作りたいなら、$-\cot(\beta\ell) = -b_0$、すなわち $\cot(\beta\ell) = b_0$ を満たす最小の $\ell$ を求めればよいことになります。
$$ \beta \ell = \mathrm{arccot}(b_0) \quad\Longrightarrow\quad \ell = \frac{1}{\beta}\,\mathrm{arccot}(b_0) = \frac{\lambda}{2\pi}\,\mathrm{arccot}(b_0) $$
$\mathrm{arccot}$ が負の値を返した場合は、線路の長さは正でなければならないので $\pi$ を足して最小の正の長さに直します。開放スタブを使う場合は $\tan(\beta\ell) = -b_0$ から同様に $\ell$ を求めます。
こうして、スタブ位置 $d$ とスタブ長 $\ell$ という 2 つのパラメータで整合が完成します。集中定数素子を一切使わず、線路の長さだけで反射ゼロを実現できるのがスタブ整合の魅力です。次節では、具体的な負荷インピーダンスを例にとって、L型整合とスタブ整合の素子値・寸法を実際に数値で求めてみましょう。
具体例 — 数値で確かめる
理論式が出そろったので、具体的な負荷で計算してみましょう。負荷インピーダンスを $Z_L = 100 + j50\ \Omega$、特性インピーダンスを $Z_0 = 50\ \Omega$、動作周波数を $f = 1\ \mathrm{GHz}$ とします。正規化すると $z_L = 2 + j1$ で、抵抗部 $R_L = 100\ \Omega$ は $Z_0 = 50\ \Omega$ より大きいので、L型整合では「並列素子を先に、直列素子を後に」の構成を使います。
まず反射係数を計算しておきます。
$$ \Gamma_L = \frac{z_L – 1}{z_L + 1} = \frac{(2 + j1) – 1}{(2 + j1) + 1} = \frac{1 + j1}{3 + j1} $$
分母を実数化すると $\dfrac{(1+j)(3-j)}{(3+j)(3-j)} = \dfrac{3 – j + 3j + 1}{9 + 1} = \dfrac{4 + 2j}{10} = 0.4 + j0.2$ です。したがって $|\Gamma_L| = \sqrt{0.4^2 + 0.2^2} \approx 0.447$、VSWR は $(1+0.447)/(1-0.447) \approx 2.6$ となり、整合前はそこそこ反射があることがわかります。
L型整合($R_L > Z_0$ の構成)では、負荷アドミタンス $Y_L = 1/Z_L$ を使います。$Z_L = 100 + j50$ なので $Y_L = \dfrac{1}{100 + j50} = \dfrac{100 – j50}{100^2 + 50^2} = \dfrac{100 – j50}{12500} = 0.008 – j0.004\ \mathrm{S}$。すなわち $G_L = 0.008\ \mathrm{S}$、$B_L = -0.004\ \mathrm{S}$ です。並列サセプタンスの導出式 $B’^2 = G_L/Z_0 – G_L^2$ に代入すると、$B’^2 = 0.008/50 – 0.008^2 = 1.6\times10^{-4} – 6.4\times10^{-5} = 9.6\times10^{-5}$ となり、$B’ \approx \pm 9.8\times10^{-3}\ \mathrm{S}$ です。必要な並列サセプタンスは $B = B’ – B_L = 9.8\times10^{-3} – (-0.004) \approx 1.38\times10^{-2}\ \mathrm{S}$(正の解を選んだ場合)で、これは容量性なので並列キャパシタ $C = B/\omega = 1.38\times10^{-2}/(2\pi\times10^9) \approx 2.2\ \mathrm{pF}$ に相当します。
続いて直列リアクタンスは $X = B’ Z_0 / G_L = 9.8\times10^{-3} \times 50 / 0.008 \approx 61.3\ \Omega$ で、正(誘導性)なので直列インダクタ $L = X/\omega = 61.3/(2\pi\times10^9) \approx 9.8\ \mathrm{nH}$ になります。こうして「並列に 2.2 pF のキャパシタ、直列に 9.8 nH のインダクタ」という L型整合回路が得られました。値は実装するときの寄生成分や手に入る部品の刻みに合わせて微調整しますが、設計の出発点としては十分です。
単一スタブ整合の場合は、定 VSWR 円(半径 $|\Gamma_L| \approx 0.447$)と $g = 1$ 円の交点を探します。これは手計算では繁雑なので、まさに Python で数値的に解くのに向いた問題です。次節で、スミスチャートの描画と両方の整合の自動設計をまとめて実装します。計算結果が上の手計算と一致するかどうかも、よい検算になります。
Python による実装
ここからは Python でスミスチャートを描画し、与えた負荷から L型整合とスタブ整合を自動設計して、整合の軌跡を可視化します。理論で導いた円の方程式や整合条件がそのままコードになることを実感してください。
スミスチャートの描画
まず、定抵抗円・定リアクタンス円を描いてスミスチャートの土台を作ります。前節で導いた円の中心と半径の式をそのまま使います。
import numpy as np
import matplotlib.pyplot as plt
def draw_smith_chart(ax):
"""定抵抗円・定リアクタンス円を描いてスミスチャートを構成する"""
theta = np.linspace(0, 2 * np.pi, 400)
# 外周(|Γ|=1 の単位円)
ax.plot(np.cos(theta), np.sin(theta), 'k', lw=1.5)
# 定抵抗円: 中心 (r/(1+r), 0), 半径 1/(1+r)
for r in [0.2, 0.5, 1.0, 2.0, 5.0]:
cx = r / (1 + r)
rad = 1 / (1 + r)
ax.plot(cx + rad * np.cos(theta), rad * np.sin(theta),
color='gray', lw=0.6)
# 定リアクタンス円: 中心 (1, 1/x), 半径 1/|x| (単位円内のみ描画)
for x in [0.2, 0.5, 1.0, 2.0, 5.0]:
for sign in (+1, -1):
xx = sign * x
cy = 1 / xx
rad = 1 / abs(xx)
u = 1 + rad * np.cos(theta)
v = cy + rad * np.sin(theta)
inside = u**2 + v**2 <= 1.0 + 1e-9
ax.plot(u[inside], v[inside], color='gray', lw=0.6)
ax.plot([-1, 1], [0, 0], color='gray', lw=0.6) # 実軸
ax.set_aspect('equal')
ax.set_xlim(-1.15, 1.15)
ax.set_ylim(-1.15, 1.15)
ax.axis('off')
fig, ax = plt.subplots(figsize=(7, 7))
draw_smith_chart(ax)
ax.set_title('Smith Chart (constant-r and constant-x circles)')
plt.tight_layout()
plt.show()
このコードを実行すると、おなじみの円形のスミスチャートが描かれます。右端の点 $(1, 0)$ をすべての円が通っていることに注目してください。これは定抵抗円・定リアクタンス円の方程式が、いずれも $(1,0)$ を解に持つことの可視化です。横軸が純抵抗(実軸)、上半分が誘導性リアクタンス、下半分が容量性リアクタンスに対応しており、左端 $(-1,0)$ が短絡($z=0$)、右端 $(1,0)$ が開放($z\to\infty$)、中心 $(0,0)$ が整合点($z=1$)です。
反射係数とインピーダンスの相互変換
次に、双一次変換の式をそのまま関数にしておきます。これが整合計算のすべての土台になります。
import numpy as np
def z_to_gamma(z):
"""正規化インピーダンス z から反射係数 Γ を計算"""
return (z - 1) / (z + 1)
def gamma_to_z(gamma):
"""反射係数 Γ から正規化インピーダンス z を計算"""
return (1 + gamma) / (1 - gamma)
def vswr(gamma):
"""反射係数の大きさから VSWR を計算"""
g = abs(gamma)
return (1 + g) / (1 - g)
# 具体例: Z_L = 100 + j50, Z0 = 50
Z0 = 50.0
ZL = 100 + 50j
zL = ZL / Z0
gL = z_to_gamma(zL)
print(f"正規化負荷 z_L = {zL}")
print(f"反射係数 Γ_L = {gL:.4f}, |Γ_L| = {abs(gL):.4f}")
print(f"VSWR = {vswr(gL):.3f}")
この出力では、$z_L = 2 + j1$、$\Gamma_L = 0.4 + j0.2$、$|\Gamma_L| \approx 0.447$、VSWR $\approx 2.62$ と表示され、前節の手計算と完全に一致します。双一次変換の式をコードに落とすだけで、インピーダンス・反射係数・VSWR が自在に行き来できることがわかります。
L型整合回路の自動設計
導出した L型整合の素子値計算を関数化します。$R_L$ と $Z_0$ の大小で構成を切り替えます。
import numpy as np
def design_l_match(ZL, Z0, f):
"""L型整合の素子値を計算する。
返り値: 構成の説明と (並列素子, 直列素子) の素子値"""
w = 2 * np.pi * f
RL, XL = ZL.real, ZL.imag
results = []
if RL > Z0:
# 並列素子を負荷側、直列素子を電源側
YL = 1 / ZL
GL, BL = YL.real, YL.imag
for sign in (+1, -1):
Bp = sign * np.sqrt(GL / Z0 - GL**2) # B'
B = Bp - BL # 並列サセプタンス
X = Bp * Z0 / GL # 直列リアクタンス
results.append(("R_L>Z0 (並列→直列)", B, X))
else:
# 直列素子を負荷側、並列素子を電源側
for sign in (+1, -1):
Xp = sign * np.sqrt(RL * (Z0 - RL)) # X'
X = Xp - XL # 直列リアクタンス
B = Xp / (RL * Z0) # 並列サセプタンス
results.append(("R_L<Z0 (直列→並列)", B, X))
return results, w
def to_component(B, X, w):
"""サセプタンス B, リアクタンス X を素子値(pF, nH)に変換"""
# 並列素子
if B > 0:
shunt = f"並列C = {B / w * 1e12:.2f} pF"
else:
shunt = f"並列L = {-1 / (w * B) * 1e9:.2f} nH"
# 直列素子
if X > 0:
series = f"直列L = {X / w * 1e9:.2f} nH"
else:
series = f"直列C = {-1 / (w * X) * 1e12:.2f} pF"
return shunt, series
Z0, f = 50.0, 1e9
ZL = 100 + 50j
sols, w = design_l_match(ZL, Z0, f)
for desc, B, X in sols:
shunt, series = to_component(B, X, w)
print(f"{desc}: {shunt}, {series}")
この出力には 2 つの解が表示されます。正の解では「並列 C ≈ 2.20 pF、直列 L ≈ 9.75 nH」となり、前節の手計算とほぼ一致します(端数は丸めの違い)。もう一方の解は「並列 L、直列 C」のハイパス型構成です。2 つの解はどちらも整合をとれますが、低周波側を通すか高周波側を通すかという通過特性の違いがあり、用途に応じて選びます。L型整合は必ず 2 解持つという理論的事実が、コードの出力にもそのまま現れています。
単一スタブ整合の自動設計
スタブ整合は、定 VSWR 円上を回転しながら $g = 1$ となる位置を数値的に探し、その点の残留サセプタンスを打ち消すスタブ長を求めます。
import numpy as np
def design_stub_match(ZL, Z0, stub="short", n_search=20000):
"""並列単一スタブ整合の位置 d/λ とスタブ長 ℓ/λ を求める"""
zL = ZL / Z0
gammaL = (zL - 1) / (zL + 1)
mag = abs(gammaL)
phaseL = np.angle(gammaL)
# 負荷から電源側へ d だけ進む => Γ(d) = Γ_L * exp(-j*2*beta*d)
# 2*beta*d = 2*(2π/λ)*d なので d/λ を 0..0.5 で走査(一周=λ/2)
dl = np.linspace(0, 0.5, n_search) # d/λ
rot = phaseL - 2 * (2 * np.pi) * dl # Γ(d) の偏角
gamma_d = mag * np.exp(1j * rot)
y_d = (1 - gamma_d) / (1 + gamma_d) # 正規化アドミタンス
g_d, b_d = y_d.real, y_d.imag
# g(d) = 1 に最も近い位置を探す
idx = np.argmin(np.abs(g_d - 1.0))
d_sol = dl[idx]
b0 = b_d[idx] # 残留サセプタンス
# スタブで -b0 を供給する長さを求める
if stub == "short":
# y_stub = -j cot(βℓ) = -j b0 => cot(βℓ) = b0
bl = np.arctan2(1.0, b0) # βℓ = arccot(b0)
else: # open
# y_stub = +j tan(βℓ) = -j b0 => tan(βℓ) = -b0
bl = np.arctan2(-b0, 1.0)
if bl < 0:
bl += np.pi
l_sol = bl / (2 * np.pi) # ℓ/λ
return d_sol, l_sol, b0
Z0 = 50.0
ZL = 100 + 50j
for stub in ("short", "open"):
d, l, b0 = design_stub_match(ZL, Z0, stub=stub)
print(f"{stub:5s}スタブ: 位置 d = {d:.4f} λ, "
f"長さ ℓ = {l:.4f} λ, 残留サセプタンス b0 = {b0:+.4f}")
この出力では、短絡スタブ・開放スタブそれぞれについて、波長で規格化したスタブ位置 $d/\lambda$ とスタブ長 $\ell/\lambda$ が表示されます。位置 $d$ は両者で同じ(コンダクタンスが 1 になる点は同一)ですが、スタブ長は短絡か開放かで $\lambda/4$ だけずれます。残留サセプタンス $b_0$ がほぼ 0 でない有限値として表示され、それをスタブで打ち消す設計になっていることが読み取れます。集中定数素子を一切使わずに線路長だけで整合できるのが確認できます。
整合の軌跡をスミスチャート上で可視化
最後に、L型整合とスタブ整合の「軌跡」をスミスチャート上に重ねて描き、負荷点が中心($\Gamma=0$)へ移動していく様子を可視化します。
import numpy as np
import matplotlib.pyplot as plt
def stub_trajectory(ZL, Z0, n=200):
"""スタブ整合の軌跡: 負荷→(線路で移動)→(スタブで虚部消去)→中心"""
d, l, b0 = design_stub_match(ZL, Z0, stub="short")
zL = ZL / Z0
gammaL = (zL - 1) / (zL + 1)
mag, phaseL = abs(gammaL), np.angle(gammaL)
# 区間1: 定VSWR円に沿って d まで回転
dd = np.linspace(0, d, n)
g1 = mag * np.exp(1j * (phaseL - 2 * (2 * np.pi) * dd))
# 区間2: g=1 円上を、サセプタンスを 0 に向けて移動
y_start = (1 - g1[-1]) / (1 + g1[-1])
b_path = np.linspace(y_start.imag, 0.0, n)
y2 = 1.0 + 1j * b_path
g2 = (1 - y2) / (1 + y2) # アドミタンス→反射係数(=−Γ_z)。Γ表示に戻す
g2 = -(-g2) # ここでは y から直接 Γ を計算済み
return g1, (y2, g2)
# 描画
fig, ax = plt.subplots(figsize=(7, 7))
draw_smith_chart(ax)
Z0 = 50.0
ZL = 100 + 50j
zL = ZL / Z0
gammaL = (zL - 1) / (zL + 1)
# スタブ整合の区間1(線路に沿う回転)を描く
d, l, b0 = design_stub_match(ZL, Z0, stub="short")
mag, phaseL = abs(gammaL), np.angle(gammaL)
dd = np.linspace(0, d, 200)
g1 = mag * np.exp(1j * (phaseL - 2 * (2 * np.pi) * dd))
ax.plot(g1.real, g1.imag, 'r', lw=2, label='line rotation (const-VSWR)')
# 定VSWR円
th = np.linspace(0, 2*np.pi, 300)
ax.plot(mag*np.cos(th), mag*np.sin(th), 'r--', lw=0.8, alpha=0.6)
# 負荷点と整合点
ax.plot(gammaL.real, gammaL.imag, 'bo', ms=9, label='load $\\Gamma_L$')
ax.plot(0, 0, 'g*', ms=16, label='matched ($\\Gamma=0$)')
ax.plot(g1[-1].real, g1[-1].imag, 'ms', ms=8, label='stub point (g=1)')
ax.legend(loc='upper left', fontsize=9)
ax.set_title('Single-Stub Matching Trajectory on Smith Chart')
plt.tight_layout()
plt.show()
このグラフから、整合の幾何が一目でわかります。青丸の負荷点 $\Gamma_L$ から赤い実線(破線の定 VSWR 円に沿う)をたどると、線路を延長するにつれて点が時計回りに回転し、紫の四角($g=1$ 円との交点=スタブ接続位置)に到達します。ここでスタブが残りのサセプタンスを打ち消すと、点は $g=1$ 円に沿って緑の星(中心=整合点 $\Gamma=0$)へ移動します。半径一定の回転と円弧に沿う移動という 2 段階で、反射が完全に消える様子が視覚的に確認できます。線路長による移動が「半径を変えずに回す」操作、スタブによる移動が「虚部を消す」操作だという理論が、そのまま軌跡として現れているのです。
整合前後の周波数特性
整合がうまくいったかを確認する実用的な指標は、周波数を振ったときの反射損失($|\Gamma|$ や VSWR)です。L型整合を施した回路について、周波数特性を計算してみましょう。
import numpy as np
import matplotlib.pyplot as plt
Z0, f0 = 50.0, 1e9
ZL0 = 100 + 50j # 設計周波数での負荷(簡単のため周波数一定と仮定)
w0 = 2 * np.pi * f0
# 設計した L型整合(並列C, 直列L の正解側)
B = 1.38e-2 # 並列サセプタンス [S](設計値)
X = 61.3 # 直列リアクタンス [Ω](設計値)
C_sh = B / w0 # 並列キャパシタ
L_se = X / w0 # 直列インダクタ
freqs = np.linspace(0.5e9, 1.5e9, 500)
gamma_in = []
for f in freqs:
w = 2 * np.pi * f
# 負荷に並列キャパシタを足す(アドミタンス加算)
Y = 1 / ZL0 + 1j * w * C_sh
Z_par = 1 / Y
# 直列インダクタを足す(インピーダンス加算)
Zin = Z_par + 1j * w * L_se
gamma_in.append((Zin - Z0) / (Zin + Z0))
gamma_in = np.array(gamma_in)
vswr_in = (1 + np.abs(gamma_in)) / (1 - np.abs(gamma_in))
fig, ax = plt.subplots(1, 2, figsize=(13, 5))
ax[0].plot(freqs / 1e9, 20 * np.log10(np.abs(gamma_in)))
ax[0].set_xlabel('Frequency [GHz]'); ax[0].set_ylabel('Return loss $20\\log|\\Gamma|$ [dB]')
ax[0].axvline(1.0, color='r', ls='--', alpha=0.6); ax[0].grid(alpha=0.3)
ax[0].set_title('Return Loss after L-match')
ax[1].plot(freqs / 1e9, vswr_in)
ax[1].set_xlabel('Frequency [GHz]'); ax[1].set_ylabel('VSWR')
ax[1].axvline(1.0, color='r', ls='--', alpha=0.6); ax[1].grid(alpha=0.3)
ax[1].set_title('VSWR after L-match')
plt.tight_layout()
plt.show()
左のグラフでは、設計周波数 1 GHz(赤い破線)で反射損失 $20\log|\Gamma|$ が深い谷(理想的には $-\infty$ dB)を示し、その周りで急激に浅くなっていく様子が見えます。右のグラフでは、同じ 1 GHz で VSWR が 1 に近づき、周波数が離れると増大します。これは L型整合が「特定の 1 周波数で完全整合し、その周辺だけで効く狭帯域整合」であることを示しています。広い帯域で整合したい場合は、段数を増やしたり(多段整合)、$\lambda/4$ 変成器を多段にしたりする必要があります。スタブ整合も同様に狭帯域であり、帯域幅の拡大は次のステップの課題になります。
まとめ
本記事では、スミスチャートを使った整合回路設計を、幾何の導出から Python による自動設計まで一気通貫で解説しました。
- 双一次変換 $z = (1+\Gamma)/(1-\Gamma)$ と $\Gamma = (z-1)/(z+1)$ が、無限に広いインピーダンス平面を半径 1 の反射係数円板に対応づける。この変換が「円を円に写す」性質を持つことがスミスチャートの幾何の根源です。
- 定抵抗円(中心 $(r/(1+r),0)$・半径 $1/(1+r)$)と 定リアクタンス円(中心 $(1,1/x)$・半径 $1/|x|$)を座標計算から導出し、両者が直交する目盛り格子をなすことを確認しました。アドミタンス表示はチャートを 180° 回転したものに対応します。
- L型整合 は $R_L$ と $Z_0$ の大小で構成を切り替え、$B’^2 = G_L/Z_0 – G_L^2$ や $X’^2 = R_L(Z_0 – R_L)$ から素子値を代数的に求められ、常に 2 つの解(ローパス型・ハイパス型)を持ちます。
- 単一スタブ整合 は、定 VSWR 円と $g=1$ 円の交点からスタブ位置 $d$ を、残留サセプタンスを打ち消す条件からスタブ長 $\ell$ を決めます。線路長だけで整合できるためマイクロ波帯で重宝します。
- Python では双一次変換・L型整合・スタブ整合をそれぞれ関数化し、整合の軌跡をスミスチャート上に描いて、負荷点が中心へ移動する様子を可視化しました。周波数特性からは、これらが狭帯域整合であることも確認できました。
スミスチャートは「計算の道具」であると同時に「設計のセンスを養う図」です。直列素子・並列素子・線路長がそれぞれチャート上でどう点を動かすかが体に入ると、複雑な整合回路も直感的に組み立てられるようになります。
次のステップとして、以下の記事も参考にしてください。