L形整合回路による共役インピーダンス整合を理解して実装する

アンテナの設計図を引き終えて、いざ送信機につないでみると放射電力が思ったように出ない。テスターで測ってみるとアンテナの入力インピーダンスは $30 – j40\ \Omega$ で、送信機が前提とする $50\ \Omega$ とはまるで一致していない。このとき送信機が送り出した電力の一部はアンテナに吸収されず、給電線を逆走して送信機に戻ってきてしまいます。これが「反射」であり、無線機器の効率を蝕む最大の敵の一つです。送信機とアンテナの「インピーダンスの食い違い」を吸収し、電源から負荷へ電力を最大限に送り込むための小さな回路 — それが整合回路(matching network)です。

整合回路の中でもっとも基本的で、もっとも頻繁に使われるのが、コイルとコンデンサをわずか 2 個だけ組み合わせた L形整合回路(L-network) です。たった 2 素子で「任意の複素インピーダンス」を「望みの実数インピーダンス」へ変換できる、というのは一見すると魔法のようですが、その背後には最大電力伝送の共役整合条件という明快な物理法則と、等抵抗円・等コンダクタンス円というスミスチャートの幾何学が隠れています。本記事では、この L形整合回路を設計式の導出から Python 実装まで、一歩ずつ丁寧に解き明かしていきます。

L形整合を理解すると、次のような場面で設計の見通しが一気に開けます。

  • アンテナ給電: ダイポールやモノポール、チップアンテナの複素入力インピーダンスを送信機の $50\ \Omega$ に合わせ、放射効率と帯域を両立させる
  • RF増幅器の入出力整合: トランジスタの入力・出力インピーダンスを伝送線路に整合させ、利得とノイズ性能を最大化する
  • 無線電力伝送・RFID: 送電コイルと受電コイルの整合をとり、結合効率を最大化する
  • 計測・センサ: 圧電素子や超音波トランスデューサの高インピーダンスを計測系に整合させ、SN比を高める

本記事の内容

  • なぜ整合が必要か — 最大電力伝送定理と共役整合条件の導出
  • L形整合回路の 2 つの基本構成(負荷昇圧型・負荷降圧型)
  • 直列・並列リアクタンスがインピーダンスをどう動かすか(正規化アドミタンスと等円の幾何)
  • 設計式の完全な導出 — 回路 $Q$ から $L$ 値・$C$ 値を解析的に求める
  • 8 通りのトポロジ(高域通過 / 低域通過 × 4 配置)の選び方
  • 回路 $Q$ と帯域幅の関係
  • Python 実装: 複素負荷 $Z_L$ と目標 $Z_0$ から素子値を算出する設計関数
  • スミスチャート風のインピーダンス軌跡と $|S_{11}|$ の周波数特性の可視化

前提知識

この記事を読む前に、以下の記事を読んでおくと理解が深まります。

整合とは — なぜインピーダンスを合わせるのか

整合という言葉のイメージをつかむために、まず水道のホースを思い浮かべてください。太いホースの先に細いノズルをいきなり繋ぐと、水は勢いよく出るどころか、接合部で水流が乱れて跳ね返り、せっかくの水圧が無駄になります。両者の「流れやすさ」が食い違うほど、無駄な跳ね返り(反射)が大きくなる。電気回路でも全く同じことが起こり、電源(送信機)の出力インピーダンスと負荷(アンテナ)のインピーダンスが食い違うと、電力は負荷に届かず反射して戻ってきます。

電気回路における「流れやすさの食い違い」を埋め、電源から負荷へ電力を余すことなく送り届ける橋渡しが整合です。具体的に何を合わせればよいのか、その答えは最大電力伝送定理が教えてくれます。

直感: 反射が起こると何が損なのか

送信機が $50\ \Omega$ の系を前提に作られているのに、アンテナが $50\ \Omega$ でなければ、給電線の途中で電圧波・電流波の一部が跳ね返ります。跳ね返った波は送信機方向に戻り、進行波と重なって定在波を作ります。定在波が大きいほど、給電線上には電圧の腹(とても高い電圧)が現れ、最悪の場合は送信機の保護回路が働いて出力を絞ったり、ケーブルが絶縁破壊を起こしたりします。

反射の大きさは反射係数 $\Gamma$ で表され、負荷インピーダンス $Z_L$ と特性インピーダンス $Z_0$ から次のように決まります。

$$ \Gamma = \frac{Z_L – Z_0}{Z_L + Z_0} $$

$Z_L = Z_0$ のとき $\Gamma = 0$ となり、反射はゼロです。整合の目標は、整合回路を負荷に付け加えることで、送信機から見たインピーダンス $Z_{\text{in}}$ を $Z_0$(典型的には $50\ \Omega$)に等しくし、$\Gamma = 0$ を実現することにほかなりません。

反射係数の大きさは、リターンロス $\mathrm{RL} = -20\log_{10}|\Gamma|$ [dB] や、定在波比 $\mathrm{VSWR} = (1+|\Gamma|)/(1-|\Gamma|)$ といった指標に換算されます。本記事ではこのあと、整合回路を入れる前後で $|\Gamma|$(散乱パラメータの $|S_{11}|$ に等しい)がどう変わるかを Python で可視化します。では、なぜ「インピーダンスを等しくする」と電力が最大になるのか、その根拠を最大電力伝送定理から導きましょう。

最大電力伝送定理と共役整合条件

問題設定

内部インピーダンス $Z_s = R_s + jX_s$ を持つ電源(起電力 $V_s$)に、負荷 $Z_L = R_L + jX_L$ を接続した直列回路を考えます。私たちが知りたいのは、「負荷で消費される電力 $P_L$ を最大にするには、$Z_L$ をどう選べばよいか」という問いです。

回路を流れる電流の振幅 $I$ は、電源電圧を直列インピーダンスの和で割ったものです。

$$ I = \frac{V_s}{Z_s + Z_L} = \frac{V_s}{(R_s + R_L) + j(X_s + X_L)} $$

負荷で消費される平均電力は、負荷の抵抗成分 $R_L$ に電流の実効値の 2 乗を掛けたものです。振幅 $|I|$ を用いると、

$$ P_L = \frac{1}{2} |I|^2 R_L = \frac{1}{2} \frac{|V_s|^2 R_L}{(R_s + R_L)^2 + (X_s + X_L)^2} $$

ここで係数 $1/2$ は振幅から実効値への変換(正弦波の場合)から来ています。この $P_L$ を $R_L$ と $X_L$ について最大化するのが目標です。

リアクタンス成分の最適化

まず $X_L$ に注目します。$P_L$ の分母には $(X_s + X_L)^2$ という、必ず 0 以上の項があります。分子は $X_L$ を含まないので、$P_L$ を大きくするには分母をできるだけ小さくすればよく、$(X_s + X_L)^2$ を最小にする選択は明らかです。

$$ X_s + X_L = 0 \quad \Longrightarrow \quad X_L = -X_s $$

つまり、負荷のリアクタンスは電源のリアクタンスと符号が逆で大きさが等しいものを選びます。電源が誘導性($X_s > 0$)なら負荷は容量性に、電源が容量性なら負荷は誘導性にして、両者のリアクタンスを打ち消し合わせるわけです。このとき $P_L$ は次のように簡単になります。

$$ P_L = \frac{1}{2} \frac{|V_s|^2 R_L}{(R_s + R_L)^2} $$

抵抗成分の最適化

次に、リアクタンスを打ち消した上で $R_L$ を最適化します。$P_L$ を $R_L$ で微分して 0 と置きます。分子 $R_L$、分母 $(R_s + R_L)^2$ の商の微分なので、商の微分公式を使うと、

$$ \frac{dP_L}{dR_L} = \frac{|V_s|^2}{2} \cdot \frac{(R_s + R_L)^2 – R_L \cdot 2(R_s + R_L)}{(R_s + R_L)^4} $$

分子が 0 になる条件を求めます。共通因子 $(R_s + R_L)$ で約分すると、

$$ (R_s + R_L) – 2R_L = 0 \quad \Longrightarrow \quad R_s – R_L = 0 \quad \Longrightarrow \quad R_L = R_s $$

すなわち、負荷の抵抗成分は電源の抵抗成分に等しく選びます。

共役整合条件

リアクタンス条件 $X_L = -X_s$ と抵抗条件 $R_L = R_s$ をまとめると、最大電力伝送を実現する負荷インピーダンスは、

$$ \boxed{Z_L = R_s – jX_s = Z_s^{*}} $$

となります。$Z_s^{*}$ は $Z_s$ の複素共役です。この条件を共役整合(conjugate match) と呼びます。電源から見た負荷側のインピーダンスが、電源インピーダンスの複素共役に等しくなったとき、負荷へ送り込まれる電力が最大になるのです。

整合回路の役割は、この共役整合条件を作り出すことです。実際の設計では、送信機の出力インピーダンスを実数の $Z_0 = 50\ \Omega$($X_s = 0$)と見なすことが多く、その場合の共役整合条件は単に「送信機から整合回路の入口を見たインピーダンス $Z_{\text{in}}$ が $50\ \Omega$ の実数になること」です。すなわち $Z_{\text{in}} = Z_0$ を実現すれば、反射係数 $\Gamma = 0$ となり整合が完成します。

このとき負荷に届く最大電力は $X_L = -X_s,\ R_L = R_s$ を代入して、

$$ P_{L,\max} = \frac{|V_s|^2}{8 R_s} $$

となります。電源が持つ電力の半分が負荷に、残り半分が電源内部抵抗で消費される、という有名な結果です。ここまでで「何を目指せばよいか」($Z_{\text{in}} = Z_0$)がはっきりしました。次は、コイルとコンデンサという 2 つの素子を使って、複素負荷をどうやって $Z_0$ まで引っ張っていくのか、その「動かし方」を見ていきましょう。

リアクタンスでインピーダンスを動かす — 直列と並列の幾何

整合回路の設計を理解する鍵は、「リアクタンス素子を 1 個加えると、インピーダンスがどう動くか」を頭の中で描けるようになることです。ここではスミスチャートの背景にある幾何学を、インピーダンス平面とアドミタンス平面の両方で押さえます。

直列リアクタンス: 抵抗を変えずにリアクタンスだけ動かす

負荷 $Z_L = R_L + jX_L$ に、リアクタンス $jX$ の素子(コイルなら $X = \omega L > 0$、コンデンサなら $X = -1/(\omega C) < 0$)を直列に接続すると、合成インピーダンスは単純な足し算になります。

$$ Z = Z_L + jX = R_L + j(X_L + X) $$

ここで重要なのは、抵抗成分 $R_L$ は変わらず、リアクタンス成分だけが上下するという点です。インピーダンス平面(横軸 $R$、縦軸 $X$)で考えると、点 $Z_L$ は縦線 $R = R_L$ に沿って上下に動きます。直列素子では抵抗を動かせないので、これだけでは任意の点に到達できません。

並列リアクタンス: アドミタンス平面で考える

並列接続の場合は、インピーダンスではなくアドミタンス $Y = 1/Z = G + jB$($G$ はコンダクタンス、$B$ はサセプタンス)で考えるのが定石です。なぜなら、並列に素子を加えるとアドミタンスが足し算になるからです。負荷アドミタンス $Y_L = G_L + jB_L$ にサセプタンス $jB$ の素子を並列接続すると、

$$ Y = Y_L + jB = G_L + j(B_L + B) $$

今度はコンダクタンス $G_L$ が変わらず、サセプタンス成分だけが動きます。アドミタンス平面(横軸 $G$、縦軸 $B$)では、点は縦線 $G = G_L$ に沿って上下します。

等抵抗円・等コンダクタンス円としての見え方

スミスチャートは、この 2 つの平面の操作を 1 枚の円形図に重ねたものです。インピーダンス平面の縦線 $R = \text{const}$ はスミスチャート上では等抵抗円に、アドミタンス平面の縦線 $G = \text{const}$ は等コンダクタンス円に写ります。すなわち、

  • 直列リアクタンス → 等抵抗円に沿って点を動かす
  • 並列サセプタンス → 等コンダクタンス円に沿って点を動かす

L形整合とは、この 2 種類の円弧を 1 本ずつ使って、任意の負荷点をスミスチャートの中心($Z_0$、整合点)まで運ぶ操作にほかなりません。「直列で動かす円」と「並列で動かす円」がちょうど中心を通る点で交わるように素子値を選べば、わずか 2 ステップで整合が完成します。

なぜ 2 素子で足りるのか

整合の目標は、複素数 $Z_{\text{in}}$ を望みの複素数(ここでは実数 $Z_0$)に一致させることです。複素数を合わせるとは、実部と虚部という 2 つの条件を同時に満たすことです。2 つの条件を満たすには、調整できる自由度が 2 つあればよく、リアクタンス素子 2 個がちょうどその 2 自由度を提供します。これが「L形 2 素子で任意の負荷を整合できる」ことの本質です。

次のセクションでは、この幾何学的な動かし方を具体的な計算に落とし込み、回路 $Q$ を介して $L$ 値・$C$ 値を解析的に求める設計式を導出します。

L形整合回路の設計式の導出

2 つの基本構成

L形整合回路は、直列素子と並列素子をどちらを負荷側・どちらを電源側に置くかで、大きく 2 つの構成に分かれます。

  • 構成A(並列素子が負荷側): 負荷に並列素子を付け、その後に直列素子を入れる。負荷抵抗が目標より大きいときに使う(負荷を降圧して見せる)
  • 構成B(直列素子が負荷側): 負荷に直列素子を付け、その後に並列素子を入れる。負荷抵抗が目標より小さいときに使う(負荷を昇圧して見せる)

どちらを使うかは、負荷抵抗 $R_L$ と目標抵抗 $R_0 = Z_0$ の大小で決まります。まずは話を単純にするため、負荷を純抵抗 $R_L$ とし、純抵抗 $R_0$ に整合する場合の設計式を導き、そのあとで複素負荷へ一般化します。

ステップ1: 純抵抗どうしの整合と回路 Q

負荷抵抗 $R_L$ が目標 $R_0$ より大きい場合($R_L > R_0$)を考えます。このとき構成Aを使い、まず負荷に並列にサセプタンス $jB$(コンデンサまたはコイル)を入れ、続いて直列にリアクタンス $jX$ を入れます。

負荷に並列素子を入れた後のアドミタンスは、$Y_L = 1/R_L$(純抵抗なのでサセプタンスはゼロ)に $jB$ を足したものです。

$$ Y = \frac{1}{R_L} + jB $$

このアドミタンスをインピーダンスに直すと、

$$ Z = \frac{1}{Y} = \frac{1}{\frac{1}{R_L} + jB} = \frac{R_L}{1 + jBR_L} = \frac{R_L(1 – jBR_L)}{1 + (BR_L)^2} $$

最後の変形では分母を実数化するために分子・分母に共役 $(1 – jBR_L)$ を掛けました。この $Z$ の実部と虚部を書き出すと、

$$ \mathrm{Re}(Z) = \frac{R_L}{1 + (BR_L)^2}, \qquad \mathrm{Im}(Z) = \frac{-B R_L^2}{1 + (BR_L)^2} $$

整合の第 1 条件は「この時点の実部が目標 $R_0$ に等しくなる」ことです。なぜなら、このあと直列素子 $jX$ を加えても実部は変わらないからです。実部を $R_0$ に等しいと置きます。

$$ \frac{R_L}{1 + (BR_L)^2} = R_0 $$

これを $(BR_L)^2$ について解きます。両辺を入れ替えて整理すると、

$$ 1 + (BR_L)^2 = \frac{R_L}{R_0} \quad \Longrightarrow \quad (BR_L)^2 = \frac{R_L}{R_0} – 1 $$

ここで回路 $Q$(ノードの $Q$ 値)を次のように定義します。

$$ \boxed{Q = \sqrt{\frac{R_{\text{high}}}{R_{\text{low}}} – 1}} $$

$R_{\text{high}}$ は 2 つの抵抗のうち大きい方、$R_{\text{low}}$ は小さい方です。今は $R_L > R_0$ なので $R_{\text{high}} = R_L$, $R_{\text{low}} = R_0$ です。すると先ほどの式は $(BR_L)^2 = Q^2$、すなわち $|B| R_L = Q$ となり、並列サセプタンスの大きさが定まります。

$$ |B| = \frac{Q}{R_L} $$

ステップ2: 直列リアクタンスでリアクタンスを打ち消す

並列素子を入れた時点で、インピーダンスの虚部は $\mathrm{Im}(Z) = -BR_L^2 / (1 + (BR_L)^2)$ でした。$1 + (BR_L)^2 = R_L/R_0$ を代入すると、

$$ \mathrm{Im}(Z) = \frac{-BR_L^2}{R_L / R_0} = -B R_0 R_L $$

$|B| = Q/R_L$ を使うと、$|\mathrm{Im}(Z)| = Q R_0$ となります。整合の第 2 条件は「最終的なリアクタンスをゼロにする」ことなので、直列素子 $jX$ でこの虚部をちょうど打ち消します。

$$ X = -\mathrm{Im}(Z) = Q R_0 \quad(\text{符号は } B \text{ と逆}) $$

つまり、直列リアクタンスの大きさは $|X| = Q R_0$ です。並列素子をコンデンサ($B > 0$)にしたら直列素子はコイル($X > 0$)に、並列素子をコイルにしたら直列素子はコンデンサに、という具合に符号が逆になります。これで純抵抗どうしの整合に必要な 2 素子の値が、回路 $Q$ ひとつで決まりました。

ステップ3: 素子値への変換

リアクタンス $X$ とサセプタンス $B$ が求まれば、動作角周波数 $\omega = 2\pi f$ を使って実際の $L$, $C$ に変換できます。コイルとコンデンサのリアクタンス・サセプタンスは、

$$ X_L = \omega L, \quad X_C = -\frac{1}{\omega C}, \quad B_L = -\frac{1}{\omega L}, \quad B_C = \omega C $$

したがって、直列素子が誘導性($X > 0$)なら $L = X / \omega$、容量性($X < 0$)なら $C = -1/(\omega X)$ で求まります。並列素子が容量性($B > 0$)なら $C = B / \omega$、誘導性($B < 0$)なら $L = -1/(\omega B)$ です。

ステップ4: 複素負荷への一般化

実際のアンテナの負荷は $Z_L = R_L + jX_L$ と複素数です。複素負荷の場合は、上の純抵抗の設計に「負荷自身のリアクタンスをどう扱うか」という工夫を加えます。代表的な手法は アブソープション(吸収法)レゾナンス(共振法) の 2 つですが、もっとも見通しがよく汎用的なのは、整合回路全体を 1 つの伝達として扱い、$Z_{\text{in}} = Z_0$ という方程式を直接解く方法です。

構成B(直列素子が負荷側)を例にとります。負荷 $Z_L = R_L + jX_L$ に直列リアクタンス $jX$ を加え、続いて並列サセプタンス $jB$ を加えたとき、電源から見たアドミタンスは、

$$ Y_{\text{in}} = \frac{1}{Z_L + jX} + jB $$

整合条件 $Y_{\text{in}} = 1/Z_0 = G_0$(実数)を課します。まず直列素子を加えた後のインピーダンス $Z’ = R_L + j(X_L + X)$ のアドミタンスをとり、その実部(コンダクタンス)が $G_0$ に等しくなるように $X$ を選びます。

$$ \mathrm{Re}\!\left(\frac{1}{R_L + j(X_L + X)}\right) = \frac{R_L}{R_L^2 + (X_L + X)^2} = G_0 = \frac{1}{Z_0} $$

これを $(X_L + X)^2$ について解くと、

$$ (X_L + X)^2 = R_L Z_0 – R_L^2 = R_L(Z_0 – R_L) $$

この式が実数解を持つには右辺が非負、すなわち $R_L < Z_0$ が必要です(昇圧型・構成Bの適用条件)。直列リアクタンスは、

$$ X = -X_L \pm \sqrt{R_L(Z_0 – R_L)} $$

と 2 通り求まります。$\pm$ の符号がそのまま「高域通過 / 低域通過」のトポロジ選択に対応します。続いて、並列サセプタンス $B$ は、$Z’$ のアドミタンスの虚部(サセプタンス)を打ち消すように選びます。

$$ B = -\mathrm{Im}\!\left(\frac{1}{R_L + j(X_L + X)}\right) = \frac{X_L + X}{R_L^2 + (X_L + X)^2} $$

逆に $R_L > Z_0$ のときは構成A(並列素子が負荷側)を使い、$Z_0$ と $R_L$ の役割を入れ替えた同様の式で $B$ と $X$ が定まります。このように、複素負荷でも「実部を目標に合わせる素子」と「残った虚部を打ち消す素子」の 2 段構えで、解析的に素子値が求まるのです。

設計式が揃いました。次は、$\pm$ の符号がもたらす 8 通りのトポロジと、その選び方の指針を整理しましょう。

8 通りのトポロジとその選び方

配置 × 素子種で 8 通り

L形整合回路の構成は、次の 2 つの選択を掛け合わせて決まります。

  1. 配置: 並列素子を負荷側に置くか($R_L > Z_0$ の降圧型)、直列素子を負荷側に置くか($R_L < Z_0$ の昇圧型)の 2 通り
  2. 素子種の組み合わせ: 上の設計式の $\pm$ により、直列素子と並列素子をそれぞれコイルにするかコンデンサにするか。リアクタンスとサセプタンスの符号が逆になる組み合わせが基本で、おおむね次の 4 通りが現れます – 直列L・並列C – 直列C・並列L – 直列L・並列L(特定条件) – 直列C・並列C(特定条件)

配置 2 通り × 素子の符号 2 通りで、原理的には合計 8 通り のトポロジが存在します。同じ負荷を同じ周波数で整合する解が複数あるのは、上の導出で現れた $\pm$ の自由度に対応しています。

高域通過か低域通過か

複数の解のうち、どれを選ぶかの第一の指針は周波数特性です。

  • 直列C・並列L の構成は、低い周波数を遮断し高い周波数を通す 高域通過(high-pass) 型の特性を持ちます。低周波の不要波(電源のリプルや低い高調波の一部)を抑えたいときに有利です。
  • 直列L・並列C の構成は、高い周波数を遮断する 低域通過(low-pass) 型です。高調波(送信信号の 2 倍・3 倍の周波数成分)を減衰させたいときに有利で、送信機の出力段では高調波抑圧の観点からこちらが好まれることが多いです。

実装上の選び方の指針

数式上は等価でも、現実の部品では次のような観点で取捨選択します。

  • 部品の入手性と Q: 必要な $L$ 値・$C$ 値が現実的な部品レンジに収まるか。極端に小さい / 大きい値は寄生成分の影響を受けやすく、自己共振周波数の制約も受けます
  • DC の扱い: 直列コンデンサは直流を遮断(DC ブロック)するので、バイアスを分離したい増幅器の整合では好都合です。一方、直列コイルは直流を通すので、DC バイアスを供給する経路として使えます
  • 高調波抑圧: 送信機なら低域通過型で高調波を落とすのが定石
  • 損失: 一般にコイルのほうがコンデンサより損失(直列抵抗)が大きいので、Q を重視する設計ではコイルの本数を減らす構成が有利なこともあります

このように、複数の正しい解の中から実装の都合に合うものを選ぶのが整合設計の腕の見せどころです。ところで、これらの構成に共通して効いてくるのが回路 $Q$ でした。次は、この $Q$ が整合の「帯域幅」をどう支配するかを見ていきましょう。

回路 Q と帯域幅

Q が大きいほど帯域は狭い

L形整合回路の回路 $Q$ は、抵抗比だけで決まってしまうことを思い出してください。

$$ Q = \sqrt{\frac{R_{\text{high}}}{R_{\text{low}}} – 1} $$

たとえば $R_L = 5\ \Omega$ を $Z_0 = 50\ \Omega$ に整合する場合、$R_{\text{high}}/R_{\text{low}} = 10$ なので $Q = \sqrt{9} = 3$ です。一方、$R_L = 25\ \Omega$ を $50\ \Omega$ に整合する場合は $Q = \sqrt{1} = 1$ となり、$Q$ はぐっと小さくなります。抵抗比が大きい(インピーダンス変換比が大きい)ほど $Q$ は大きくなる、という関係です。

この $Q$ は、整合回路がエネルギーを蓄える度合いを表します。共振回路と同じく、$Q$ が大きいほど周波数特性が鋭く尖り、整合がとれる周波数範囲(帯域幅)が狭くなります。比帯域幅(中心周波数 $f_0$ に対する帯域 $\Delta f$ の比)はおおよそ、

$$ \frac{\Delta f}{f_0} \approx \frac{1}{Q} $$

で見積もれます。$Q = 3$ なら比帯域はおよそ 33%、$Q = 1$ なら 100% 程度、という具合です。L形整合回路は素子が 2 個しかないため $Q$ を自由に選べず、抵抗比だけで $Q$(したがって帯域)が決まってしまうのが弱点です。

広帯域化への発展

もっと広い帯域が欲しい、あるいは逆に $Q$ をある値に固定したい場合は、L形を 2 段カスケードした π形(パイ形)T形 の 3 素子整合回路を使います。3 素子にすると、抵抗比とは独立に $Q$ を 1 つ余分に設計できる自由度が生まれ、帯域を意図的に広げたり狭めたりできます。L形の理解は、これら多段整合回路を学ぶ確かな土台になります。

帯域の見積もりまで含めて理論が一通りそろいました。ここからは Python で、複素負荷を入力すると素子値とトポロジを返す設計関数を実装し、整合の効果を可視化していきましょう。

Python による設計と可視化

設計関数の実装

まず、複素負荷 $Z_L$ と目標 $Z_0$(実数)を入力すると、L形整合回路の素子値(直列リアクタンス $X$ と並列サセプタンス $B$)を解析的に算出する関数を実装します。前節で導いた設計式をそのままコードに落とします。負荷抵抗が目標より小さいか大きいかで構成を切り替え、$\pm$ の 2 解をどちらも返すようにします。

import numpy as np

def design_l_network(Z_L, Z0, f0):
    """
    L形整合回路を設計する。
    Z_L : 複素負荷インピーダンス [Ω]
    Z0  : 目標インピーダンス(実数)[Ω]
    f0  : 動作周波数 [Hz]
    戻り値: 2通りの解(直列素子・並列素子の種類と値)のリスト
    """
    w = 2 * np.pi * f0          # 角周波数
    R_L, X_L = Z_L.real, Z_L.imag
    solutions = []

    if R_L < Z0:
        # 昇圧型(構成B): 直列素子が負荷側
        # (X_L + X)^2 = R_L*(Z0 - R_L)
        disc = R_L * (Z0 - R_L)
        for sign in (+1, -1):
            X = -X_L + sign * np.sqrt(disc)          # 直列リアクタンス
            Z_prime = R_L + 1j * (X_L + X)           # 直列後のインピーダンス
            B = -(1.0 / Z_prime).imag                # 並列サセプタンスで虚部打消し
            solutions.append(_to_components(X, B, w, series_first=True))
    else:
        # 降圧型(構成A): 並列素子が負荷側
        Y_L = 1.0 / Z_L
        G_L, B_L = Y_L.real, Y_L.imag
        # (B_L + B)^2 = G_L*(1/Z0 - G_L)
        disc = G_L * (1.0 / Z0 - G_L)
        for sign in (+1, -1):
            B = -B_L + sign * np.sqrt(disc)          # 並列サセプタンス
            Y_prime = G_L + 1j * (B_L + B)           # 並列後のアドミタンス
            X = -(1.0 / Y_prime).imag                # 直列リアクタンスで虚部打消し
            solutions.append(_to_components(X, B, w, series_first=False))
    return solutions

この関数は、負荷抵抗 $R_L$ と目標 $Z_0$ の大小を判定して昇圧型・降圧型を自動で切り替え、平方根の $\pm$ から 2 つの解を生成します。_to_components はリアクタンス・サセプタンスを実際の L・C 値に変換するヘルパーで、次に実装します。設計の核心が、たった数行の代数で表現できていることがわかります。

def _to_components(X, B, w, series_first):
    """リアクタンスX・サセプタンスBを素子(L/C)に変換"""
    # 直列素子
    if X > 0:
        series = ('L', X / w)            # 誘導性 → コイル L = X/ω
    else:
        series = ('C', -1.0 / (w * X))   # 容量性 → コンデンサ C = -1/(ωX)
    # 並列素子
    if B > 0:
        shunt = ('C', B / w)             # 容量性 → コンデンサ C = B/ω
    else:
        shunt = ('L', -1.0 / (w * B))    # 誘導性 → コイル L = -1/(ωB)
    return {'series': series, 'shunt': shunt, 'X': X, 'B': B,
            'series_first': series_first}

このヘルパーは、リアクタンスの符号からコイルかコンデンサかを判定し、$\omega$ を使って物理量へ変換します。直列素子が「低域通過なら L、高域通過なら C」になり、並列素子がその逆になるという、前節で述べたトポロジの対応がコードにそのまま現れています。続いて、この設計関数を具体的な負荷に適用してみます。

# 例: アンテナ負荷 Z_L = 25 - j40 Ω を 50 Ω に整合(中心周波数 100 MHz)
Z_L = 25 - 40j
Z0 = 50.0
f0 = 100e6

sols = design_l_network(Z_L, Z0, f0)
for i, s in enumerate(sols):
    st, sv = s['series']
    ht, hv = s['shunt']
    unit_s = 'nH' if st == 'L' else 'pF'
    val_s = sv * 1e9 if st == 'L' else sv * 1e12
    unit_h = 'nH' if ht == 'L' else 'pF'
    val_h = hv * 1e9 if ht == 'L' else hv * 1e12
    print(f"解{i+1}: 直列{st}={val_s:.2f}{unit_s},  並列{ht}={val_h:.2f}{unit_h}")

このコードを実行すると、$Z_L = 25 – j40\ \Omega$ という容量性の負荷(リアクタンスが負)を $50\ \Omega$ に整合する 2 通りの解が表示されます。$R_L = 25 < 50 = Z_0$ なので昇圧型が選ばれ、たとえば「直列コイル + 並列コンデンサ(低域通過)」と「直列コンデンサ + 並列コイル(高域通過)」のように、周波数特性の異なる 2 解が得られます。負荷がもともと持っていた容量性リアクタンス $-j40$ も含めて、直列素子が過不足なく打ち消していることが、出力された素子値から確認できます。

整合の検証 — Z_in が Z0 になるか

設計した素子値が本当に整合を実現するか、整合回路を含めた入力インピーダンス $Z_{\text{in}}$ を計算して確かめます。理論どおりなら $Z_{\text{in}} = 50\ \Omega$(実数)になるはずです。

def input_impedance(Z_L, sol, f):
    """整合回路込みの入力インピーダンスを周波数fで計算"""
    w = 2 * np.pi * f

    def reactance(kind, val):
        return 1j * w * val if kind == 'L' else 1.0 / (1j * w * val)

    Zs = reactance(*sol['series'])   # 直列素子のインピーダンス
    Zp = reactance(*sol['shunt'])    # 並列素子のインピーダンス

    if sol['series_first']:
        # 負荷 → 直列 → 並列(昇圧型)
        Z1 = Z_L + Zs                       # 直列を負荷に加える
        Zin = 1.0 / (1.0 / Z1 + 1.0 / Zp)   # 並列素子を足す
    else:
        # 負荷 → 並列 → 直列(降圧型)
        Z1 = 1.0 / (1.0 / Z_L + 1.0 / Zp)   # 並列を負荷に加える
        Zin = Z1 + Zs                       # 直列素子を足す
    return Zin

# 設計周波数で検証
for i, s in enumerate(sols):
    Zin = input_impedance(Z_L, s, f0)
    print(f"解{i+1}: Zin = {Zin.real:.2f} + j{Zin.imag:.2f} Ω")

このコードは、設計周波数 $f_0$ における入力インピーダンスを各解について計算します。出力は両方の解とも $Z_{\text{in}} = 50.00 + j0.00\ \Omega$ となり、虚部がゼロ・実部が目標値に一致します。これは共役整合条件 $Z_{\text{in}} = Z_0$ が達成されたこと、すなわち反射係数がゼロになったことを意味し、導出した設計式が正しいことの動かぬ証拠です。次に、この整合がどれだけの周波数範囲で有効か、$|S_{11}|$ の周波数特性を見てみましょう。

|S11| の周波数特性

整合がとれているのは設計周波数 $f_0$ ちょうどだけで、周波数がずれると再び反射が現れます。反射係数 $S_{11} = (Z_{\text{in}} – Z_0)/(Z_{\text{in}} + Z_0)$ を周波数の関数として計算し、低域通過型と高域通過型の 2 解で帯域がどう違うかを比較します。

import numpy as np
import matplotlib.pyplot as plt

freqs = np.linspace(50e6, 200e6, 600)   # 50〜200 MHz をスイープ

plt.figure(figsize=(9, 5))
labels = []
for i, s in enumerate(sols):
    s11_db = []
    for f in freqs:
        Zin = input_impedance(Z_L, s, f)
        gamma = (Zin - Z0) / (Zin + Z0)        # 反射係数
        s11_db.append(20 * np.log10(np.abs(gamma) + 1e-12))
    st = s['series'][0]
    kind = '低域通過 (直列L)' if st == 'L' else '高域通過 (直列C)'
    plt.plot(freqs / 1e6, s11_db, label=f'解{i+1}: {kind}')

plt.axvline(f0 / 1e6, color='gray', ls='--', label='設計周波数 100 MHz')
plt.axhline(-10, color='red', ls=':', label='-10 dB (VSWR≈2)')
plt.xlabel('Frequency [MHz]')
plt.ylabel('|S11| [dB]')
plt.title('L-Network Matching: |S11| vs Frequency')
plt.ylim(-40, 2)
plt.legend(fontsize=9)
plt.grid(alpha=0.3)
plt.tight_layout()
plt.savefig('l_network_s11.png', dpi=150, bbox_inches='tight')
plt.show()

このグラフからは、整合設計の本質が一目で読み取れます。第一に、両方の解とも設計周波数 100 MHz で $|S_{11}|$ が急峻に落ち込み(理論上は $-\infty$ dB)、そこで完全整合が達成されていることがわかります。第二に、低域通過型(直列L)と高域通過型(直列C)では、谷の左右で減衰の傾き方が異なります。低域通過型は高周波側で反射が大きくなり高調波を抑える方向に、高域通過型は低周波側で反射が大きくなる方向に振る舞います。第三に、$-10$ dB(VSWR 約 2 に相当する実用的な整合の目安)を下回る周波数範囲が、この負荷で得られる帯域です。$R_L = 25\ \Omega$, $Z_0 = 50\ \Omega$ から $Q = \sqrt{50/25 – 1} = 1$ なので、比帯域はおよそ 100% という広めの値になり、グラフの谷も比較的なだらかに広がっていることが確認できます。

スミスチャート上の整合軌跡

最後に、整合の過程をスミスチャート風に可視化します。負荷点から出発し、直列素子で等抵抗円に沿って動き、並列素子で等コンダクタンス円に沿って動いて、最終的に中心(整合点)に到達する軌跡を描きます。スミスチャートは反射係数平面 $\Gamma = (Z – Z_0)/(Z + Z_0)$ 上の図です。

import numpy as np
import matplotlib.pyplot as plt

def to_gamma(Z, Z0):
    return (Z - Z0) / (Z + Z0)

def smith_grid(ax, Z0):
    """スミスチャートの等抵抗円・等リアクタンス円を描く"""
    theta = np.linspace(0, 2 * np.pi, 400)
    ax.plot(np.cos(theta), np.sin(theta), 'k', lw=1.2)   # 外周 |Γ|=1
    for r in [0.2, 0.5, 1, 2, 5]:                        # 等抵抗円
        cx, rad = r / (1 + r), 1 / (1 + r)
        ax.plot(cx + rad * np.cos(theta), rad * np.sin(theta),
                'gray', lw=0.5, alpha=0.6)
    for x in [0.2, 0.5, 1, 2, 5]:                        # 等リアクタンス円
        for sgn in (1, -1):
            cy, rad = sgn / x, 1 / x
            t = np.linspace(0, 2 * np.pi, 400)
            xs, ys = 1 + rad * np.cos(t), cy + rad * np.sin(t)
            mask = xs**2 + ys**2 <= 1.0001
            ax.plot(xs[mask], ys[mask], 'gray', lw=0.5, alpha=0.6)
    ax.set_aspect('equal'); ax.axis('off')

このヘルパーはスミスチャートの格子(正規化抵抗・正規化リアクタンスの等値円)を描画します。外周の円が $|\Gamma| = 1$(無損失の境界)、中心が整合点 $Z_0$ です。続いて、整合の各ステップで軌跡をプロットします。

# 解1(昇圧型: 負荷→直列→並列)の軌跡を描く
sol = sols[0]
w0 = 2 * np.pi * f0

def reactance(kind, val, w):
    return 1j * w * val if kind == 'L' else 1.0 / (1j * w * val)

Zs = reactance(*sol['series'], w0)
Zp = reactance(*sol['shunt'], w0)

# ステップ1: 負荷に直列素子を少しずつ加える(等抵抗円に沿う)
t = np.linspace(0, 1, 50)
Z_step1 = np.array([Z_L + tt * Zs for tt in t])
# ステップ2: 並列素子を少しずつ加える(等コンダクタンス円に沿う)
Z1 = Z_L + Zs
Z_step2 = np.array([1.0 / (1.0 / Z1 + tt * (1.0 / Zp)) for tt in t])

fig, ax = plt.subplots(figsize=(7, 7))
smith_grid(ax, Z0)
g1 = to_gamma(Z_step1, Z0)
g2 = to_gamma(Z_step2, Z0)
gL = to_gamma(Z_L, Z0)
ax.plot(g1.real, g1.imag, 'b', lw=2.5, label='Step1: 直列素子(等抵抗円)')
ax.plot(g2.real, g2.imag, 'r', lw=2.5, label='Step2: 並列素子(等コンダクタンス円)')
ax.plot(gL.real, gL.imag, 'ko', ms=9)
ax.annotate('負荷 $Z_L$', (gL.real, gL.imag), fontsize=10)
ax.plot(0, 0, 'g*', ms=18, label='整合点 $Z_0$')
ax.set_title('Impedance Matching Trajectory on Smith Chart', fontsize=13)
ax.legend(loc='lower left', fontsize=9)
plt.tight_layout()
plt.savefig('l_network_smith.png', dpi=150, bbox_inches='tight')
plt.show()

このコードは、整合の 2 ステップをスミスチャート上の連続した軌跡として描きます。青い曲線は直列素子を加える過程で、負荷点が等抵抗円(正規化抵抗一定の円)に沿って移動する様子を表します。赤い曲線は並列素子を加える過程で、点が等コンダクタンス円に沿って中心へ向かう様子を表します。出発点(黒丸)の負荷 $Z_L = 25 – j40\ \Omega$ は容量性なのでチャート下半分に位置し、2 本の円弧を経て、最終的に緑の星印が示す中心の整合点($\Gamma = 0$)に正確に到達します。理論で述べた「直列で等抵抗円、並列で等コンダクタンス円を 1 本ずつ使って中心に運ぶ」という幾何が、目に見える形で確認できました。なお軌跡を細かく見ると、2 本の円弧が中心を通る交点でちょうど出会うように素子値が選ばれていることがわかり、これが L形整合の設計の核心です。

まとめ

本記事では、L形整合回路による共役インピーダンス整合を、物理法則の導出から Python 実装まで一気通貫で解説しました。要点を振り返ります。

  • 共役整合条件 $Z_L = Z_s^{*}$(電源が実数なら $Z_{\text{in}} = Z_0$)が、負荷へ送る電力を最大にする — 最大電力伝送定理から $X_L = -X_s$, $R_L = R_s$ を導いた
  • 直列リアクタンスは抵抗を変えずリアクタンスを動かし(等抵抗円)、並列サセプタンスはコンダクタンスを変えずサセプタンスを動かす(等コンダクタンス円) — この 2 つの操作で任意の負荷を中心に運べる
  • 回路 $Q = \sqrt{R_{\text{high}}/R_{\text{low}} – 1}$ が素子値を決め、同時に帯域幅 $\Delta f / f_0 \approx 1/Q$ を支配する。抵抗比が大きいほど狭帯域になる
  • 設計式は $\pm$ の 2 解を持ち、配置 2 通りと合わせて 8 通りのトポロジが生じる。低域通過型は高調波抑圧、高域通過型は低周波遮断や DC ブロックに有利
  • Python では、複素負荷と目標から素子値を解析的に算出し、$Z_{\text{in}}$ の検証・$|S_{11}|$ の周波数特性・スミスチャート上の軌跡で整合の効果を可視化できた

L形整合は 2 素子という最小構成ゆえに $Q$ を選べない制約がありますが、その分、整合設計のすべての本質 — 共役整合、等円の幾何、$Q$ と帯域のトレードオフ — が凝縮されています。ここで身につけた考え方は、より広帯域・高自由度の整合へとそのまま発展します。

次のステップとして、以下の記事も参考にしてください。