熱雑音(ジョンソンノイズ)の理論 — 雑音指数と雑音温度を基礎から導出する

携帯電話で遠くの基地局から微弱な電波を受信するとき、あるいは電波望遠鏡が何十億光年かなたの天体からの信号を捉えようとするとき、受信機の性能を最終的に制限するのは何でしょうか? それは「雑音(ノイズ)」です。どれほど精巧に設計された受信機であっても、回路の抵抗体が温度を持つ限り、電子の熱運動による避けられない電圧ゆらぎ — 熱雑音(ジョンソンノイズ) — が発生します。

この雑音の壁を正しく理解し定量化できなければ、受信感度を論じることも、通信システムのリンクバジェットを計算することもできません。熱雑音の理論は、以下のように驚くほど広い応用先を持っています。

  • 通信システム設計: 衛星通信や移動体通信のリンクバジェットにおいて、受信系の雑音温度を見積もり、所要 $C/N$ を計算する
  • 電波天文学: 微弱な天体信号を検出するため、受信系全体の雑音温度を数 K 以下に抑える極低温受信機の設計指針を与える
  • レーダー工学: レーダー方程式の中で最小検知信号を決定し、探知距離を計算する基盤となる
  • 電子回路設計: 低雑音増幅器(LNA)の雑音指数を最適化し、カスケード接続での雑音劣化を最小限に抑える

本記事の内容

  • 雑音の物理的起源 — 熱雑音、ショット雑音、1/f ノイズ
  • ナイキストの定理 $\overline{v^2} = 4kTBR$ の導出
  • 雑音電力 $N = kTB$ の意味
  • 雑音指数(Noise Figure)$F$ の定義と物理的意味
  • 雑音温度 $T_e$ と雑音指数の関係
  • 縦続接続の雑音指数 — フリスの公式の導出
  • 等価雑音帯域幅の概念と計算法
  • Python による雑音スペクトル・縦続接続 NF・雑音温度の可視化

前提知識

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

雑音とは何か

回路における雑音の直感的理解

電子回路における「雑音(ノイズ)」とは、本来の信号に重畳される不規則な電圧・電流変動のことです。テレビの砂嵐画面やラジオの「ザー」という音を思い浮かべると、雑音がどのようなものかイメージしやすいでしょう。

雑音は信号と異なり、予測できません。将来の値を正確に知ることは原理的に不可能です。しかし、その統計的性質(平均パワー、スペクトル分布など)は物理法則で正確に予測できます。これこそが雑音理論の核心です。個々の瞬間値は予測できないが、全体としての振る舞いは厳密に記述できる — この考え方は統計力学と同じ発想です。

雑音には大きく分けて以下の3種類があります。

雑音の種類 物理的起源 スペクトル 主に問題となる場面
熱雑音(ジョンソンノイズ) 抵抗体中の電子の熱運動 白色(均一) あらゆる回路
ショット雑音 電流を担う電荷の離散性 白色(均一) ダイオード、トランジスタ
1/f ノイズ(フリッカノイズ) 結晶欠陥、トラップ準位 $1/f$ に比例 低周波回路、発振器

これらの中で最も基本的かつ避けられないのが熱雑音です。熱雑音は温度がゼロでない限り必ず存在し、抵抗体の材質や構造にほとんど依存しません。1927 年にジョン・B・ジョンソン(John B. Johnson)が実験的に発見し、1928 年にハリー・ナイキスト(Harry Nyquist)が理論的に説明したことから、ジョンソン・ナイキスト雑音とも呼ばれます。

まずはこの熱雑音の物理的起源を掘り下げましょう。その後、ショット雑音と 1/f ノイズについても触れ、雑音の全体像を把握してから定量的な議論に進みます。

熱雑音の物理的起源

電子の熱運動から雑音が生まれるメカニズム

抵抗体の内部には自由電子が無数に存在しています。温度が絶対零度(0 K)より高い限り、これらの電子は熱エネルギーによってランダムに運動しています。統計力学によれば、温度 $T$ における電子1個あたりの平均運動エネルギーは、各自由度について $\frac{1}{2}kT$($k$ はボルツマン定数、$k = 1.381 \times 10^{-23}$ J/K)です。

外部から電圧を加えていない状態でも、電子はランダムに動き回っています。ある瞬間にたまたま多くの電子が同じ方向に動くと、抵抗体の両端にわずかな電圧が生じます。次の瞬間にはまた別の配置になるので、この電圧はランダムに揺れ動きます。これが熱雑音の正体です。

重要な点は、この雑音電圧の時間平均はゼロであることです。電子の運動に方向の偏りはないため、長時間平均すれば正と負のゆらぎが打ち消し合います。しかし、電圧の二乗平均(パワーに対応する量)はゼロではありません。温度が高いほど電子の運動が激しく、二乗平均電圧も大きくなります。

$$ \overline{v(t)} = 0, \quad \overline{v^2(t)} > 0 $$

ここで上線は時間平均(またはアンサンブル平均)を表します。$\overline{v^2(t)}$ は平均二乗雑音電圧と呼ばれ、雑音の強さを表す基本量です。

熱雑音のスペクトル特性

熱雑音のもう一つの重要な特徴は、そのスペクトルが白色(ホワイトノイズ) であることです。すなわち、すべての周波数成分が等しいパワーを持っています。可視光で「白色光」がすべての色(波長)を均等に含むのと同じイメージです。

厳密に言えば、熱雑音が白色であるのは $hf \ll kT$ の範囲($h$ はプランク定数)です。室温($T \approx 300$ K)では $kT/h \approx 6.25 \times 10^{12}$ Hz ですから、通常の電子回路が扱う数百 GHz 以下の周波数帯では、熱雑音を完全な白色とみなして問題ありません。量子効果が重要になるのはテラヘルツ以上の領域です。

白色ノイズであるという性質は、後で導出するナイキストの定理の中で「帯域幅 $B$ に比例する」という形で現れます。帯域幅が広いほど多くの雑音周波数成分が含まれるため、雑音パワーが増大するのです。

ここまでで、熱雑音が電子の熱運動に起因し、白色スペクトルを持つことがわかりました。次に、この熱雑音の大きさを定量的に表すナイキストの定理を導出します。

ナイキストの定理の導出

ナイキストの定理が主張すること

ナイキストの定理は、温度 $T$ の抵抗 $R$ が発生する熱雑音の平均二乗電圧を与えます。結論を先に述べると、帯域幅 $B$ [Hz] の範囲で観測される平均二乗雑音電圧は次の式で表されます。

$$ \overline{v^2} = 4kTBR $$

この式の各要素には明確な物理的意味があります。

  • $k = 1.381 \times 10^{-23}$ J/K: ボルツマン定数。ミクロな熱エネルギーとマクロな温度をつなぐ
  • $T$: 抵抗体の絶対温度 [K]。温度が高いほど電子の運動が激しく雑音が大きい
  • $B$: 観測帯域幅 [Hz]。白色ノイズなので帯域幅に比例する
  • $R$: 抵抗値 [$\Omega$]。抵抗が大きいほど電子の運動が電圧として現れやすい

式の形として、$kT$(1自由度あたりの熱エネルギーのオーダー)に帯域幅 $B$ と抵抗 $R$ がかかっている構造に注目してください。帯域幅はエネルギーが分配される周波数モードの数に対応し、抵抗はそのエネルギーが電圧として観測される効率に対応しています。

導出の概要 — 伝送線路モデル

ナイキストの元々の導出は、熱力学的平衡の議論と伝送線路モデルを用いた巧みなものです。ここではその本質を追ってみましょう。

長さ $\ell$ の無損失伝送線路の両端に、温度 $T$ の同じ抵抗値 $R$ の抵抗をそれぞれ接続した系を考えます。特性インピーダンスは $Z_0 = R$ に等しいとします(すなわちインピーダンスが整合しており、反射がない状態)。

系全体が温度 $T$ の熱平衡にあるとき、熱力学の第二法則から、両方の抵抗の間で正味のエネルギー移動はゼロでなければなりません。もし一方から他方へ正味の熱が流れれば、それは温度差なしに熱が移動することになり、第二法則に矛盾します。

しかし、各抵抗は独立に雑音を発生しています。抵抗 $R_1$ が発生した雑音パワーは伝送線路を通って $R_2$ に吸収され、同様に $R_2$ の雑音パワーは $R_1$ に吸収されます。平衡状態ではこれらのパワーが等しく、互いに打ち消し合います。

伝送線路上の電磁モード

次に、この伝送線路の両端を瞬間的に開放(または短絡)して、線路を閉じた共振器にするという思考実験を行います。線路上には定在波が立ち、許容される周波数モードは次の条件を満たすものに限られます。

$$ f_n = \frac{n \cdot v}{2\ell}, \quad n = 1, 2, 3, \dots $$

ここで $v$ は伝送線路上の信号速度です。周波数間隔は $\Delta f = v / (2\ell)$ であるから、周波数幅 $B$ の中に含まれるモード数は次のようになります。

$$ N = \frac{B}{\Delta f} = \frac{2\ell B}{v} $$

エネルギー等分配則の適用

統計力学のエネルギー等分配則によれば、熱平衡において各独立なモードには平均 $kT$ のエネルギーが蓄えられます(運動エネルギーとポテンシャルエネルギーの各自由度に $\frac{1}{2}kT$ ずつ、合計 $kT$)。

したがって、帯域幅 $B$ 内の全モードに蓄えられる総エネルギー $E$ は次のようになります。

$$ E = N \cdot kT = \frac{2\ell B}{v} \cdot kT $$

雑音パワーの導出

このエネルギーは両端の2つの抵抗から等しく供給されたものです。一方の抵抗が供給するパワー $P$ を考えると、この抵抗から出た電磁波が伝送線路上を伝わり、端までの往復時間 $\tau = 2\ell / v$ で戻ってくる間にエネルギー $E/2$ を蓄えることになります。

ここで、一方の抵抗から供給されたエネルギーは全体の半分なので $E/2$ です。これが往復時間 $\tau = 2\ell/v$ の間に蓄積されたものと考えると、パワー(単位時間あたりのエネルギー)は次のようになります。

$$ P = \frac{E/2}{\tau} = \frac{\frac{2\ell B}{v} \cdot kT \cdot \frac{1}{2}}{\frac{2\ell}{v}} $$

分子と分母の $2\ell/v$ が相殺されて、非常にすっきりした結果が得られます。

$$ P = kTB $$

これが1つの抵抗が整合負荷に供給できる最大雑音パワー(有能雑音パワー)です。抵抗値 $R$ によらない普遍的な結果であることに注意してください。雑音パワーは温度と帯域幅だけで決まるのです。

平均二乗電圧への変換

雑音パワー $P = kTB$ を平均二乗電圧に変換しましょう。雑音源を等価回路で表すと、内部抵抗 $R$ を持つ電圧源 $v_n$ として描けます(テブナン等価回路)。この電圧源が整合した負荷 $R$ に供給する最大電力は次のとおりです。

電圧源 $v_n$(実効値)が内部抵抗 $R$ と負荷抵抗 $R$ の直列回路に電流を流すとき、負荷に供給される電力は次のようになります。

$$ P = \frac{\overline{v_n^2}}{4R} $$

ここで $4R$ が分母に現れるのは、直列接続の全抵抗が $2R$ であり、その半分($R$)の負荷に分配されるパワーが $\overline{v_n^2}/(2R)^2 \times R = \overline{v_n^2}/(4R)$ となるためです。

この電力が $kTB$ に等しいので次の式が得られます。

$$ \frac{\overline{v_n^2}}{4R} = kTB $$

両辺に $4R$ を掛けると、ナイキストの定理が導かれます。

$$ \boxed{\overline{v_n^2} = 4kTBR} $$

この $v_n$ を開放端雑音電圧と呼びます。実効値(rms値)で書くと次のようになります。

$$ v_{n,\text{rms}} = \sqrt{4kTBR} $$

同様に、ノートン等価回路として雑音電流源を考えることもできます。抵抗 $R$ に並列に置かれた雑音電流源の平均二乗電流は次のとおりです。

$$ \overline{i_n^2} = \frac{\overline{v_n^2}}{R^2} = \frac{4kTB}{R} $$

具体的な数値例

室温 $T = 300$ K、帯域幅 $B = 1$ MHz、抵抗 $R = 50\ \Omega$ の場合の雑音電圧を計算してみましょう。

$$ v_{n,\text{rms}} = \sqrt{4 \times 1.381 \times 10^{-23} \times 300 \times 10^6 \times 50} $$

中身を計算すると次のようになります。

$$ 4kT = 4 \times 1.381 \times 10^{-23} \times 300 = 1.657 \times 10^{-20}\ \text{V}^2/(\text{Hz}\cdot\Omega) $$

この値に帯域幅 $B = 10^6$ Hz と抵抗 $R = 50\ \Omega$ を掛けると、平均二乗雑音電圧が得られます。

$$ \overline{v_n^2} = 1.657 \times 10^{-20} \times 10^6 \times 50 = 8.285 \times 10^{-13}\ \text{V}^2 $$

平方根を取ってrms値に変換すると、次のようになります。

$$ v_{n,\text{rms}} = \sqrt{8.285 \times 10^{-13}} \approx 0.91\ \mu\text{V} $$

50 $\Omega$ の抵抗が室温で 1 MHz の帯域幅にわたって発生する雑音は約 0.91 $\mu$V です。これは非常に小さい値ですが、微弱信号を扱う受信機にとっては無視できない大きさです。たとえば、感度が $-100$ dBm のレーダー受信機では、信号レベルが 0.1 pW(ピコワット)のオーダーなので、この雑音レベルは十分に問題となります。

ここまでで、熱雑音の大きさが $\overline{v^2} = 4kTBR$ で与えられること、そして整合負荷への有能雑音パワーが $N = kTB$ であることを導出しました。次に、熱雑音以外の雑音源 — ショット雑音と 1/f ノイズ — についても触れ、雑音の全体像を把握しましょう。

雑音電力 $N = kTB$ の意味

先の導出で得られた $N = kTB$ は、雑音理論の中で最も頻繁に使われる式の一つです。この式の意味と使い方をもう少し深掘りしましょう。

$N = kTB$ は、温度 $T$ の抵抗が帯域幅 $B$ の整合負荷に供給できる最大の雑音電力(有能雑音電力, available noise power)を表します。「有能」という修飾語は、インピーダンスが完全に整合した理想的な条件での最大電力転送を意味しています。

この式を dBm(デシベルミリワット)で表す実務的な近似式がよく使われます。室温 $T_0 = 290$ K(業界標準の基準温度)を代入すると次のようになります。

$$ N_{\text{dBm}} = -174 + 10 \log_{10}(B)\ [\text{dBm}] $$

ここで $-174$ dBm/Hz は「室温における1 Hz あたりの雑音電力」です。この数値を導出してみましょう。

$$ kT_0 = 1.381 \times 10^{-23} \times 290 = 4.004 \times 10^{-21}\ \text{W/Hz} $$

これをdBm に変換します。

$$ 10 \log_{10}\left(\frac{4.004 \times 10^{-21}}{10^{-3}}\right) = 10 \log_{10}(4.004 \times 10^{-18}) \approx -174.0\ \text{dBm/Hz} $$

したがって、帯域幅 $B = 1$ MHz ならば次のようになります。

$$ N_{\text{dBm}} = -174 + 10\log_{10}(10^6) = -174 + 60 = -114\ \text{dBm} $$

この $-174$ dBm/Hz という値は通信工学やレーダー工学の実務で頻繁に登場する「魔法の数字」です。雑音フロアの計算を暗算で行うための出発点として覚えておく価値があります。

ここまでで雑音パワーの基本が固まりました。次に、熱雑音以外の重要な雑音源 — ショット雑音と 1/f ノイズ — を概観します。

ショット雑音

電流の粒子性に起因する雑音

ショット雑音(shot noise)は、電流を構成する電荷キャリア(電子や正孔)が離散的な粒子であることに起因する雑音です。水の流れに例えると分かりやすくなります。蛇口から流れる水は連続的に見えますが、実際には水分子が一つ一つ離散的にやってきています。流量を精密に測定すれば、分子の到着がランダムであるために微小なゆらぎが検出されるはずです。

電流も同様で、導線の中を流れる電子は一つ一つ独立にランダムなタイミングで到着します。電流の平均値を $I_{\text{DC}}$ としたとき、ショット雑音の平均二乗電流は次のショットキーの公式で与えられます。

$$ \overline{i_s^2} = 2qI_{\text{DC}}B $$

ここで $q = 1.602 \times 10^{-19}$ C は電子の電荷量、$B$ は帯域幅です。

ショット雑音の重要な性質は次のとおりです。

  • 白色ノイズである(熱雑音と同様に帯域幅に比例)
  • 直流電流 $I_{\text{DC}}$ に比例する(電流が流れないとショット雑音は発生しない)
  • 半導体のPN接合(ダイオード、トランジスタ)で特に顕著

通常の金属抵抗体ではショット雑音は観測されません。金属中の電子は互いに相関を持ちながら流れるため、離散性による揺らぎが平均化されるからです。一方、PN接合ではキャリアがポテンシャル障壁を独立にランダムに越えるため、ショット雑音が顕在化します。

ショット雑音が支配的になるのか、熱雑音が支配的になるのかは回路の条件によります。PN接合を含む能動素子ではショット雑音が主要な雑音源となり、受動回路では熱雑音が支配的です。

1/f ノイズ(フリッカ雑音)

低周波で増大する雑音

1/f ノイズ(フリッカ雑音、ピンクノイズとも呼ばれます)は、パワースペクトル密度が周波数 $f$ にほぼ反比例して増大する雑音です。

$$ S_v(f) \propto \frac{1}{f^{\alpha}}, \quad \alpha \approx 1 $$

この雑音の物理的起源は完全には解明されていませんが、半導体中の結晶欠陥やトラップ準位(電子が一時的に捕獲される不純物準位)が関与していると考えられています。電子がトラップに捕獲・放出される過程がさまざまな時定数で起こり、それらが重ね合わさることで $1/f$ 特性が生まれるというモデルが広く受け入れられています。

1/f ノイズは低周波で急激に増大するため、特に次のような場面で問題になります。

  • 発振器の位相雑音: 搬送波近傍の位相ゆらぎに 1/f ノイズが大きく寄与する
  • 直流増幅器: 直流付近の信号を扱う回路では 1/f ノイズが支配的
  • センサ回路: 低周波の微弱信号を検出する回路

1/f ノイズと白色ノイズが等しくなる周波数をコーナー周波数 $f_c$ と呼びます。$f_c$ より低い周波数では 1/f ノイズが支配的、$f_c$ より高い周波数では白色ノイズ(熱雑音やショット雑音)が支配的となります。

ここまでで3種類の雑音源を概観しました。受信機やアンプの性能を議論する上で最も重要なのは、これらの雑音源を統一的に扱う枠組みです。次に、その枠組みの中心概念である雑音指数(Noise Figure) を定義します。

雑音指数(Noise Figure)の定義

SNR の劣化を定量化する指標

増幅器やミキサなどの2端子対回路(2ポートネットワーク)は、入力信号を増幅すると同時に、内部で発生する雑音も出力に加えてしまいます。つまり、信号対雑音比(SNR: Signal-to-Noise Ratio)は回路を通過するたびに劣化します。このSNR の劣化度合いを定量化するのが雑音指数です。

大雑把に言えば、「この回路を通すと SNR がどれだけ悪くなるか」を表す数値です。理想的なノイズフリーの回路なら SNR は変わらず、雑音指数は1(0 dB)になります。現実の回路は内部雑音を付加するため、雑音指数は必ず1より大きくなります。

数学的定義

雑音指数 $F$(線形値)は、入力信号源の温度が標準温度 $T_0 = 290$ K のときの入出力 SNR の比として定義されます。

$$ \boxed{F = \frac{SNR_{\text{in}}}{SNR_{\text{out}}}\bigg|_{T_0 = 290\text{ K}}} $$

ここで $SNR$ は電力比で表したものです。$F$ は常に $F \geq 1$ となります。

デシベルで表したものを NF(Noise Figure)と呼びます。

$$ NF = 10\log_{10}(F)\ [\text{dB}] $$

$F = 1$ のとき $NF = 0$ dB(理想回路)、$F = 2$ のとき $NF = 3$ dB(SNR が半分に劣化)です。

雑音指数の展開

この定義をもう少し具体的に展開しましょう。利得 $G$(電力利得)を持つ2ポート回路の入力に、信号電力 $S_i$ と雑音電力 $N_i = kT_0B$ が加わっているとします。出力の信号電力は $S_o = GS_i$ です。出力の雑音電力 $N_o$ は、入力雑音が増幅されたもの $GN_i$ と回路内部で付加される雑音 $N_a$ の和です。

$$ N_o = GN_i + N_a = GkT_0B + N_a $$

したがって、入出力 SNR はそれぞれ次のようになります。

$$ SNR_{\text{in}} = \frac{S_i}{N_i} = \frac{S_i}{kT_0B} $$

一方、出力側の SNR は出力雑音 $N_o = GkT_0B + N_a$ を用いて次のように書けます。

$$ SNR_{\text{out}} = \frac{S_o}{N_o} = \frac{GS_i}{GkT_0B + N_a} $$

雑音指数の定義に代入します。

$$ F = \frac{SNR_{\text{in}}}{SNR_{\text{out}}} = \frac{S_i/(kT_0B)}{GS_i/(GkT_0B + N_a)} $$

$S_i$ が分子分母で相殺され(これは重要な性質で、雑音指数が入力信号レベルによらないことを意味します)、次のようになります。

$$ F = \frac{GkT_0B + N_a}{GkT_0B} = 1 + \frac{N_a}{GkT_0B} $$

この結果は直感的にも明快です。雑音指数は「1 + 回路が付加した雑音 / 入力雑音が利得を受けたもの」であり、付加雑音 $N_a$ がゼロなら $F = 1$ です。

パッシブ素子の雑音指数

減衰器やフィルタなどのパッシブ(受動)素子は、利得 $G < 1$(すなわち損失がある)です。損失 $L = 1/G > 1$ のパッシブ素子が温度 $T_0$ にあるとき、その雑音指数は損失に等しくなります。

$$ F = L = \frac{1}{G} $$

たとえば、3 dB の損失がある同軸ケーブルの雑音指数は $F = 2$(NF = 3 dB)です。これは、ケーブル自身が温度 $T_0$ で熱雑音を発生するためです。パッシブ素子の損失と雑音指数が等しいという関係は、熱力学的平衡の要請から導かれます。

ここまでで雑音指数の定義と物理的意味を理解しました。しかし、通信システムでは単一の素子だけでなく、LNA → ミキサ → IF アンプ → … のように複数の素子が縦続接続されます。この場合、系全体の雑音指数はどうなるのでしょうか? この問いに答えるのがフリスの公式です。その前に、雑音指数と密接に関係する雑音温度の概念を導入しましょう。

雑音温度

雑音指数の「温度」による再解釈

雑音指数は SNR の劣化度を表す便利な指標ですが、特に低雑音の受信機(衛星通信や電波天文)では、もう一つの表現 — 等価雑音温度 $T_e$ — がよく使われます。

アイデアは単純です。2ポート回路が内部で付加する雑音 $N_a$ を、「入力に接続された仮想的な抵抗が温度 $T_e$ で発生する雑音に等しい」と読み替えるのです。つまり、雑音のない理想的な回路の入力に温度 $T_e$ の雑音源を接続すれば、同じ出力雑音が得られるような温度 $T_e$ を等価雑音温度と定義します。

$$ N_a = GkT_eB $$

ここで $G$ は回路の利得、$B$ は帯域幅です。この式を先ほどの雑音指数の式に代入すると、雑音指数と雑音温度の関係が得られます。

$$ F = 1 + \frac{N_a}{GkT_0B} = 1 + \frac{GkT_eB}{GkT_0B} = 1 + \frac{T_e}{T_0} $$

$G$ と $B$ が相殺されて、非常にシンプルな関係式が得られました。

$$ \boxed{T_e = (F – 1)T_0} $$

逆に書けば次のようになります。

$$ \boxed{F = 1 + \frac{T_e}{T_0}} $$

なぜ雑音温度が使われるのか

雑音指数と雑音温度は同じ情報を持つ等価な表現ですが、用途によって使い分けられます。

表現 長所 典型的な使用場面
雑音指数 $F$ (NF [dB]) 直感的(SNR劣化度)、dBで扱いやすい 一般的な通信回路
雑音温度 $T_e$ [K] 低雑音で高い分解能、加法的 衛星通信、電波天文

たとえば、$NF = 0.5$ dB の LNA と $NF = 0.3$ dB の LNA を区別する場合、雑音指数の差は 0.2 dB と非常に小さく扱いにくいです。一方、雑音温度に変換すると $T_e \approx 35.4$ K と $T_e \approx 20.4$ K となり、15 K の差として明確に区別できます。

また、雑音温度には重要な利点があります。それは加法性です。複数の雑音源を入力に換算した雑音温度は単純に加算できます。一方、雑音指数は乗法的に扱う必要があります。この加法性のおかげで、縦続接続の解析が直感的になります。

ここまでで雑音指数と雑音温度の関係を理解しました。いよいよ、縦続接続された多段回路の雑音指数を求めるフリスの公式を導出します。

縦続接続の雑音指数 — フリスの公式

なぜ初段の雑音が支配的なのか

受信機は通常、アンテナ → LNA → ミキサ → IF アンプ → … のように、複数段の回路が直列(縦続)に接続されています。この系全体の雑音指数はどのように求めるのでしょうか?

直感的に考えてみましょう。初段(LNA)の出力雑音は、2段目以降の全ての回路で増幅されて最終出力に現れます。一方、2段目の内部雑音は初段の増幅を受けていないので、初段の利得分だけ相対的に「小さく」見えます。3段目の内部雑音はさらに1段目と2段目の利得で割り引かれます。したがって、初段の雑音指数が系全体の雑音性能を支配するのです。

これが「LNA は受信系の最前段に置くべし」という設計原則の根拠です。

2段縦続接続の導出

まず、利得 $G_1$、雑音指数 $F_1$(雑音温度 $T_{e1}$)の回路と、利得 $G_2$、雑音指数 $F_2$(雑音温度 $T_{e2}$)の回路が縦続接続された場合を考えます。

入力の雑音電力は $N_i = kT_0B$ です。

第1段の出力雑音は、入力雑音の増幅分と第1段の内部雑音の和です。

$$ N_{o1} = G_1 kT_0B + G_1 kT_{e1}B = G_1 k(T_0 + T_{e1})B $$

第2段の出力雑音は、第1段の出力雑音を第2段で増幅したものと、第2段の内部雑音の和です。

$$ N_{o2} = G_2 N_{o1} + G_2 kT_{e2}B $$

第1段の出力を代入すると次のようになります。

$$ N_{o2} = G_2 G_1 k(T_0 + T_{e1})B + G_2 kT_{e2}B $$

共通因子をくくり出します。

$$ N_{o2} = G_1 G_2 kB\left(T_0 + T_{e1} + \frac{T_{e2}}{G_1}\right) $$

系全体を1つの回路と見なしたときの等価雑音温度 $T_{e,\text{total}}$ は次のようになります。

$$ T_{e,\text{total}} = T_{e1} + \frac{T_{e2}}{G_1} $$

雑音指数に変換すると($T_e = (F-1)T_0$ を使って)次のようになります。

$$ F_{\text{total}} = 1 + \frac{T_{e,\text{total}}}{T_0} = 1 + (F_1 – 1) + \frac{(F_2 – 1)T_0}{G_1 T_0} $$

整理すると次の結果が得られます。

$$ F_{\text{total}} = F_1 + \frac{F_2 – 1}{G_1} $$

$n$ 段への一般化 — フリスの公式

同じ議論を $n$ 段に拡張すると、フリスの公式(Friis formula for noise) が得られます。

$$ \boxed{F_{\text{total}} = F_1 + \frac{F_2 – 1}{G_1} + \frac{F_3 – 1}{G_1 G_2} + \cdots + \frac{F_n – 1}{G_1 G_2 \cdots G_{n-1}}} $$

雑音温度で書くと次のようになります。

$$ \boxed{T_{e,\text{total}} = T_{e1} + \frac{T_{e2}}{G_1} + \frac{T_{e3}}{G_1 G_2} + \cdots + \frac{T_{en}}{G_1 G_2 \cdots G_{n-1}}} $$

フリスの公式の物理的意味

この公式から読み取れる重要なメッセージをまとめます。

  1. 初段が支配的: $G_1$ が十分大きければ、第2項以降は $1/G_1$ で割り引かれて小さくなります。したがって、系全体の雑音指数は $F_1$ でほぼ決まります
  2. 初段に低雑音・高利得の LNA を置く: $F_1$ を小さくし $G_1$ を大きくすることで、後段の影響を抑制できます
  3. 損失素子を初段に置くと致命的: フィルタや長いケーブルなど損失のある素子($G < 1$)を LNA の前に置くと、$G_1 < 1$ となり後段の寄与が増幅されてしまいます

具体的な数値例

典型的な受信系の例を計算してみましょう。

  • ケーブル損失: 2 dB($G_1 = 0.631$, $F_1 = 1.585$)
  • LNA: 利得 20 dB($G_2 = 100$), NF = 1 dB($F_2 = 1.259$)
  • ミキサ: 利得 -6 dB($G_3 = 0.251$), NF = 8 dB($F_3 = 6.310$)

構成A: ケーブル → LNA → ミキサ

$$ F_A = 1.585 + \frac{1.259 – 1}{0.631} + \frac{6.310 – 1}{0.631 \times 100} $$

$$ F_A = 1.585 + 0.410 + 0.084 = 2.079 \quad (NF_A = 3.18\ \text{dB}) $$

構成B: LNA → ケーブル → ミキサ(LNAをケーブルの前に移動)

$$ F_B = 1.259 + \frac{1.585 – 1}{100} + \frac{6.310 – 1}{100 \times 0.631} $$

$$ F_B = 1.259 + 0.006 + 0.084 = 1.349 \quad (NF_B = 1.30\ \text{dB}) $$

LNA をケーブルの前に移動するだけで、系全体の NF が 3.18 dB から 1.30 dB へ劇的に改善されました。これは約 1.88 dB の改善であり、受信感度に換算すると大きな差です。

この数値例は、フリスの公式が伝える最も実用的な教訓 — 低雑音・高利得の素子を受信系の最前段に置くべき — を如実に示しています。

ここまでで雑音指数と縦続接続の計算方法を習得しました。次に、雑音計算でしばしば見落とされがちな概念 — 等価雑音帯域幅 — について解説します。

等価雑音帯域幅

なぜ「帯域幅」の定義が重要なのか

ナイキストの定理 $N = kTB$ に現れる帯域幅 $B$ とは、正確にはどのような帯域幅でしょうか? 理想的な矩形フィルタ(通過帯域内で利得が一定、帯域外でゼロ)であれば、帯域幅の定義は明白です。しかし、現実のフィルタや増幅器の周波数特性は滑らかに変化し、帯域端が鋭く定義されません。

たとえば、1次RCフィルタのゲインは $|H(f)| = 1/\sqrt{1 + (f/f_c)^2}$ であり、遮断周波数 $f_c$ を超えても雑音は完全にはゼロにはなりません。$-3$ dB 帯域幅を使うと雑音電力を過小評価し、十分遠方まで含めると過大評価してしまいます。

この問題を解決するのが等価雑音帯域幅(ENB: Equivalent Noise Bandwidth) です。

等価雑音帯域幅の定義

ある回路の電力利得の周波数特性を $|H(f)|^2$ とします。等価雑音帯域幅 $B_n$ は、この回路を通過する白色雑音の総電力が、ピーク利得 $|H(f_0)|^2$ を持つ理想矩形フィルタと等しくなるような帯域幅として定義されます。

$$ \boxed{B_n = \frac{\int_0^{\infty} |H(f)|^2\, df}{|H(f_0)|^2}} $$

ここで $f_0$ は最大利得が得られる周波数(通常は中心周波数または直流)です。

この定義の幾何学的意味は明快です。$|H(f)|^2$ のカーブの下の面積を、高さ $|H(f_0)|^2$ の長方形で置き換えたときの幅が $B_n$ です。雑音計算において、$N = kTB_n$ として等価雑音帯域幅を使えば、フィルタの形状に関わらず正確な雑音電力が得られます。

代表的なフィルタの等価雑音帯域幅

いくつかの典型的なフィルタについて、$-3$ dB 帯域幅 $B_{3\text{dB}}$ と等価雑音帯域幅 $B_n$ の関係を示します。

フィルタの種類 $B_n / B_{3\text{dB}}$ 備考
1次RC(1段) $\pi/2 \approx 1.571$ 最も基本的
2次バタワース $\pi/4 \times \sqrt{2} \approx 1.111$
$n$ 次バタワース 解析的に求まる $n$ が大きいほど1に近づく
理想矩形フィルタ 1.000 理想的だが非現実的
ガウシアンフィルタ $\sqrt{\pi/(2\ln 2)} \approx 1.506$

1次RCフィルタの場合を導出してみましょう。伝達関数は次のとおりです。

$$ |H(f)|^2 = \frac{1}{1 + (f/f_c)^2} $$

ここで $f_c$ は $-3$ dB 遮断周波数です。ピーク利得は $|H(0)|^2 = 1$ なので次のようになります。

$$ B_n = \int_0^{\infty} \frac{df}{1 + (f/f_c)^2} $$

$u = f/f_c$ と置換すると $df = f_c\, du$ となり、次のようになります。

$$ B_n = f_c \int_0^{\infty} \frac{du}{1 + u^2} = f_c \left[\arctan(u)\right]_0^{\infty} = f_c \cdot \frac{\pi}{2} $$

$B_{3\text{dB}} = f_c$ なので、$B_n = (\pi/2) B_{3\text{dB}} \approx 1.571 B_{3\text{dB}}$ となります。つまり、1次RCフィルタの場合、$-3$ dB 帯域幅を雑音計算にそのまま使うと雑音電力を約 36% 過小評価してしまいます。

ここまでで雑音に関する理論的枠組みが整いました。次に、これらの概念を Python で可視化し、理論の理解をさらに深めましょう。

Python による雑音の可視化

熱雑音スペクトルの生成と可視化

まず、熱雑音の時間波形と周波数スペクトルを生成し、白色ノイズであることを視覚的に確認します。

import numpy as np
import matplotlib.pyplot as plt

# パラメータ設定
k = 1.381e-23          # ボルツマン定数 [J/K]
T = 300                # 温度 [K]
R = 50                 # 抵抗 [Ω]
fs = 1e6               # サンプリング周波数 [Hz]
N_samples = 100000     # サンプル数
dt = 1 / fs            # サンプリング間隔

# 熱雑音の理論的パワースペクトル密度 [V^2/Hz]
S_v = 4 * k * T * R    # 一定値(白色ノイズ)

# 帯域幅 B = fs/2(ナイキスト周波数まで)の理論的rms電圧
B = fs / 2
v_rms_theory = np.sqrt(4 * k * T * B * R)

# ガウス白色ノイズの生成
# 各サンプルの分散 = S_v * fs(離散化の帯域幅)
noise_std = np.sqrt(S_v * fs)
v_noise = np.random.normal(0, noise_std, N_samples)

# 時間軸
t = np.arange(N_samples) * dt

# --- 可視化 ---
fig, axes = plt.subplots(2, 1, figsize=(10, 8))

# (a) 時間波形
axes[0].plot(t[:2000] * 1e6, v_noise[:2000] * 1e6, linewidth=0.5, color='#00bcd4')
axes[0].set_xlabel('Time [μs]')
axes[0].set_ylabel('Voltage [μV]')
axes[0].set_title(f'Thermal Noise Time Domain (T={T} K, R={R} Ω)')
axes[0].axhline(y=0, color='gray', linestyle='--', linewidth=0.5)
axes[0].grid(True, alpha=0.3)

# (b) パワースペクトル密度
freqs = np.fft.rfftfreq(N_samples, d=dt)
V_fft = np.fft.rfft(v_noise) * dt                    # FFT(V·s 単位)
PSD = 2 * np.abs(V_fft)**2 / (N_samples * dt)        # 片側PSD [V^2/Hz]

# 平滑化(移動平均)
window = 200
PSD_smooth = np.convolve(PSD, np.ones(window)/window, mode='same')

axes[1].semilogy(freqs[1:] / 1e3, PSD_smooth[1:], linewidth=0.8, color='#00bcd4', label='Simulated PSD')
axes[1].axhline(y=S_v, color='#ff9800', linestyle='--', linewidth=2, label=f'Theory: $S_v$ = {S_v:.2e} V²/Hz')
axes[1].set_xlabel('Frequency [kHz]')
axes[1].set_ylabel('PSD [V²/Hz]')
axes[1].set_title('Power Spectral Density of Thermal Noise')
axes[1].legend()
axes[1].grid(True, alpha=0.3)

plt.tight_layout()
plt.savefig('thermal_noise_spectrum.png', dpi=150, bbox_inches='tight')
plt.show()

print(f"理論的PSD: S_v = 4kTR = {S_v:.4e} V²/Hz")
print(f"理論的rms電圧 (B={B/1e3:.0f} kHz): {v_rms_theory*1e6:.2f} μV")
print(f"シミュレーションrms電圧: {np.std(v_noise)*1e6:.2f} μV")

上のコードを実行すると、2つのグラフが得られます。

  1. 時間波形(上段): 雑音電圧がゼロを中心にランダムに揺れ動いている様子が見えます。ガウス分布に従うため、大きな振幅の出現は稀ですが、ゼロに近い値が最も頻繁に現れます。平均はゼロですが、振幅の大きさ(rms値)は有限で、理論値の約 0.91 $\mu$V 付近に収まるはずです。

  2. パワースペクトル密度(下段): 生のスペクトルはランダムにばらつきますが、移動平均で平滑化すると、理論値 $S_v = 4kTR$ の水平線の周りに分布していることがわかります。これはまさに白色ノイズの特徴であり、すべての周波数で均一なパワーを持つことを視覚的に確認できます。

3種類の雑音スペクトルの比較

熱雑音、ショット雑音、1/f ノイズの3種類の雑音スペクトルを重ねて可視化し、それぞれの周波数依存性の違いを確認しましょう。

import numpy as np
import matplotlib.pyplot as plt

# パラメータ
k = 1.381e-23
T = 300
R = 1000          # 1 kΩ
q = 1.602e-19
I_dc = 1e-3       # 1 mA
K_f = 1e-12       # 1/f ノイズ係数(デバイス依存)
f_corner = 10e3   # コーナー周波数 [Hz]

# 周波数軸
f = np.logspace(1, 7, 1000)  # 10 Hz ~ 10 MHz

# 各雑音のPSD
S_thermal = 4 * k * T * R * np.ones_like(f)           # 熱雑音 [V²/Hz]
S_shot = 2 * q * I_dc * R**2 * np.ones_like(f)        # ショット雑音(電圧換算)[V²/Hz]
S_flicker = S_thermal * (f_corner / f)                  # 1/fノイズ [V²/Hz]
S_total = S_thermal + S_shot + S_flicker                # 合計

fig, ax = plt.subplots(figsize=(10, 6))
ax.loglog(f, S_thermal, '--', color='#00bcd4', linewidth=2, label='Thermal noise ($4kTR$)')
ax.loglog(f, S_shot, '--', color='#4caf50', linewidth=2, label='Shot noise ($2qI_{DC}R^2$)')
ax.loglog(f, S_flicker, '--', color='#ff9800', linewidth=2, label='1/f noise')
ax.loglog(f, S_total, '-', color='white', linewidth=2.5, label='Total noise')

ax.axvline(x=f_corner, color='#f44336', linestyle=':', linewidth=1.5, label=f'Corner freq = {f_corner/1e3:.0f} kHz')

ax.set_xlabel('Frequency [Hz]', fontsize=12)
ax.set_ylabel('Voltage Noise PSD [V²/Hz]', fontsize=12)
ax.set_title('Comparison of Noise Sources', fontsize=14)
ax.legend(fontsize=10)
ax.grid(True, alpha=0.3, which='both')
ax.set_facecolor('#1a1a2e')
fig.patch.set_facecolor('#1a1a2e')
ax.tick_params(colors='white')
ax.xaxis.label.set_color('white')
ax.yaxis.label.set_color('white')
ax.title.set_color('white')

plt.tight_layout()
plt.savefig('noise_comparison.png', dpi=150, bbox_inches='tight')
plt.show()

このグラフから、3種類の雑音の周波数依存性の違いが一目で把握できます。

  1. 熱雑音(シアン破線) は周波数に依存しない水平線、すなわち白色ノイズです。あらゆる周波数帯で一定のパワー密度を持ちます。
  2. ショット雑音(緑破線) も白色ノイズで水平ですが、レベルはデバイスに流れる直流電流 $I_{\text{DC}}$ によって決まります。
  3. 1/f ノイズ(オレンジ破線) は低周波で急激に増大し、高周波では白色ノイズを下回ります。コーナー周波数(赤点線)を境に支配的な雑音源が切り替わることが明確に見えます。
  4. 合計(白実線) を見ると、低周波域は 1/f ノイズが、高周波域は白色ノイズ(熱雑音 + ショット雑音)が支配する2つの領域に分かれることがわかります。

縦続接続の雑音指数(フリスの公式の可視化)

フリスの公式を使って、受信系の構成による雑音指数の違いを可視化します。特に、初段の利得を変化させたときに系全体の NF がどのように変化するかを調べましょう。

import numpy as np
import matplotlib.pyplot as plt

def friis_nf(nf_list_dB, gain_list_dB):
    """フリスの公式で縦続接続のNFを計算する

    Parameters
    ----------
    nf_list_dB : list of float
        各段のNF [dB]
    gain_list_dB : list of float
        各段の利得 [dB]

    Returns
    -------
    float
        系全体のNF [dB]
    """
    F = [10**(nf/10) for nf in nf_list_dB]     # 線形値に変換
    G = [10**(g/10) for g in gain_list_dB]       # 線形値に変換

    F_total = F[0]
    G_product = G[0]

    for i in range(1, len(F)):
        F_total += (F[i] - 1) / G_product
        G_product *= G[i]

    return 10 * np.log10(F_total)

# --- (a) 初段利得を変化させたときの系全体NF ---
G1_dB = np.linspace(0, 40, 200)   # 初段利得 0~40 dB
NF1 = 1.0                          # 初段NF = 1 dB
NF2 = 8.0                          # 2段目NF = 8 dB
G2_dB_val = 10.0                   # 2段目利得 = 10 dB

NF_total_a = np.array([friis_nf([NF1, NF2], [g, G2_dB_val]) for g in G1_dB])

# --- (b) 構成比較: LNA→Mixer vs Cable→LNA→Mixer ---
# 構成1: LNA(NF=1dB, G=20dB) → Mixer(NF=8dB, G=-6dB)
nf_config1 = friis_nf([1.0, 8.0], [20.0, -6.0])

# 構成2: Cable(Loss=3dB) → LNA(NF=1dB, G=20dB) → Mixer(NF=8dB, G=-6dB)
nf_config2 = friis_nf([3.0, 1.0, 8.0], [-3.0, 20.0, -6.0])

# 構成3: LNA(NF=1dB, G=20dB) → Cable(Loss=3dB) → Mixer(NF=8dB, G=-6dB)
nf_config3 = friis_nf([1.0, 3.0, 8.0], [20.0, -3.0, -6.0])

# --- 可視化 ---
fig, axes = plt.subplots(1, 2, figsize=(14, 5))

# (a) 初段利得 vs 系全体NF
axes[0].plot(G1_dB, NF_total_a, color='#00bcd4', linewidth=2.5)
axes[0].axhline(y=NF1, color='#ff9800', linestyle='--', linewidth=1.5, label=f'Stage 1 NF = {NF1} dB')
axes[0].set_xlabel('Stage 1 Gain [dB]', fontsize=12)
axes[0].set_ylabel('Total System NF [dB]', fontsize=12)
axes[0].set_title('Effect of First Stage Gain on System NF', fontsize=13)
axes[0].legend(fontsize=10)
axes[0].grid(True, alpha=0.3)
axes[0].set_ylim(0, 10)

# (b) 構成比較の棒グラフ
configs = ['LNA→Mixer', 'Cable→LNA→Mixer', 'LNA→Cable→Mixer']
nf_values = [nf_config1, nf_config2, nf_config3]
colors = ['#00bcd4', '#f44336', '#4caf50']

bars = axes[1].bar(configs, nf_values, color=colors, width=0.5, edgecolor='white', linewidth=0.5)
for bar, val in zip(bars, nf_values):
    axes[1].text(bar.get_x() + bar.get_width()/2, bar.get_height() + 0.1,
                f'{val:.2f} dB', ha='center', fontsize=11, fontweight='bold')

axes[1].set_ylabel('Total System NF [dB]', fontsize=12)
axes[1].set_title('System NF for Different Configurations', fontsize=13)
axes[1].grid(True, alpha=0.3, axis='y')

plt.tight_layout()
plt.savefig('friis_formula_visualization.png', dpi=150, bbox_inches='tight')
plt.show()

print(f"構成1 (LNA→Mixer):        NF = {nf_config1:.2f} dB")
print(f"構成2 (Cable→LNA→Mixer):   NF = {nf_config2:.2f} dB")
print(f"構成3 (LNA→Cable→Mixer):   NF = {nf_config3:.2f} dB")

このコードの出力から、フリスの公式の核心的なメッセージが視覚的に確認できます。

  1. 左図(初段利得と系全体 NF の関係): 初段の利得が増加するにつれて、系全体の NF が急激に低下し、やがて初段の NF(オレンジ破線)に漸近します。具体的には、初段利得が 20 dB を超えると、系全体の NF は初段単体の NF にほぼ等しくなります。これは、後段の雑音寄与が $1/G_1$ で割り引かれるためです。

  2. 右図(構成による NF の比較): LNA を最前段に置いた構成1が最も NF が小さく、ケーブル損失を LNA の前に入れた構成2は大幅に劣化しています。構成3(LNA → ケーブル → ミキサ)は構成1からわずかに劣化するだけで、ケーブル損失の影響が LNA の高い利得で抑えられていることがわかります。

雑音温度と雑音指数の対応関係の可視化

最後に、雑音温度と雑音指数の対応関係を可視化します。特に、低雑音領域での分解能の違いを確認しましょう。

import numpy as np
import matplotlib.pyplot as plt

T_0 = 290  # 基準温度 [K]

# 雑音指数の範囲
NF_dB = np.linspace(0, 15, 500)  # 0 ~ 15 dB
F = 10**(NF_dB / 10)             # 線形値
T_e = (F - 1) * T_0              # 雑音温度 [K]

# 逆方向: 雑音温度から雑音指数
T_e_range = np.linspace(0, 10000, 500)
F_from_T = 1 + T_e_range / T_0
NF_from_T = 10 * np.log10(F_from_T)

fig, axes = plt.subplots(1, 2, figsize=(14, 5))

# (a) NF [dB] → 雑音温度 [K]
axes[0].plot(NF_dB, T_e, color='#00bcd4', linewidth=2.5)
axes[0].set_xlabel('Noise Figure [dB]', fontsize=12)
axes[0].set_ylabel('Equivalent Noise Temperature [K]', fontsize=12)
axes[0].set_title('NF to Noise Temperature Conversion', fontsize=13)
axes[0].grid(True, alpha=0.3)

# 代表値をマーカーで表示
nf_markers = [0.5, 1.0, 2.0, 3.0, 5.0, 10.0]
for nf_m in nf_markers:
    F_m = 10**(nf_m / 10)
    T_m = (F_m - 1) * T_0
    axes[0].plot(nf_m, T_m, 'o', color='#ff9800', markersize=8)
    axes[0].annotate(f'{T_m:.0f} K', (nf_m, T_m), textcoords="offset points",
                     xytext=(10, 5), fontsize=9)

# (b) 低雑音領域の拡大
NF_dB_low = np.linspace(0, 3, 500)
F_low = 10**(NF_dB_low / 10)
T_e_low = (F_low - 1) * T_0

axes[1].plot(NF_dB_low, T_e_low, color='#00bcd4', linewidth=2.5)
axes[1].set_xlabel('Noise Figure [dB]', fontsize=12)
axes[1].set_ylabel('Equivalent Noise Temperature [K]', fontsize=12)
axes[1].set_title('Low-Noise Region (NF < 3 dB)', fontsize=13)
axes[1].grid(True, alpha=0.3)

# 低雑音領域の代表値
nf_low_markers = [0.2, 0.3, 0.5, 0.7, 1.0, 1.5, 2.0, 3.0]
for nf_m in nf_low_markers:
    F_m = 10**(nf_m / 10)
    T_m = (F_m - 1) * T_0
    axes[1].plot(nf_m, T_m, 'o', color='#ff9800', markersize=7)
    axes[1].annotate(f'{T_m:.1f} K', (nf_m, T_m), textcoords="offset points",
                     xytext=(8, 5), fontsize=8)

plt.tight_layout()
plt.savefig('noise_temperature_conversion.png', dpi=150, bbox_inches='tight')
plt.show()

# 対応表の出力
print("NF [dB] → 雑音温度 [K] 対応表")
print("-" * 35)
for nf_m in [0.2, 0.3, 0.5, 0.7, 1.0, 1.5, 2.0, 3.0, 5.0, 10.0]:
    F_m = 10**(nf_m / 10)
    T_m = (F_m - 1) * T_0
    print(f"  NF = {nf_m:5.1f} dB  →  T_e = {T_m:8.1f} K")

この可視化から、雑音温度と雑音指数の対応に関する重要な特徴が読み取れます。

  1. 左図(全体像): NF と雑音温度の関係は非線形(指数関数的)です。NF = 10 dB のとき $T_e \approx 2610$ K であり、NF = 3 dB のとき $T_e = 290$ K です。NF が大きい領域では雑音温度の値が急激に増大します。

  2. 右図(低雑音領域の拡大): NF が 0〜3 dB の範囲に注目すると、雑音温度の変化は穏やかで、NF の小さな差が雑音温度では明確に区別できることがわかります。NF = 0.5 dB(約 35 K)と NF = 0.3 dB(約 20 K)の差は、NF の数値では 0.2 dB ですが、雑音温度では 15 K の差として現れます。衛星通信や電波天文で雑音温度表記が好まれる理由がこのグラフから直感的に理解できます。

等価雑音帯域幅の計算

等価雑音帯域幅の概念を、1次RCフィルタとバタワースフィルタで可視化します。

import numpy as np
import matplotlib.pyplot as plt
from scipy import signal

fig, axes = plt.subplots(1, 2, figsize=(14, 5))

# --- (a) 1次RCフィルタの等価雑音帯域幅 ---
f_c = 1e3  # カットオフ周波数 1 kHz
f = np.linspace(0, 5 * f_c, 10000)

# 伝達関数の電力 |H(f)|^2
H2_rc = 1 / (1 + (f / f_c)**2)

# 等価雑音帯域幅
B_n_rc = np.trapz(H2_rc, f) / 1.0   # ピーク利得 = 1
B_3dB = f_c
ratio_rc = B_n_rc / B_3dB

# 理想矩形フィルタの描画用
rect_f = [0, B_n_rc, B_n_rc, 5*f_c]
rect_H2 = [1, 1, 0, 0]

axes[0].fill_between(f / 1e3, H2_rc, alpha=0.3, color='#00bcd4', label='RC filter $|H(f)|^2$')
axes[0].plot(f / 1e3, H2_rc, color='#00bcd4', linewidth=2)
axes[0].plot(np.array(rect_f) / 1e3, rect_H2, '--', color='#ff9800', linewidth=2,
             label=f'ENB = {B_n_rc/1e3:.2f} kHz')
axes[0].axvline(x=f_c / 1e3, color='#f44336', linestyle=':', linewidth=1.5,
                label=f'$f_c$ = {f_c/1e3:.0f} kHz ($B_{{3dB}}$)')

axes[0].set_xlabel('Frequency [kHz]', fontsize=12)
axes[0].set_ylabel('$|H(f)|^2$', fontsize=12)
axes[0].set_title(f'1st Order RC Filter (ENB/B_3dB = {ratio_rc:.3f})', fontsize=13)
axes[0].legend(fontsize=10)
axes[0].grid(True, alpha=0.3)
axes[0].set_xlim(0, 5)

# --- (b) 各次数バタワースフィルタのENB比 ---
orders = range(1, 11)
enb_ratios = []

for n in orders:
    b, a = signal.butter(n, 2 * np.pi * f_c, analog=True)
    w = 2 * np.pi * f
    _, H = signal.freqs(b, a, worN=w)
    H2 = np.abs(H)**2
    B_n = np.trapz(H2, f) / H2[0]
    enb_ratios.append(B_n / f_c)

axes[1].bar(list(orders), enb_ratios, color='#00bcd4', edgecolor='white', linewidth=0.5)
axes[1].axhline(y=1.0, color='#ff9800', linestyle='--', linewidth=2, label='Ideal rectangular (ratio = 1.0)')
for i, ratio in enumerate(enb_ratios):
    axes[1].text(i + 1, ratio + 0.02, f'{ratio:.3f}', ha='center', fontsize=8)

axes[1].set_xlabel('Butterworth Filter Order', fontsize=12)
axes[1].set_ylabel('$B_n / B_{3dB}$', fontsize=12)
axes[1].set_title('ENB Ratio vs Filter Order', fontsize=13)
axes[1].legend(fontsize=10)
axes[1].grid(True, alpha=0.3, axis='y')
axes[1].set_ylim(0.9, 1.7)

plt.tight_layout()
plt.savefig('equivalent_noise_bandwidth.png', dpi=150, bbox_inches='tight')
plt.show()

print(f"1次RCフィルタ: B_n/B_3dB = {ratio_rc:.4f} (理論値 π/2 = {np.pi/2:.4f})")
for n, r in zip(orders, enb_ratios):
    print(f"  {n}次バタワース: B_n/B_3dB = {r:.4f}")

このコードの出力から、等価雑音帯域幅の概念が視覚的に明瞭になります。

  1. 左図(1次RCフィルタ): シアンの塗りつぶし面積が実際のフィルタを通過する雑音パワーに対応し、オレンジの破線で示された矩形が等価雑音帯域幅 $B_n$ です。両者の面積が等しくなるように $B_n$ が決められています。$B_n$ は $-3$ dB 帯域幅 $f_c$ よりも大きく、その比は理論値 $\pi/2 \approx 1.571$ に近い値が得られるはずです。

  2. 右図(バタワースフィルタの次数と ENB 比): フィルタの次数が上がるほど、$B_n/B_{3\text{dB}}$ の比が1に近づきます。これは高次フィルタの周波数特性がより矩形に近くなるためです。1次では約 1.57、10次では約 1.01 まで改善されます。実用上、5次以上のバタワースフィルタであれば、$-3$ dB 帯域幅を等価雑音帯域幅としてそのまま使ってもよい精度が得られることがわかります。

雑音理論の総合演習 — 受信系の雑音温度計算

ここまでの理論を統合する実践的な例として、衛星通信受信系の雑音温度計算を Python で実装します。

import numpy as np
import matplotlib.pyplot as plt

def system_noise_temp(components):
    """受信系全体の雑音温度を計算する

    Parameters
    ----------
    components : list of dict
        各段の情報。キー: 'name', 'gain_dB', 'NF_dB' or 'T_e'

    Returns
    -------
    dict
        各段の寄与と系全体の雑音温度
    """
    T_0 = 290.0
    results = []
    T_sys = 0.0
    G_cumulative = 1.0

    for i, comp in enumerate(components):
        gain_linear = 10**(comp['gain_dB'] / 10)

        if 'T_e' in comp:
            T_e = comp['T_e']
            F = 1 + T_e / T_0
            NF_dB = 10 * np.log10(F)
        else:
            NF_dB = comp['NF_dB']
            F = 10**(NF_dB / 10)
            T_e = (F - 1) * T_0

        # この段の雑音温度の入力換算寄与
        if i == 0:
            contribution = T_e
        else:
            contribution = T_e / G_cumulative

        T_sys += contribution

        results.append({
            'name': comp['name'],
            'gain_dB': comp['gain_dB'],
            'NF_dB': NF_dB,
            'T_e': T_e,
            'contribution': contribution,
            'cumulative_gain': 10 * np.log10(G_cumulative * gain_linear)
        })

        G_cumulative *= gain_linear

    return T_sys, results

# 衛星通信受信系の構成
components = [
    {'name': 'Feed/Waveguide', 'gain_dB': -0.5, 'NF_dB': 0.5},
    {'name': 'LNA (cooled)',   'gain_dB': 35.0, 'T_e': 15.0},
    {'name': 'Cable',          'gain_dB': -2.0, 'NF_dB': 2.0},
    {'name': 'Downconverter',  'gain_dB': 20.0, 'NF_dB': 10.0},
    {'name': 'IF Amplifier',   'gain_dB': 30.0, 'NF_dB': 5.0},
]

T_sys, results = system_noise_temp(components)

# 結果表示
print("=" * 75)
print(f"{'段':>3} {'素子名':<18} {'利得[dB]':>9} {'NF[dB]':>8} {'Te[K]':>10} {'寄与[K]':>10}")
print("=" * 75)
for i, r in enumerate(results):
    print(f"{i+1:>3} {r['name']:<18} {r['gain_dB']:>9.1f} {r['NF_dB']:>8.2f} {r['T_e']:>10.1f} {r['contribution']:>10.3f}")
print("-" * 75)
print(f"{'系全体の雑音温度':>33} T_sys = {T_sys:.2f} K")
print(f"{'系全体のNF':>33} NF = {10*np.log10(1 + T_sys/290):.2f} dB")

# 寄与の可視化
fig, axes = plt.subplots(1, 2, figsize=(14, 5))

# (a) 各段の雑音温度寄与(入力換算)
names = [r['name'] for r in results]
contributions = [r['contribution'] for r in results]
colors = ['#f44336', '#00bcd4', '#ff9800', '#9c27b0', '#4caf50']

bars = axes[0].barh(names, contributions, color=colors, edgecolor='white', linewidth=0.5)
axes[0].set_xlabel('Noise Temperature Contribution [K]', fontsize=12)
axes[0].set_title(f'Noise Budget (Total $T_{{sys}}$ = {T_sys:.1f} K)', fontsize=13)
axes[0].grid(True, alpha=0.3, axis='x')

for bar, val in zip(bars, contributions):
    if val > 0.5:
        axes[0].text(bar.get_width() + 0.5, bar.get_y() + bar.get_height()/2,
                    f'{val:.2f} K', va='center', fontsize=10)

# (b) 累積雑音温度
cumulative = np.cumsum(contributions)
axes[1].plot(range(1, len(cumulative)+1), cumulative, 'o-', color='#00bcd4',
            linewidth=2.5, markersize=8)
axes[1].set_xticks(range(1, len(names)+1))
axes[1].set_xticklabels(names, rotation=30, ha='right', fontsize=9)
axes[1].set_ylabel('Cumulative Noise Temperature [K]', fontsize=12)
axes[1].set_title('Cumulative System Noise Temperature', fontsize=13)
axes[1].grid(True, alpha=0.3)

for i, (x, y) in enumerate(zip(range(1, len(cumulative)+1), cumulative)):
    axes[1].annotate(f'{y:.1f} K', (x, y), textcoords="offset points",
                    xytext=(10, 5), fontsize=9)

plt.tight_layout()
plt.savefig('system_noise_budget.png', dpi=150, bbox_inches='tight')
plt.show()

このコードは、典型的な衛星通信受信系(給電部 → 冷却LNA → ケーブル → ダウンコンバータ → IF アンプ)の雑音バジェットを計算・可視化します。実行結果から次のことが読み取れます。

  1. 冷却 LNA($T_e = 15$ K)の雑音温度が系全体の支配的な寄与となります。LNA の前にある給電部の損失(0.5 dB)もそのまま雑音温度に加算されるため、この部分の低損失化も重要です。

  2. LNA 以降の段(ケーブル、ダウンコンバータ、IF アンプ)の寄与は極めて小さいことがわかります。これは LNA の利得が 35 dB(約 3162 倍)と高いため、後段の雑音温度が $1/3162$ 以下に割り引かれるからです。フリスの公式の核心がここに現れています。

  3. 累積雑音温度のグラフを見ると、LNA まででほぼ系全体の雑音温度が決定され、それ以降はほとんど増加しないことが視覚的に明確です。

まとめ

本記事では、電子回路における雑音の基礎理論を体系的に解説しました。

  • 熱雑音(ジョンソン・ナイキスト雑音) は抵抗体中の電子の熱運動に起因し、白色スペクトルを持ちます。ナイキストの定理 $\overline{v^2} = 4kTBR$ で定量化され、整合負荷への有能雑音電力は $N = kTB$ という普遍的な形で表されます
  • ショット雑音 は電荷キャリアの離散性に起因し $\overline{i^2} = 2qI_{\text{DC}}B$ で与えられます。1/f ノイズは低周波で増大し、コーナー周波数で白色ノイズと交差します
  • 雑音指数 $F = SNR_{\text{in}}/SNR_{\text{out}}$ は回路による SNR の劣化度を定量化します。雑音温度 $T_e = (F-1)T_0$ は同じ情報を温度で表現し、低雑音系で高い分解能を持ちます
  • フリスの公式 は縦続接続の雑音指数を与え、$F_{\text{total}} = F_1 + (F_2 – 1)/G_1 + \cdots$ という形から「初段が系全体の雑音を支配する」という重要な設計原則が導かれます
  • 等価雑音帯域幅 $B_n$ はフィルタ形状を考慮した正確な雑音電力計算に不可欠です

これらの概念は、受信機設計、通信リンクバジェット計算、レーダー工学など、広い分野の基盤となるものです。

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