1dB利得圧縮点とIP3—RF増幅器の線形性指標を理解して実装する

無線受信機のフロントエンドにある低雑音増幅器(LNA)を考えてみましょう。設計者が「利得は20 dB」と書いたデータシートを信じて入力を強くしていくと、ある時点から出力が「20 dB増幅」の直線から外れて頭打ちになり始めます。さらに困ったことに、希望する信号のすぐ隣に強い妨害波が2つ並んでいると、増幅器の中でそれらが混ざり合い、もともと存在しなかった偽の信号(スプリアス)が希望波の真上に降ってきて、受信を妨害します。これらはどちらも「増幅器が完全な線形デバイスではない」ことから生じる現象です。

増幅器の非線形性をたった2つの数字で要約するのが、本記事の主役である 1 dB利得圧縮点(P1dB)3次インターセプト点(IP3) です。これらを理解すると、次のような実務上の問いに定量的に答えられるようになります。

  • 受信機の設計: 強い妨害波が存在する都市部で、相互変調歪みが雑音フロアを超えない入力電力の上限はどこか。ダイナミックレンジ(SFDR)はどれだけ確保できるか。
  • 送信機の電力設計: パワーアンプをどこまで強く駆動すると出力波形が歪み、隣接チャネル漏洩(ACPR)が規格を超えるか。バックオフをどれだけ取るべきか。
  • レーダー・計測: 大きな反射波と微弱なターゲット反射が同時に入るとき、相互変調積が偽ターゲットに化けないか。

本記事の内容

  • 増幅器の非線形性を表す多項式モデルとその直感
  • 単一トーン入力からの基本波利得圧縮(P1dB)の導出
  • 2トーン入力からの3次相互変調積(IM3)の導出と「1:3の傾き」
  • 外挿によるIP3(OIP3 / IIP3)の定義と幾何学的意味
  • IIP3とIIP2の違い、偶数次歪みと奇数次歪みの性質
  • 多段カスケード時のIP3合成式の導出
  • スプリアスフリーダイナミックレンジ(SFDR)と雑音フロアの関係
  • Python実装: 出力電力 vs 入力電力のグラフからP1dBとIP3を外挿、2トーンスペクトルとSFDRの可視化

前提知識

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

増幅器の非線形性とは

理想の増幅器と現実の増幅器

理想的な増幅器は、入力信号 $x(t)$ に対して出力 $y(t)$ がぴったり比例する、すなわち $y(t) = a_1 x(t)$ という関係を満たします。ここで $a_1$ が電圧利得です。この関係が成り立つ限り、入力を2倍にすれば出力も2倍、入力に含まれる周波数以外の成分は出力に現れません。これが「線形」ということの意味です。

しかし現実のトランジスタ増幅器は、入力が小さいうちは線形に振る舞いますが、入力が大きくなると素子の電流・電圧特性の曲がり(非線形性)が無視できなくなります。たとえばバイポーラトランジスタのコレクタ電流はベース・エミッタ電圧に対して指数関数的に増え、FETのドレイン電流はゲート電圧の2乗に近い形で増えます。こうした素子の曲がった特性が、出力波形を入力波形の単なる定数倍からずらしていきます。

イメージとしては、坂道を一定の力で押し続ける状況に近いものです。最初は力に比例して荷物が動きますが、坂が急になってくると同じ力ではだんだん動かなくなる(出力が頭打ちになる)――この「だんだん効かなくなる」感覚が利得圧縮です。一方で、押す力に細かなガタガタした揺れが2種類混ざっていると、坂の曲がりのせいでそれらが擦れ合って、もとになかったリズムの揺れが生まれる――これが相互変調です。どちらも同じ「特性の曲がり」から生まれる、表裏一体の現象です。

多項式モデルで非線形性を表す

この「曲がった特性」を数式で扱うために、増幅器の入出力関係を入力 $x$ のべき級数(多項式)で近似します。

$$ y = a_1 x + a_2 x^2 + a_3 x^3 + a_4 x^4 + \cdots $$

ここで $a_1$ は線形利得、$a_2, a_3, \dots$ は高次の非線形係数です。入力が十分小さいときは $x^2, x^3$ の項は $a_1 x$ に比べて無視でき、増幅器は線形に見えます。入力が大きくなるにつれて高次項の寄与が増え、非線形性が顔を出します。

実用上は、3次の項まで取れば利得圧縮とIM3という最も重要な現象を捉えられます。そこで本記事では、以下の メモリレス3次多項式モデル を中心に解析します。

$$ \begin{equation} y = a_1 x + a_2 x^2 + a_3 x^3 \end{equation} $$

「メモリレス」というのは、出力がその瞬間の入力だけで決まり、過去の入力に依存しない(周波数特性を持たない)という意味です。実際の増幅器には周波数依存性がありますが、線形性指標の本質を理解するにはこの簡単化が有効です。

ここで重要な符号の話をしておきます。多くの実用増幅器では、入力を強くすると利得が下がる「圧縮型」の非線形性を示します。これは $a_3$ が $a_1$ と逆符号($a_1 > 0$ なら $a_3 < 0$)であることに対応します。後の導出でこの符号が利得圧縮を生むことを確認します。

なお、増幅器の非線形性が出力波形にどう影響するかを評価する前提として、信号の大きさを電力で測る習慣と、デシベル表記に慣れておく必要があります。デシベルの基礎は信号対雑音比(SNR)とは — デシベルでの扱いと雑音指数で扱っているので、不安な方は先に目を通しておくとよいでしょう。

ここまでで非線形性を多項式で表す枠組みができました。次に、この多項式に単一の正弦波を入れると何が起きるかを調べ、利得圧縮の正体に迫りましょう。

単一トーン入力と利得圧縮

単一トーンを多項式に通す

増幅器に1つの正弦波(単一トーン、single tone)を入力する状況を考えます。振幅 $A$、角周波数 $\omega$ の入力を

$$ x(t) = A \cos(\omega t) $$

とし、これを3次多項式モデル $y = a_1 x + a_2 x^2 + a_3 x^3$ に代入します。各項を展開していきましょう。まず2次の項を三角関数の倍角公式 $\cos^2\theta = \tfrac{1}{2}(1 + \cos 2\theta)$ で展開すると、

$$ a_2 x^2 = a_2 A^2 \cos^2(\omega t) = \frac{a_2 A^2}{2}\bigl(1 + \cos 2\omega t\bigr) $$

となります。直流成分 $\tfrac{a_2 A^2}{2}$ と2倍の周波数 $2\omega$ の成分(2次高調波)が現れました。

次に3次の項を、3倍角に関する公式 $\cos^3\theta = \tfrac{3}{4}\cos\theta + \tfrac{1}{4}\cos 3\theta$ を使って展開します。

$$ a_3 x^3 = a_3 A^3 \cos^3(\omega t) = a_3 A^3\left(\frac{3}{4}\cos\omega t + \frac{1}{4}\cos 3\omega t\right) $$

ここで注目すべきは、3次項を展開すると もとの周波数 $\omega$(基本波)に戻る成分 $\tfrac{3}{4}a_3 A^3 \cos\omega t$ が現れることです。3倍角の公式の右辺第1項がそれにあたります。1次項 $a_1 A \cos\omega t$ もまた基本波です。したがって、基本波成分はこの2つの和になります。

すべての項を周波数ごとに整理すると、出力は次のように書けます。

$$ y(t) = \underbrace{\frac{a_2 A^2}{2}}_{\text{DC}} + \underbrace{\left(a_1 A + \frac{3}{4}a_3 A^3\right)\cos\omega t}_{\text{基本波}} + \underbrace{\frac{a_2 A^2}{2}\cos 2\omega t}_{\text{2次高調波}} + \underbrace{\frac{a_3 A^3}{4}\cos 3\omega t}_{\text{3次高調波}} $$

基本波利得の圧縮

上の式で、基本波(周波数 $\omega$)の振幅に注目します。

$$ \begin{equation} A_{\omega} = a_1 A + \frac{3}{4}a_3 A^3 = a_1 A\left(1 + \frac{3 a_3}{4 a_1}A^2\right) \end{equation} $$

線形だけなら基本波振幅は $a_1 A$ のはずでした。しかし3次項のせいで、$\tfrac{3}{4}a_3 A^3$ という補正が加わっています。

ここで実効的な電圧利得を $G_{\text{eff}} = A_\omega / A$ と定義すると、

$$ G_{\text{eff}} = a_1 + \frac{3}{4}a_3 A^2 = a_1\left(1 + \frac{3 a_3}{4 a_1}A^2\right) $$

となります。圧縮型増幅器では $a_3 < 0$($a_1 > 0$)なので、第2項は負です。つまり 入力振幅 $A$ が大きくなるほど実効利得 $G_{\text{eff}}$ が小さくなる ことがわかります。これが利得圧縮(gain compression)の数学的な正体です。$A$ が小さいうちは第2項が無視でき、利得は小信号利得 $a_1$ に等しくなります。

1 dB利得圧縮点(P1dB)の定義

利得が小信号値からどれだけ落ちたかを定量化するため、デシベルで利得低下を測ります。利得が小信号利得から ちょうど 1 dB低下する 入力レベルを 1 dB利得圧縮点(P1dB, 1 dB compression point) と呼びます。これは「ここから先は増幅器が目に見えて歪み始める」という実用上の動作限界の目安です。

1 dBの低下は、電圧利得比で表すと $10^{-1/20} \approx 0.891$ 倍です。つまり次の条件を満たす入力振幅 $A_{1\text{dB}}$ がP1dBを与えます。

$$ \frac{G_{\text{eff}}}{a_1} = \left|1 + \frac{3 a_3}{4 a_1}A_{1\text{dB}}^2\right| = 10^{-1/20} \approx 0.891 $$

$a_3 < 0$ なので括弧内は正のまま $1$ から減っていきます。$1 - 0.891 = 0.109$ より、

$$ \frac{3 |a_3|}{4 a_1}A_{1\text{dB}}^2 = 1 – 10^{-1/20} \approx 0.109 $$

これを $A_{1\text{dB}}$ について解くと、入力振幅でのP1dBが得られます。

$$ \begin{equation} A_{1\text{dB}} = \sqrt{0.145\,\frac{a_1}{|a_3|}} \approx 0.381\sqrt{\frac{a_1}{|a_3|}} \end{equation} $$

ここで $0.109 \times \tfrac{4}{3} \approx 0.145$ を使いました。P1dBは入力換算(input-referred、$P_{1\text{dB,in}}$)でも出力換算(output-referred、$P_{1\text{dB,out}}$)でも表記され、両者は小信号利得(圧縮後は約 $G – 1$ dB)の分だけずれます。

直感的には、P1dBは「増幅器を線形デバイスとして扱える上限」を表します。これより大きい信号を入れると、波形が目に見えて潰れ、出力に高調波や(複数トーンなら)相互変調積が大量に発生します。

ここまでで単一トーンによる利得圧縮を定量化できました。しかし受信機で本当に厄介なのは、希望波の近くに現れる相互変調歪みです。それを調べるには、トーンを2つ同時に入れる必要があります。次節で2トーン入力を解析しましょう。

2トーン入力と3次相互変調

なぜ2トーンなのか

単一トーンで生じる高調波($2\omega, 3\omega$)は、もとの周波数からはるか遠くにあるため、フィルタで簡単に除去できます。実際に受信機を悩ませるのは、希望波のすぐ隣にある2つの妨害波が混ざって生じる 相互変調積(intermodulation product) です。これらは希望波のすぐ近く、ときには真上に落ちてくるため、フィルタで取り除けません。

そこで、近接した2つの周波数 $\omega_1, \omega_2$(たとえば $\omega_1 = 2\pi \cdot 1000\,\text{MHz}$、$\omega_2 = 2\pi \cdot 1001\,\text{MHz}$ のように近い)を等振幅 $A$ で同時に入力します。

$$ x(t) = A\cos(\omega_1 t) + A\cos(\omega_2 t) $$

これを3次多項式モデルに通すと、たくさんの周波数成分が生まれます。重要なものを順に見ていきましょう。

3次項の展開

最も重要なのは3次項 $a_3 x^3$ です。$x = A(\cos\omega_1 t + \cos\omega_2 t)$ の3乗を展開します。$u = \cos\omega_1 t$、$v = \cos\omega_2 t$ と略記すると、

$$ x^3 = A^3 (u + v)^3 = A^3 (u^3 + 3u^2 v + 3u v^2 + v^3) $$

この4つの項を1つずつ三角関数で展開します。まず $u^3$ と $v^3$ は単一トーンのときと同じく、基本波と3次高調波を生みます。問題は中間の混合項 $3u^2 v$ と $3uv^2$ です。$u^2 = \tfrac{1}{2}(1 + \cos 2\omega_1 t)$ を使うと、

$$ 3u^2 v = 3 \cdot \frac{1}{2}(1 + \cos 2\omega_1 t)\cos\omega_2 t = \frac{3}{2}\cos\omega_2 t + \frac{3}{2}\cos 2\omega_1 t \cos\omega_2 t $$

ここで積和の公式 $\cos\alpha\cos\beta = \tfrac{1}{2}[\cos(\alpha-\beta) + \cos(\alpha+\beta)]$ を最後の項に適用すると、

$$ \frac{3}{2}\cos 2\omega_1 t \cos\omega_2 t = \frac{3}{4}\cos(2\omega_1 – \omega_2)t + \frac{3}{4}\cos(2\omega_1 + \omega_2)t $$

が得られます。ここに $2\omega_1 – \omega_2$ と $2\omega_1 + \omega_2$ という新しい周波数が登場しました。同様に $3uv^2$ からは $2\omega_2 – \omega_1$ と $2\omega_2 + \omega_1$ が生まれます。

3次相互変調積(IM3)の正体

生まれた周波数のうち、$2\omega_1 + \omega_2$ や $2\omega_2 + \omega_1$ は希望波からはるか遠くにあり、フィルタで除去できます。しかし $2\omega_1 – \omega_2$ と $2\omega_2 – \omega_1$ は厄介です。$\omega_1 \approx \omega_2$ のとき、これらの周波数は

$$ 2\omega_1 – \omega_2 \approx \omega_1 – (\omega_2 – \omega_1), \qquad 2\omega_2 – \omega_1 \approx \omega_2 + (\omega_2 – \omega_1) $$

となり、もとの2トーンのすぐ外側、間隔 $\Delta\omega = \omega_2 – \omega_1$ と同じ間隔で両脇に張り付きます。これが 3次相互変調積(IM3, third-order intermodulation product) です。希望波と同じ帯域内に落ちるため除去できず、受信を妨害します。

IM3成分の振幅を集めます。$2\omega_1 – \omega_2$ 成分は $3u^2 v$ の展開からの $\tfrac{3}{4}$ に $a_3 A^3$ がかかります。

$$ a_3 A^3 \cdot \frac{3}{4}\cos(2\omega_1 – \omega_2)t $$

したがって、IM3積1本あたりの振幅は次の通りです。

$$ \begin{equation} A_{\text{IM3}} = \frac{3}{4}|a_3| A^3 \end{equation} $$

基本波振幅(2トーン版)

一方、基本波 $\omega_1$ の振幅も集めておきます。1次項からの $a_1 A$ に加え、3次項の $u^3$ から $\tfrac{3}{4}a_3 A^3$、混合項 $3uv^2$ の中の $\tfrac{3}{2}\cos\omega_1 t$ 由来の項 $a_3 A^3 \cdot \tfrac{3}{2} \cdot \tfrac{?}{}$ が加わります。きちんと数えると、2トーンの場合の基本波振幅は

$$ A_{\omega_1} = a_1 A + \frac{9}{4}a_3 A^3 $$

となります(係数が単一トーンの $\tfrac{3}{4}$ から $\tfrac{9}{4}$ に増えるのは、もう一方のトーンとの混合項 $3uv^2$ が基本波に $\tfrac{3}{2}a_3 A^3$ を追加で寄与するためです)。小信号領域では第2項は無視でき、$A_{\omega_1} \approx a_1 A$ です。

ここで線形性を議論する上で決定的に重要な観察をします。小信号領域での両者の振幅を比較すると、

  • 基本波振幅: $A_{\omega_1} \approx a_1 A$ ……入力振幅 $A$ の 1乗 に比例
  • IM3振幅: $A_{\text{IM3}} = \tfrac{3}{4}|a_3| A^3$ ……入力振幅 $A$ の 3乗 に比例

となっています。電力はそれぞれ振幅の2乗に比例するので、デシベル(対数)で表すと次のようになります。入力電力を $P_{\text{in}}$ [dBm] とすると、

  • 基本波出力電力: $P_{\omega_1} \propto 1 \cdot P_{\text{in}}$ ……傾き 1
  • IM3出力電力: $P_{\text{IM3}} \propto 3 \cdot P_{\text{in}}$ ……傾き 3

つまり、入力電力を1 dB上げると基本波出力は1 dB上がりますが、IM3は3 dB上がります。これが有名な 「IM3は基本波の3倍の傾きで伸びる(1:3の傾き)」 という性質です。入力を強くするほどIM3が急速に基本波に追いついてくる、という嫌な振る舞いを表しています。

ここまでで、基本波(傾き1)とIM3(傾き3)という、傾きの異なる2本の直線が手に入りました。次節では、この2本を外挿して交わらせることでIP3を定義します。

3次インターセプト点(IP3)の定義

2本の直線の交点としてのIP3

前節の結果を、入力電力 $P_{\text{in}}$ [dBm] を横軸、出力電力 [dBm] を縦軸にとったグラフで考えます。小信号領域では、

  • 基本波出力: 傾き1の直線
  • IM3出力: 傾き3の直線

の2本が引けます。入力を上げていくと、傾き3のIM3線は傾き1の基本波線を急速に追いかけ、もし両者が圧縮せずにずっと直線のままだったと仮定すれば、ある1点で交わります。この仮想的な交点を3次インターセプト点(IP3, third-order intercept point) と呼びます。

現実には、IP3に到達するずっと手前で増幅器は飽和(圧縮)してしまうので、IP3は実際には観測されない仮想の点です。しかし、傾きが固定(1と3)であるおかげで、低い入力レベルで基本波とIM3を1点測れば、そこから直線を外挿してIP3を正確に求められます。これがIP3を「外挿点」として定義する理由であり、測定の便利さの源です。

IP3を入力電力で表したものを IIP3(Input IP3)、出力電力で表したものを OIP3(Output IP3) と呼びます。両者は小信号利得 $G$ [dB] の分だけずれており、

$$ \text{OIP3} = \text{IIP3} + G $$

の関係があります。

IIP3の数式での導出

IIP3を多項式係数で表しましょう。交点では基本波振幅とIM3振幅が等しくなります。小信号領域の振幅を使い、交点の入力振幅を $A_{\text{IP3}}$ とすると、

$$ \underbrace{a_1 A_{\text{IP3}}}_{\text{基本波}} = \underbrace{\frac{3}{4}|a_3| A_{\text{IP3}}^3}_{\text{IM3}} $$

両辺を $A_{\text{IP3}}$ で割って $A_{\text{IP3}}^2$ について解きます。

$$ a_1 = \frac{3}{4}|a_3| A_{\text{IP3}}^2 \quad\Longrightarrow\quad A_{\text{IP3}}^2 = \frac{4 a_1}{3 |a_3|} $$

したがって、IIP3における入力振幅は次の通りです。

$$ \begin{equation} A_{\text{IP3}} = \sqrt{\frac{4 a_1}{3 |a_3|}} \end{equation} $$

P1dBとIP3の関係

ここで、先に求めたP1dBの入力振幅 $A_{1\text{dB}} = \sqrt{0.145\, a_1/|a_3|}$ と比較してみましょう。両者の比をとると、

$$ \frac{A_{\text{IP3}}^2}{A_{1\text{dB}}^2} = \frac{4 a_1 / (3|a_3|)}{0.145\, a_1/|a_3|} = \frac{4/3}{0.145} \approx 9.2 $$

電力比はちょうど $A^2$ の比なので、デシベルでは $10\log_{10}(9.2) \approx 9.6$ dBです。つまり、

$$ \boxed{\text{IIP3} \approx P_{1\text{dB,in}} + 9.6\ \text{dB}} $$

という有名な経験則が、3次多項式モデルから理論的に導かれます。IIP3はP1dBより約 9.6 dB高いところにあり、実際の増幅器でもおおむね 9〜10 dB程度の差になることが多いです(実デバイスでは高次項のため正確に 9.6 dBにはならず、目安として使われます)。この関係は、データシートにP1dBしか書かれていないときにIP3を概算する際に重宝します。

ここまで奇数次(3次)の歪みを扱ってきました。しかし偶数次の歪みも別の悪さをします。次節で奇数次と偶数次の違い、特にIIP2について整理しましょう。

IIP3とIIP2の違い

偶数次歪みと2次インターセプト点

2トーン入力を多項式に通すと、3次項からIM3($2\omega_1 – \omega_2$ など)が生まれたのと同様に、2次項 $a_2 x^2$ からは 2次相互変調積(IM2) が生まれます。$x = A(\cos\omega_1 t + \cos\omega_2 t)$ の2乗を展開すると、積和の公式から

$$ a_2 x^2 \supset a_2 A^2 \cos\omega_1 t\cos\omega_2 t = \frac{a_2 A^2}{2}\bigl[\cos(\omega_1 – \omega_2)t + \cos(\omega_1 + \omega_2)t\bigr] $$

となり、和周波 $\omega_1 + \omega_2$ と差周波 $\omega_1 – \omega_2$ が現れます。これらがIM2です。IM2振幅は $\tfrac{1}{2}|a_2| A^2$ で、入力振幅 $A$ の 2乗 に比例します。

したがって、IM2出力電力は入力電力に対して 傾き2 で伸びます。基本波(傾き1)とIM2(傾き2)を外挿した交点が 2次インターセプト点(IP2) であり、入力換算でIIP2、出力換算でOIP2と呼びます。

基本波とIM2の交点条件 $a_1 A = \tfrac{1}{2}|a_2| A^2$ から、

$$ A_{\text{IP2}} = \frac{2 a_1}{|a_2|} $$

が得られます。

奇数次と偶数次の決定的な違い

IM2(和・差周波)とIM3($2\omega_1 – \omega_2$)の違いは、周波数がどこに落ちるか にあります。

  • IM2(偶数次): 差周波 $\omega_1 – \omega_2$ は非常に低い周波数(ベースバンド近く)、和周波 $\omega_1 + \omega_2$ はほぼ2倍の周波数に落ちます。どちらも希望帯域から遠いため、狭帯域受信機ではフィルタで除去できることが多いです。
  • IM3(奇数次): $2\omega_1 – \omega_2$ は希望波のすぐ隣(同一帯域内)に落ちるため、フィルタで除去できません。

このため、狭帯域システムでは IM3(IIP3)が支配的な線形性指標 になります。一方、広帯域受信機やゼロIF(ダイレクトコンバージョン)受信機では、差周波 $\omega_1 – \omega_2$ がそのままベースバンドに落ちてくるため IIP2が極めて重要 になります。差動回路はこの偶数次歪みを原理的に打ち消せるため、ゼロIF受信機では差動構成が好まれます。

一般化すると、$n$ 次の歪み積は入力電力に対して傾き $n$ で伸び、$n$ 次インターセプト点 IPn が定義できます。奇数次(3次、5次、…)は希望帯域内に落ちやすく、偶数次(2次、4次)は帯域外に落ちやすい、という住み分けがあります。

線形性指標を単体の増幅器について理解できたところで、実際のシステムは複数の増幅器・ミキサを縦続接続します。次節では、段をつないだときにIP3がどう劣化するかを導きます。

カスケード接続時のIP3合成

なぜ縦続だと劣化するのか

受信機は通常、LNA → ミキサ → IFアンプ → … と複数段を縦続(カスケード)接続します。雑音指数(NF)の場合は前段が支配的でしたが、線形性(IP3)は逆に 後段が支配的 になりがちです。理由は直感的です。前段で信号が増幅された結果、後段には大きな信号が入ります。後段は大きな信号を受けるほど深く非線形領域に入り、相互変調を起こしやすくなるからです。

2段カスケードのIIP3合成式

2段の増幅器を考え、各段の入力換算IP3(線形パワー、単位はWやmW)を $\text{IIP3}_1, \text{IIP3}_2$、第1段の電力利得を $G_1$(線形比)とします。全体の入力換算IP3を $\text{IIP3}_{\text{tot}}$ とすると、よく使われる近似合成式は次の通りです。

$$ \begin{equation} \frac{1}{\text{IIP3}_{\text{tot}}} = \frac{1}{\text{IIP3}_1} + \frac{G_1}{\text{IIP3}_2} \end{equation} $$

この式の構造を読み解きましょう。右辺第2項に第1段の利得 $G_1$ がかかっていることに注目してください。$G_1$ が大きいほど第2段の項 $G_1/\text{IIP3}_2$ が大きくなり、全体のIIP3を悪化させます。これが「前段で増幅された信号が後段を歪ませる」という直感の数式表現です。

合成式の導出

なぜこの形になるのかを導きます。鍵となるのは「各段のIM3が出力で同相に足し合わさると仮定する(最悪条件)」という考え方です。入力電力 $P_{\text{in}}$(線形)に対し、各段が単独で生み出すIM3出力電力を考えます。

1段の増幅器では、IM3出力電力 $P_{\text{IM3}}$ は基本波出力 $P_{\text{out}} = G P_{\text{in}}$ とIP3を使って次のように書けます。これはIM3が傾き3で伸びる事実から導かれる関係です。出力換算でOIP3を使うと、

$$ P_{\text{IM3,out}} = \frac{P_{\text{out}}^3}{\text{OIP3}^2} $$

が成り立ちます(3つの量がすべて線形パワー)。両辺を入力換算に直し、各段のIM3を合成すると、最終的に上記の逆数の和の形に整理されます。導出の要点は、第2段の入力が第1段で $G_1$ 倍されているため、第2段のIM3寄与が入力換算で $G_1$ 倍効いてくる、という点に集約されます。

設計上の含意

合成式から、線形性の高い受信機を設計するための指針が読み取れます。

  1. 後段の線形性を高く保つ: 特に最終段付近のアンプ・ミキサのIP3が全体を支配します。
  2. 前段の利得を上げすぎない: 利得 $G_1$ を大きくすると雑音指数は下がりますが、線形性は悪化します。NFとIP3はトレードオフの関係にあります。
  3. 利得配分の最適化: 各段の利得を適切に配分し、雑音指数(前段重視)と線形性(後段重視)のバランスを取ることが受信機設計の核心です。

このトレードオフこそが、受信機のダイナミックレンジを決めます。詳しくは受信機のダイナミックレンジ — 感度から飽和までを理解するも参照してください。

カスケードでのIP3劣化を理解したところで、いよいよ「IP3と雑音フロアから受信機が扱える信号範囲(SFDR)をどう決めるか」を見ていきましょう。

スプリアスフリーダイナミックレンジ(SFDR)

SFDRの直感

受信機が正しく扱える信号には下限と上限があります。下限は 雑音フロア(これより弱い信号は雑音に埋もれる)、上限は 歪みが許容できなくなるレベル です。この2つの間の幅が「ダイナミックレンジ」です。

特に重要なのが スプリアスフリーダイナミックレンジ(SFDR, Spurious-Free Dynamic Range) です。これは「IM3スプリアスがちょうど雑音フロアと同じ高さになる入力レベル」を上限と定義したダイナミックレンジです。SFDRを超える入力を入れると、IM3が雑音フロアより上に顔を出し、偽信号として検出されてしまいます。つまりSFDRは「偽の信号を一切出さずに扱える入力電力の範囲」を表します。

SFDRの導出

雑音フロアの出力電力を $P_N$(線形)、出力でのIM3を $P_{\text{IM3,out}}$ とします。前節で見たように、IM3出力は基本波出力の3乗に比例します。OIP3を使って、

$$ P_{\text{IM3,out}} = \frac{P_{\text{out}}^3}{\text{OIP3}^2} $$

SFDRの上限は $P_{\text{IM3,out}} = P_N$ となる出力レベル $P_{\text{out}}^{\max}$ です。

$$ P_N = \frac{(P_{\text{out}}^{\max})^3}{\text{OIP3}^2} \quad\Longrightarrow\quad (P_{\text{out}}^{\max})^3 = P_N \cdot \text{OIP3}^2 $$

ここで $P_{\text{out}}^{\max}$ について解くため、両辺の対数(dB)をとります。dB表記で $\text{OIP3}_{\text{dBm}}$、$P_{N,\text{dBm}}$ と書くと、

$$ 3 P_{\text{out,dBm}}^{\max} = P_{N,\text{dBm}} + 2\,\text{OIP3}_{\text{dBm}} $$

$$ P_{\text{out,dBm}}^{\max} = \frac{1}{3}\bigl(2\,\text{OIP3}_{\text{dBm}} + P_{N,\text{dBm}}\bigr) $$

SFDRは、この上限出力と雑音フロア $P_{N,\text{dBm}}$ の差です。

$$ \text{SFDR} = P_{\text{out,dBm}}^{\max} – P_{N,\text{dBm}} = \frac{2}{3}\bigl(\text{OIP3}_{\text{dBm}} – P_{N,\text{dBm}}\bigr) $$

入力換算でも同じ形になります(IIP3と入力換算雑音フロアで置き換えるだけ)。

$$ \begin{equation} \text{SFDR} = \frac{2}{3}\bigl(\text{IIP3}_{\text{dBm}} – P_{N,\text{in,dBm}}\bigr) \end{equation} $$

この美しい式の意味を噛みしめましょう。係数 $\tfrac{2}{3}$ は、IM3が傾き3、基本波が傾き1で伸びるという事実から来ています。IP3を3 dB上げる、または雑音フロアを3 dB下げると、SFDRは2 dBしか増えません。線形性を稼ぐコストに対してSFDRの伸びが鈍い、という設計の現実を表しています。

雑音フロアは雑音指数(NF)と帯域幅 $B$ で決まり、$P_{N,\text{in,dBm}} = -174 + \text{NF} + 10\log_{10}B$(熱雑音 $-174$ dBm/Hz基準)です。SNRやNFの扱いは信号対雑音比(SNR)とは — デシベルでの扱いと雑音指数で詳しく扱っています。

理論が一通り揃いました。次は、これらの式が実際にどのように現れるかを、Pythonで多項式デバイスをシミュレートして確かめましょう。

Pythonによる実装と可視化

多項式非線形デバイスのモデル化

まず、3次多項式モデルを表すデバイスを実装し、単一トーンと2トーンを通せるようにします。係数 $a_1, a_2, a_3$ を与えて入力波形から出力波形を計算する関数を用意します。

import numpy as np
import matplotlib.pyplot as plt

# 3次多項式モデルの係数
# a1: 線形利得, a2: 2次非線形, a3: 3次非線形(圧縮型なのでa1と逆符号)
a1 = 10.0      # 線形電圧利得 (20 dB)
a2 = 0.5       # 2次非線形係数
a3 = -2.0      # 3次非線形係数 (負 = 圧縮型)

def nonlinear_device(x, a1, a2, a3):
    """メモリレス3次多項式の非線形デバイス"""
    return a1 * x + a2 * x**2 + a3 * x**3

# 理論値: IIP3とP1dBの入力振幅
A_iip3 = np.sqrt(4 * a1 / (3 * abs(a3)))      # IIP3での入力振幅
A_p1db = np.sqrt(0.145 * a1 / abs(a3))         # P1dBでの入力振幅
print(f"IIP3 入力振幅 A = {A_iip3:.4f}")
print(f"P1dB 入力振幅 A = {A_p1db:.4f}")
print(f"IIP3 / P1dB (dB) = {20*np.log10(A_iip3/A_p1db):.2f} dB")

このコードは多項式デバイスと、理論式から計算したIIP3・P1dBの入力振幅を出力します。実行すると IIP3 / P1dB (dB) がおよそ 9.6 dBになることが確認できます。これは前に導いた「IIP3はP1dBより約 9.6 dB高い」という理論的経験則が、与えた係数によらず多項式モデルの構造から必然的に生じることを示しています。係数 $a_1, a_3$ の具体値を変えても、この差はほぼ 9.6 dBのまま保たれます。

利得圧縮カーブ(出力 vs 入力)

次に、単一トーンの振幅を小さい値から大きい値まで掃引し、基本波出力電力を入力電力に対してプロットします。小信号利得の延長線(理想線形)と比べて、どこで 1 dB圧縮するかを可視化します。

import numpy as np
import matplotlib.pyplot as plt

# 入力振幅を対数的に掃引
A_in = np.logspace(-3, 0.3, 200)   # 入力振幅
f0 = 1.0                            # 基本波周波数 (正規化)
fs = 100.0                          # サンプリング周波数
t = np.arange(0, 200, 1/fs)         # 時間軸

P_fund = []      # 基本波出力電力 [dB]
for A in A_in:
    x = A * np.cos(2 * np.pi * f0 * t)
    y = nonlinear_device(x, a1, a2, a3)
    # FFTで基本波成分の振幅を抽出
    Y = np.fft.rfft(y) / len(y) * 2
    freqs = np.fft.rfftfreq(len(y), 1/fs)
    k = np.argmin(np.abs(freqs - f0))   # 基本波ビン
    amp_fund = np.abs(Y[k])
    P_fund.append(20 * np.log10(amp_fund))

P_fund = np.array(P_fund)
P_in_dB = 20 * np.log10(A_in)           # 入力電力(振幅dB)

# 小信号利得による理想線形ライン
G_small = 20 * np.log10(a1)             # 小信号利得 [dB]
P_linear = P_in_dB + G_small

ここでは入力振幅を対数的に掃引し、各振幅でFFTを使って基本波成分だけを取り出しています。出力された基本波電力 P_fund と、小信号利得をそのまま延長した理想線形ライン P_linear を比べると、入力が小さいうちは両者が一致し、入力が大きくなると P_fund が下に折れ曲がる(圧縮する)様子が数値的に得られます。続いてこれをグラフにし、1 dB圧縮点を探します。

# 圧縮量 = 理想線形 - 実際の基本波出力
compression = P_linear - P_fund
# 1 dB圧縮点を探す
idx_p1db = np.argmin(np.abs(compression - 1.0))

plt.figure(figsize=(8, 6))
plt.plot(P_in_dB, P_fund, 'b-', lw=2, label='Fundamental output')
plt.plot(P_in_dB, P_linear, 'k--', lw=1.5, label='Ideal linear (小信号利得)')
plt.plot(P_in_dB[idx_p1db], P_fund[idx_p1db], 'ro', ms=10,
         label=f'P1dB (in={P_in_dB[idx_p1db]:.1f} dB)')
plt.axvline(P_in_dB[idx_p1db], color='r', ls=':', alpha=0.5)
plt.xlabel('Input level [dB, voltage]')
plt.ylabel('Output level [dB, voltage]')
plt.title('Gain Compression Curve and P1dB')
plt.legend()
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('gain_compression.png', dpi=150, bbox_inches='tight')
plt.show()

このグラフから、利得圧縮の本質が一目で読み取れます。第一に、入力が小さい領域では基本波出力(青実線)と理想線形ライン(黒破線)が完全に重なっており、増幅器が線形に振る舞っています。第二に、入力が大きくなると青実線が破線から下に離れ始め、赤点で示した位置でちょうど 1 dB下がります。これがP1dBです。第三に、P1dBの入力レベルは、コード冒頭で理論式から求めた A_p1db を $20\log_{10}$ したdB値とよく一致します。理論と数値シミュレーションが整合していることが確認できます。

2トーン試験のスペクトル

次に、線形性評価の標準手法である2トーン試験を実装します。近接した2つのトーンを入力し、出力スペクトルにIM3積が現れる様子を可視化します。

import numpy as np
import matplotlib.pyplot as plt

fs = 1000.0                  # サンプリング周波数
N = 2**16                    # サンプル数(周波数分解能を上げる)
t = np.arange(N) / fs

f1, f2 = 100.0, 105.0        # 近接2トーン [Hz]
A = 0.15                     # 各トーンの振幅(やや大きめ)

x = A * np.cos(2*np.pi*f1*t) + A * np.cos(2*np.pi*f2*t)
y = nonlinear_device(x, a1, a2, a3)

# 窓関数をかけてFFT(スペクトル漏れ低減)
win = np.hanning(N)
Y = np.fft.rfft(y * win)
freqs = np.fft.rfftfreq(N, 1/fs)
# 電力スペクトル [dB], 最大値で正規化
PSD = 20 * np.log10(np.abs(Y) / np.max(np.abs(Y)) + 1e-12)

plt.figure(figsize=(9, 6))
plt.plot(freqs, PSD, 'b-', lw=0.8)
plt.axvline(2*f1 - f2, color='r', ls='--', alpha=0.7,
            label=f'IM3: 2f1-f2 = {2*f1-f2:.0f} Hz')
plt.axvline(2*f2 - f1, color='r', ls='--', alpha=0.7)
plt.xlim(80, 125)
plt.ylim(-100, 5)
plt.xlabel('Frequency [Hz]')
plt.ylabel('Normalized power [dB]')
plt.title('Two-Tone Test Spectrum — IM3 Products Beside the Carriers')
plt.legend()
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('two_tone_spectrum.png', dpi=150, bbox_inches='tight')
plt.show()

このスペクトルから、2トーン試験で何が起きるかが鮮明に見えます。中央に2本の大きなピーク($f_1 = 100$ Hz、$f_2 = 105$ Hz)が立っており、これが希望波(キャリア)です。その両脇、$2f_1 – f_2 = 95$ Hzと $2f_2 – f_1 = 110$ Hzの位置に、赤破線で示したIM3積が現れています。重要なのは、これらのIM3がキャリアと同じ 5 Hz間隔で並んでいる点です。実際の受信機ではこの間隔が希望帯域内に収まるため、IM3をフィルタで除去できず、希望波を妨害します。これが2トーン試験が「最も厳しい線形性試験」とされる理由です。

IP3の外挿

最後に、入力振幅を掃引して基本波出力とIM3出力をプロットし、傾き1と傾き3の直線を外挿してIP3を求めます。これは実際の測定手順そのものです。

import numpy as np
import matplotlib.pyplot as plt

fs = 1000.0
N = 2**14
t = np.arange(N) / fs
f1, f2 = 100.0, 105.0
win = np.hanning(N)

A_sweep = np.logspace(-3, -0.7, 60)   # 入力振幅を掃引
P_fund, P_im3 = [], []
for A in A_sweep:
    x = A*np.cos(2*np.pi*f1*t) + A*np.cos(2*np.pi*f2*t)
    y = nonlinear_device(x, a1, a2, a3)
    Y = np.fft.rfft(y * win)
    freqs = np.fft.rfftfreq(N, 1/fs)
    def bin_amp(f):
        k = np.argmin(np.abs(freqs - f))
        return np.abs(Y[k])
    P_fund.append(20*np.log10(bin_amp(f1)))
    P_im3.append(20*np.log10(bin_amp(2*f1 - f2)))

P_fund = np.array(P_fund)
P_im3 = np.array(P_im3)
P_in = 20*np.log10(A_sweep)

# 小信号域(最初の方)で1次・3次の直線をフィットして外挿
lo = slice(0, 15)
# 傾きを理論値(1と3)に固定し、切片だけ小信号域から推定
c1 = np.mean(P_fund[lo] - 1*P_in[lo])   # 基本波: 傾き1
c3 = np.mean(P_im3[lo]  - 3*P_in[lo])   # IM3: 傾き3
# 交点(IIP3): 1*x + c1 = 3*x + c3
iip3 = (c1 - c3) / 2
oip3 = 1*iip3 + c1
print(f"外挿IIP3 (入力dB) = {iip3:.2f}")
print(f"理論IIP3 (入力dB) = {20*np.log10(A_iip3):.2f}")

このコードは、小信号域の基本波とIM3のデータ点に対して傾きをそれぞれ 1と3に固定した直線を当てはめ、その交点としてIIP3を求めています。出力される「外挿IIP3」と、理論式 $A_{\text{IP3}} = \sqrt{4a_1/(3|a_3|)}$ から計算した「理論IIP3」がほぼ一致することが確認できます。傾きを固定できるのは、IM3が必ず傾き3で伸びるという理論的事実があるからで、これが少数の測定点からIP3を正確に外挿できる根拠です。続いてこれを図にします。

# 外挿直線を描くための入力範囲(IP3まで延長)
x_ext = np.linspace(P_in[0], iip3 + 3, 100)
plt.figure(figsize=(8, 6))
plt.plot(P_in, P_fund, 'bo', ms=4, label='Fundamental (measured)')
plt.plot(P_in, P_im3, 'rs', ms=4, label='IM3 (measured)')
plt.plot(x_ext, 1*x_ext + c1, 'b--', alpha=0.7, label='slope 1 (extrap.)')
plt.plot(x_ext, 3*x_ext + c3, 'r--', alpha=0.7, label='slope 3 (extrap.)')
plt.plot(iip3, oip3, 'k*', ms=18, label=f'IP3 (IIP3={iip3:.1f} dB)')
plt.xlabel('Input level [dB, voltage]')
plt.ylabel('Output level [dB, voltage]')
plt.title('IP3 Extrapolation from Two-Tone Measurement')
plt.legend(loc='lower right')
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('ip3_extrapolation.png', dpi=150, bbox_inches='tight')
plt.show()

このグラフはIP3測定の決定版とも言える図です。青丸(基本波)は傾き1の直線に、赤四角(IM3)は傾き3の直線にきれいに乗っています。実測点(小信号域)から伸ばした2本の破線は、増幅器が圧縮するはるか手前の高い入力レベルで交わり、その交点(黒星)がIP3です。実測点自体はIP3よりずっと低いレベルにしかないのに、傾きが既知なので外挿で正確にIP3を特定できる――この「観測できない点を外挿で求める」というIP3の本質が視覚的に理解できます。

SFDRの可視化

最後に、雑音フロアを描き加えてSFDRを図示します。IM3が雑音フロアと交わる入力レベルが上限、雑音フロアが下限です。

import numpy as np
import matplotlib.pyplot as plt

# 雑音フロア(出力換算)を仮定 [dB]
P_noise = -75.0

# 基本波とIM3の外挿直線(前のコードのc1, c3, iip3を流用)
x_range = np.linspace(-60, iip3 + 3, 200)
fund_line = 1*x_range + c1
im3_line = 3*x_range + c3

# IM3が雑音フロアと交わる入力レベル = SFDR上限
x_sfdr_top = (P_noise - c3) / 3
# 入力換算雑音フロア(基本波線が雑音と交わる点)
x_noise_in = (P_noise - c1) / 1
sfdr = (2/3) * (iip3 - x_noise_in)

plt.figure(figsize=(8, 6))
plt.plot(x_range, fund_line, 'b-', label='Fundamental (slope 1)')
plt.plot(x_range, im3_line, 'r-', label='IM3 (slope 3)')
plt.axhline(P_noise, color='gray', ls='--', label=f'Noise floor ({P_noise} dB)')
plt.plot(iip3, 1*iip3 + c1, 'k*', ms=16, label='IP3')
plt.annotate('', xy=(x_sfdr_top, P_noise), xytext=(x_noise_in, P_noise),
             arrowprops=dict(arrowstyle='<->', color='green', lw=2))
plt.text((x_noise_in + x_sfdr_top)/2, P_noise + 4,
         f'SFDR ≈ {sfdr:.1f} dB', color='green', ha='center', fontsize=12)
plt.xlabel('Input level [dB]')
plt.ylabel('Output level [dB]')
plt.title('Spurious-Free Dynamic Range (SFDR)')
plt.legend(loc='upper left')
plt.grid(True, alpha=0.3)
plt.ylim(P_noise - 10, 1*iip3 + c1 + 10)
plt.tight_layout()
plt.savefig('sfdr.png', dpi=150, bbox_inches='tight')
plt.show()

このグラフはSFDRの定義を完璧に視覚化しています。下限は雑音フロア(灰色破線)で、これより弱い信号は雑音に埋もれます。上限は、IM3線(赤)が雑音フロアと交わる入力レベルです。この入力では、ちょうどIM3スプリアスが雑音と同じ高さに顔を出します。緑の両矢印で示した幅がSFDRであり、その値が公式 $\text{SFDR} = \tfrac{2}{3}(\text{IIP3} – P_{N,\text{in}})$ で計算した値と一致します。基本波線(青)の傾き1とIM3線(赤)の傾き3の違いが、$\tfrac{2}{3}$ という係数を視覚的に説明している点にも注目してください。傾き3のIM3が傾き1の基本波より急速に立ち上がるため、使える範囲が $\tfrac{2}{3}$ に圧縮されるのです。

まとめ

本記事では、RF増幅器の線形性を表す2大指標であるP1dBとIP3を、3次多項式モデルから一貫して導出し、Pythonで可視化しました。要点を整理します。

  • 多項式モデル: 増幅器の非線形性は $y = a_1 x + a_2 x^2 + a_3 x^3$ で近似でき、3次項 $a_3$ が利得圧縮とIM3の両方を生みます。圧縮型では $a_3$ は $a_1$ と逆符号です。
  • P1dB(利得圧縮点): 単一トーンの3次項展開から、基本波利得が $G_{\text{eff}} = a_1 + \tfrac{3}{4}a_3 A^2$ と圧縮されることが導かれ、1 dB低下する点をP1dBと定義します。
  • IP3(3次インターセプト点): 2トーンのIM3は傾き3、基本波は傾き1で伸び、その外挿交点がIP3です。$A_{\text{IP3}} = \sqrt{4a_1/(3|a_3|)}$ であり、IIP3はP1dBより約 9.6 dB高いという経験則が理論的に導かれます。
  • IIP3とIIP2: 奇数次(IM3)は希望帯域内に落ちて除去不能、偶数次(IM2)は帯域外に落ちやすい。狭帯域ではIIP3、ゼロIFではIIP2が重要です。
  • カスケード合成: $1/\text{IIP3}_{\text{tot}} = 1/\text{IIP3}_1 + G_1/\text{IIP3}_2$ となり、線形性は後段が支配的です。NF(前段重視)とのトレードオフが受信機設計の核心です。
  • SFDR: $\text{SFDR} = \tfrac{2}{3}(\text{IIP3} – P_{N,\text{in}})$。係数 $\tfrac{2}{3}$ は基本波とIM3の傾き差(1と3)に由来します。

これらの指標は、受信機のダイナミックレンジ設計、送信機の電力バックオフ設計、レーダーの偽ターゲット解析など、RFシステムのあらゆる場面で使われます。線形性と雑音、利得のトレードオフを定量的に扱えるようになることが、優れたRF設計者への第一歩です。

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