受信機の雑音フロアと最小受信感度の理論と導出と実装

スマートフォンの電波が「圏外」になるとき、いったい何が起きているのでしょうか。送信側の基地局は変わらず電波を出しているのに、あなたの受信機がそれを「拾えなくなる」境界が存在します。この境界は気分や運ではなく、物理法則で決まる明確な数値です。どんなに高性能なアンプを積んでも、受信機の内部には必ず「ザーッ」という雑音が存在し、信号がこの雑音の海に沈んでしまうと、もはや復調できません。この雑音の海の水面の高さが雑音フロア(noise floor)であり、その水面ぎりぎりで信号を拾える限界が最小受信感度(minimum detectable signal, MDS、あるいは receiver sensitivity)です。

受信感度を理解すると、通信システム設計のあらゆる場面で「あとどれくらい余裕があるか」を定量的に語れるようになります。たとえば次のような応用が見えてきます。

  • 衛星通信のリンクバジェット: 静止衛星から地上局まで約36,000 kmを電波が飛ぶと信号は極端に弱まります。受信感度が分かって初めて、アンテナ利得や送信電力をどれだけ確保すればリンクが成立するかを計算できます。
  • 携帯電話・IoTのカバレッジ設計: 基地局が何個必要か、LPWA(省電力広域無線)のセンサが何km届くかは、受信機の感度で決まります。感度を1 dB改善できれば、カバーできる面積が広がります。
  • レーダーの探知距離: レーダーが「どこまで遠くの目標を検出できるか」は、反射波が受信感度を上回るかどうかで決まります。MDSはレーダー方程式の心臓部です。

本記事では、感度を支配する3つの要素——熱雑音 $kTB$、雑音指数 $NF$、所要SNR——を一つずつ積み上げ、最終的に最小受信感度の公式

$$ S_{\min}\,[\mathrm{dBm}] = -174 + 10\log_{10}B + NF + \mathrm{SNR}_{\mathrm{req}} $$

を、デシベルの足し算で誰でも書ける道具に仕上げます。途中の $-174$ という魔法のような数字がどこから来るのかも、ボルツマン定数まで遡って導出します。

本記事の内容

  • 熱雑音電力 $kTB$ の導出と $-174\,\mathrm{dBm/Hz}$ の意味
  • 雑音指数 $NF$ が雑音フロアをどう押し上げるか
  • 所要SNRを足し合わせて最小受信感度を導く流れ
  • 帯域幅・NF・データレートと感度のトレードオフ
  • Pythonによる感度計算とリンクバジェットの可視化

前提知識

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

雑音フロアと最小受信感度とは

ラジオのチューニングを外したときに聞こえる「ザーッ」という音を思い出してください。あれは放送局からの信号ではなく、受信機自身(とアンテナが拾う背景)が生み出している雑音です。この雑音には、どんなに高品質な部品を使っても消せない根源的な下限があります。それが熱雑音——導体の中で電子が温度に応じてランダムに揺れることで生じる雑音です。

雑音フロアとは、この消せない雑音電力の合計が、受信機の入力換算でどれだけのレベルになるか、を表す量です。横軸を周波数、縦軸を電力としたスペクトルを描くと、信号は鋭いピークとして立ち上がり、その下に「床」のように雑音が広がっています。この床の高さが雑音フロアです。床より高く頭を出している信号は検出できますが、床に埋もれた信号は取り出せません。

最小受信感度とは、「ぎりぎり検出(復調)できる最も弱い信号の電力」です。直感的には、雑音フロアに、復調に必要なSNRのぶんだけ上乗せした高さに相当します。たとえば雑音フロアが $-100\,\mathrm{dBm}$ で、復調に $10\,\mathrm{dB}$ のSNRが必要なら、感度は $-90\,\mathrm{dBm}$ です。これより弱い信号は、たとえ受信機に届いていても、雑音に対して十分な高さがないため使えません。

ここで重要なのは、感度が受信機の「内部」だけで決まる量だということです。送信電力やアンテナ利得、伝搬距離は感度には含まれません。それらは「信号がどれだけ強く届くか」を決める別の要素で、リンクが成立するかどうかは「届く信号電力 ≥ 感度」で判定します。だからこそ感度は、受信機単体の素性を表す普遍的なスペックとして、データシートに必ず載っているのです。

では、この感度を構成する最初の、そして最も基本的な要素である熱雑音から、定量的に積み上げていきましょう。

熱雑音の導出 — $kTB$ はどこから来るか

ナイキストの熱雑音電力

抵抗器を握って温めると、その両端には目に見えないほど小さな電圧のゆらぎが現れます。これは抵抗内部の自由電子が、温度に比例した熱エネルギーでランダムに運動するためです。1928年にジョンソン(J. B. Johnson)が実験で発見し、ナイキスト(H. Nyquist)が理論的に説明したこの雑音を熱雑音(thermal noise、ジョンソン・ナイキスト雑音)と呼びます。

ナイキストの導出の核心は、統計力学のエネルギー等分配則です。温度 $T$ の系では、各自由度に平均 $\frac{1}{2}kT$ のエネルギーが分配されます($k$ はボルツマン定数)。これを伝送線路上の電磁モードに適用すると、周波数帯域 $B$(単位はHz)で抵抗が供給できる最大の雑音電力(利用可能雑音電力, available noise power)は、次のきれいな形になります。

$$ \begin{equation} N = kTB \end{equation} $$

ここで各記号の意味は次のとおりです。

  • $k = 1.380649 \times 10^{-23}\,\mathrm{J/K}$:ボルツマン定数
  • $T$:絶対温度(ケルビン, K)
  • $B$:雑音帯域幅(Hz)

この式が美しいのは、抵抗値 $R$ が消えていることです。抵抗の両端の雑音電圧の二乗平均は $\overline{v_n^2} = 4kTRB$ と $R$ に依存しますが、その抵抗から「整合された負荷」へ最大限に取り出せる電力を計算すると、ちょうど $R$ が打ち消し合って $kTB$ だけが残ります。受信機の入力はアンテナや前段とインピーダンス整合されているので、私たちが扱うべきはこの整合状態での利用可能雑音電力 $kTB$ です。

なぜ電力が帯域幅に比例するのか

$N = kTB$ で見落としてはいけないのは、雑音電力が帯域幅 $B$ に比例するという点です。これは熱雑音が白色(white)——つまり周波数によらず単位帯域あたりの電力が一定——だからです。単位帯域あたりの雑音電力を雑音電力密度(noise power spectral density)と呼び、

$$ N_0 = \frac{N}{B} = kT \quad [\mathrm{W/Hz}] $$

と書きます。蛇口から一定の勢いで水が出ているとき、バケツに溜まる水の量が口の広さ(帯域幅)に比例するのと同じイメージです。広い帯域で受信すれば、より多くの雑音を「すくい取って」しまいます。これが後で、帯域幅と感度のトレードオフを生む根本原因になります。

基準温度 $T_0 = 290\,\mathrm{K}$ での値

実際の設計では、毎回ケルビンを掛け算するのは煩雑です。そこで、国際的な慣習として基準温度 $T_0 = 290\,\mathrm{K}$(約17°C、常温に近い)を採用し、この温度での雑音電力密度を一度計算して数値として覚えておきます。計算してみましょう。

$$ N_0 = kT_0 = (1.380649 \times 10^{-23}) \times 290 = 4.0039 \times 10^{-21}\,\mathrm{W/Hz} $$

ワット単位のままでは扱いづらいので、これを dBm/Hz(1 mWを基準としたデシベル、1 Hzあたり)に変換します。dBmへの変換は $P\,[\mathrm{dBm}] = 10\log_{10}(P\,[\mathrm{mW}])$ で行います。まず $N_0$ をミリワットに直すと $4.0039 \times 10^{-21}\,\mathrm{W} = 4.0039 \times 10^{-18}\,\mathrm{mW}$ です。これをdBに変換します。

$$ \begin{align} N_0\,[\mathrm{dBm/Hz}] &= 10\log_{10}\left(4.0039 \times 10^{-18}\right) \\ &= 10 \times \left(\log_{10} 4.0039 + \log_{10} 10^{-18}\right) \\ &= 10 \times (0.6025 – 18) \\ &= 10 \times (-17.3975) \\ &= -173.975 \approx -174\,\mathrm{dBm/Hz} \end{align} $$

ここで2行目では対数の積を和に分解し、3行目では $\log_{10} 4.0039 \approx 0.6025$ と $\log_{10}10^{-18} = -18$ を代入しました。こうして、無線工学で最も有名な数字の一つ、$-174\,\mathrm{dBm/Hz}$ が現れました。これは「常温で、帯域幅1 Hzあたりに存在する根源的な雑音電力」です。すべての受信機は、この床より下を見ることはできません。

任意の帯域幅 $B$(Hz)に対する熱雑音電力は、密度に帯域を掛ければよいので、dB領域では足し算になります。

$$ \begin{equation} N\,[\mathrm{dBm}] = -174 + 10\log_{10}B \end{equation} $$

たとえば $B = 1\,\mathrm{MHz} = 10^6\,\mathrm{Hz}$ なら $10\log_{10}10^6 = 60\,\mathrm{dB}$ なので、$N = -174 + 60 = -114\,\mathrm{dBm}$ となります。これが、理想的な(雑音を一切付加しない)受信機が1 MHzの帯域で見る雑音の床です。

ここまでで「理想受信機」の雑音フロアが求まりました。しかし現実の受信機は、増幅やミキシングの過程で自分自身の雑音を付け加えてしまいます。その付加分を表すのが雑音指数です。次にそれを床に積み増していきましょう。

雑音指数を加える — 現実の受信機の雑音フロア

雑音指数 $NF$ の復習

現実の増幅器やミキサは、入力された雑音を増幅するだけでなく、自分自身の雑音を上乗せします。この「受信機が信号対雑音比をどれだけ悪化させるか」を表す指標が雑音指数(noise figure, $NF$)です。詳しい導出は雑音指数(Noise Figure)の理論に譲りますが、定義を確認しておきましょう。雑音係数(noise factor)$F$ は、入力SNRと出力SNRの比として定義されます。

$$ F = \frac{\mathrm{SNR}_{\mathrm{in}}}{\mathrm{SNR}_{\mathrm{out}}} = \frac{S_{\mathrm{in}}/N_{\mathrm{in}}}{S_{\mathrm{out}}/N_{\mathrm{out}}} $$

ここで入力雑音は基準温度での熱雑音 $N_{\mathrm{in}} = kT_0 B$ とします。$F$ をデシベルで表したものが雑音指数 $NF = 10\log_{10}F$ です。理想的な無雑音の受信機なら $F = 1$、すなわち $NF = 0\,\mathrm{dB}$ です。実際のLNA(低雑音増幅器)では $NF$ は $0.5 \sim 3\,\mathrm{dB}$ 程度、受信機全体では $5 \sim 10\,\mathrm{dB}$ 程度になることが一般的です。

雑音指数が床を押し上げる仕組み

雑音指数の本質は、「出力で観測される雑音が、入力熱雑音を $F$ 倍した量に相当する」という点にあります。これを式で見ましょう。出力雑音電力 $N_{\mathrm{out}}$ は、利得 $G$ の受信機を通すと

$$ N_{\mathrm{out}} = F \cdot G \cdot k T_0 B $$

と書けます。一方、信号は単純に $S_{\mathrm{out}} = G \cdot S_{\mathrm{in}}$ と増幅されます。ここで、出力で観測されたものを入力に換算して考えると(利得 $G$ で割り戻す)、入力換算の雑音は

$$ N_{\mathrm{in,eff}} = \frac{N_{\mathrm{out}}}{G} = F \cdot k T_0 B $$

となります。つまり、現実の受信機の入力換算雑音フロアは、理想の熱雑音 $kT_0B$ を $F$ 倍したものです。デシベルに直すと、$F$ 倍は $NF$ の足し算になります。

$$ \begin{equation} P_{\mathrm{noise}}\,[\mathrm{dBm}] = \underbrace{-174 + 10\log_{10}B}_{\text{熱雑音}} + \underbrace{NF}_{\text{受信機の付加}} \end{equation} $$

この式が雑音フロアの正体です。左の項は物理が決める下限、右の $NF$ は設計者が部品選定で削れる余地を表します。たとえば $B = 1\,\mathrm{MHz}$、$NF = 6\,\mathrm{dB}$ の受信機なら、

$$ P_{\mathrm{noise}} = -174 + 60 + 6 = -108\,\mathrm{dBm} $$

です。理想受信機の $-114\,\mathrm{dBm}$ より、ちょうど $NF = 6\,\mathrm{dB}$ ぶん床が高くなりました。$NF$ が床を押し上げる、という直感がそのまま式に現れています。

なぜ前段のNFが支配的か(フリスの公式との接続)

ここで一つ、設計上きわめて重要な事実に触れておきます。受信機は複数の段(LNA → ミキサ → IFアンプ …)が縦続接続されています。雑音指数の理論で扱うフリスの公式によれば、全体の雑音係数は

$$ F_{\mathrm{total}} = F_1 + \frac{F_2 – 1}{G_1} + \frac{F_3 – 1}{G_1 G_2} + \cdots $$

で与えられます。第1段の利得 $G_1$ が大きいと、第2段以降の雑音寄与は $G_1$ で割られて小さくなります。つまり、最初のLNAの雑音指数と利得が受信機全体の雑音フロアをほぼ決めてしまうのです。これが「アンテナ直下に高利得・低雑音のLNAを置く」という設計鉄則の根拠です。本記事では、こうして決まった受信機全体の $NF_{\mathrm{total}}$ を一つの数値として与えられたものとして扱います。

雑音フロアが「物理の下限 + 受信機の付加」として求まりました。残るは、その床の上にどれだけ信号が頭を出していれば「使える」のか——所要SNRです。これを最後に積み上げて、感度を完成させましょう。

所要SNRを足して最小受信感度を導く

所要SNRとは

雑音フロアぎりぎりの高さの信号は、雑音と区別がつかず、復調するとエラーだらけになります。デジタル通信では「ビット誤り率(BER)を $10^{-3}$ 以下にしたい」「フレーム誤り率を1%以下にしたい」といった品質要求があり、それを満たすために最低限必要なSNRが存在します。これを所要SNR(required SNR, $\mathrm{SNR}_{\mathrm{req}}$)と呼びます。

所要SNRは変調方式と要求品質で決まります。たとえばBPSKでBER $=10^{-3}$ を達成するには $E_b/N_0 \approx 6.8\,\mathrm{dB}$ が必要で、これに帯域幅効率を考慮するとSNRに換算できます。一般に、高次変調(16QAM, 64QAMなど)ほど1シンボルに多くのビットを載せられますが、シンボル間の距離が縮まるため、より高い所要SNRを要求します。誤り訂正符号(前段記事のLDPC符号など)を使えば所要SNRを数dB下げられます。これが「符号化利得」です。

感度の公式の導出

最小受信感度 $S_{\min}$ は、定義から「復調に必要なちょうど $\mathrm{SNR}_{\mathrm{req}}$ を達成する最小の信号電力」です。SNRは信号電力を雑音電力で割ったものなので、デシベル領域では引き算です。

$$ \mathrm{SNR}\,[\mathrm{dB}] = S\,[\mathrm{dBm}] – P_{\mathrm{noise}}\,[\mathrm{dBm}] $$

ここで $\mathrm{SNR} = \mathrm{SNR}_{\mathrm{req}}$、$S = S_{\min}$ とおいて、$S_{\min}$ について解きます。両辺を入れ替えると

$$ S_{\min}\,[\mathrm{dBm}] = P_{\mathrm{noise}}\,[\mathrm{dBm}] + \mathrm{SNR}_{\mathrm{req}}\,[\mathrm{dB}] $$

となります。ここに、先ほど求めた雑音フロア $P_{\mathrm{noise}} = -174 + 10\log_{10}B + NF$ を代入すると、目標の公式が完成します。

$$ \begin{equation} S_{\min}\,[\mathrm{dBm}] = -174 + 10\log_{10}B + NF + \mathrm{SNR}_{\mathrm{req}} \end{equation} $$

この一本の式が、本記事の到達点です。4つの項が、それぞれ明確な意味を持っています。

  1. $-174$:常温の熱雑音密度(物理が決める動かせない下限)
  2. $10\log_{10}B$:帯域幅を広げるほど増える雑音(システムの帯域設計で決まる)
  3. $NF$:受信機が付け加える雑音(部品選定で削れる)
  4. $\mathrm{SNR}_{\mathrm{req}}$:復調に必要な信号余裕(変調方式と誤り訂正で決まる)

感度を良く(数値を小さく、つまりより弱い信号を拾えるように)するには、この4項のうち動かせる3つ——帯域、$NF$、所要SNR——を小さくすればよい、ということが一目で分かります。設計の自由度がどこにあるかを、この式は明快に教えてくれます。

MDSとSNR=0の関係

なお、用語の整理をしておきます。$\mathrm{SNR}_{\mathrm{req}} = 0\,\mathrm{dB}$(信号電力と雑音電力が等しい)とした特別な場合の感度を、しばしばMDS(Minimum Detectable Signal、最小検出可能信号)と呼びます。

$$ \mathrm{MDS}\,[\mathrm{dBm}] = -174 + 10\log_{10}B + NF $$

これは雑音フロアそのものです。「信号が雑音と同じ高さまで来た点」を検出の限界と見なす、レーダーなどで使われる慣習的な定義です。実際のデジタル通信では復調にプラスのSNRが必要なので、感度は MDS よりさらに $\mathrm{SNR}_{\mathrm{req}}$ だけ高い(数値が大きい)位置にあります。文脈によって「感度」が MDS を指すか所要SNR込みを指すかが変わるので、定義を確認する習慣が大切です。

公式が手に入ったので、具体的な数値を入れて感覚をつかみましょう。

具体例 — Wi-Fiと衛星受信機の感度計算

例1:Wi-Fi受信機

20 MHz帯域のWi-Fi受信機を考えます。$NF = 5\,\mathrm{dB}$、所要SNRは最も頑健な変調(BPSK + 符号化)で $\mathrm{SNR}_{\mathrm{req}} = 4\,\mathrm{dB}$ とします。各項を計算します。帯域の項は $10\log_{10}(20 \times 10^6) = 10\log_{10}(2 \times 10^7) = 10 \times 7.301 = 73.0\,\mathrm{dB}$ です。これを公式に代入すると

$$ S_{\min} = -174 + 73.0 + 5 + 4 = -92\,\mathrm{dBm} $$

となります。Wi-Fiルータのデータシートに載っている「受信感度 $-92\,\mathrm{dBm}$(最低速モード)」といった値と、見事に一致します。一方、高速な256QAMモードでは所要SNRが $30\,\mathrm{dB}$ 程度に跳ね上がるため、感度は $-66\,\mathrm{dBm}$ 程度まで悪化します。だから高速通信はアクセスポイントの近くでしか使えないのです。日常の体験が、数式で説明できました。

例2:狭帯域IoT受信機

次にLPWA(省電力広域無線)のような狭帯域受信機を考えます。帯域を $B = 1\,\mathrm{kHz}$ まで絞り、$NF = 6\,\mathrm{dB}$、$\mathrm{SNR}_{\mathrm{req}} = 10\,\mathrm{dB}$ とします。帯域の項は $10\log_{10}(10^3) = 30\,\mathrm{dB}$ なので、

$$ S_{\min} = -174 + 30 + 6 + 10 = -128\,\mathrm{dBm} $$

Wi-Fiの例より $36\,\mathrm{dB}$ も感度が良く(弱い信号を拾えて)なっています。差の大半は帯域幅の違い($73 – 30 = 43\,\mathrm{dB}$)から来ています。帯域を狭めると雑音を「すくう量」が減るので、ずっと弱い信号でも検出できるのです。ただしその代償として、狭い帯域では1秒あたりに送れるビット数が減り、通信速度が遅くなります。これが帯域幅と感度の本質的なトレードオフです。

これらの例から、感度設計が「帯域・NF・所要SNRの綱引き」であることが見えてきました。この綱引きの全体像を、Pythonで可視化して直感を固めましょう。

Pythonによる感度計算と可視化

感度を計算する関数

まず、本記事の公式をそのまま関数にします。これがリンクバジェット計算の基本部品になります。

import numpy as np
import matplotlib.pyplot as plt

# ボルツマン定数 [J/K] と基準温度 [K]
K_BOLTZMANN = 1.380649e-23
T0 = 290.0

def thermal_noise_dbm_per_hz(T=T0):
    """基準温度Tでの熱雑音電力密度 [dBm/Hz] を計算する"""
    N0_watt = K_BOLTZMANN * T          # W/Hz
    N0_mw = N0_watt * 1e3              # mW/Hz
    return 10 * np.log10(N0_mw)

def sensitivity_dbm(bandwidth_hz, nf_db, snr_req_db, T=T0):
    """最小受信感度 S_min [dBm] を計算する
    S_min = -174 + 10log10(B) + NF + SNR_req
    """
    noise_density = thermal_noise_dbm_per_hz(T)        # ≈ -174 dBm/Hz
    noise_floor = noise_density + 10 * np.log10(bandwidth_hz)  # 雑音フロア
    return noise_floor + nf_db + snr_req_db

# 検算: -174 dBm/Hz が再現されるか
print(f"熱雑音密度: {thermal_noise_dbm_per_hz():.2f} dBm/Hz")

# 例1: Wi-Fi (20 MHz, NF=5dB, SNR_req=4dB)
print(f"Wi-Fi感度:  {sensitivity_dbm(20e6, 5, 4):.1f} dBm")
# 例2: 狭帯域IoT (1 kHz, NF=6dB, SNR_req=10dB)
print(f"IoT感度:    {sensitivity_dbm(1e3, 6, 10):.1f} dBm")

このコードを実行すると、熱雑音密度として -173.98 dBm/Hz、Wi-Fi感度として -92.0 dBm、IoT感度として -128.0 dBm が出力されます。手計算で求めた値と完全に一致しており、公式を関数化できたことが確認できます。thermal_noise_dbm_per_hz がボルツマン定数から $-174$ を導いている点、sensitivity_dbm が雑音フロアに $NF$ と所要SNRを足しているだけの素直な実装である点に注目してください。複雑に見えた感度計算が、たった数行のデシベル加算に帰着しています。

帯域幅と感度のトレードオフ曲線

次に、帯域幅を変えると感度がどう変わるかを描きます。これが「広帯域=高速だが鈍感、狭帯域=低速だが敏感」という設計トレードオフの可視化です。

import numpy as np
import matplotlib.pyplot as plt

# 帯域幅を 100 Hz 〜 100 MHz まで対数スケールで変化させる
bandwidths = np.logspace(2, 8, 200)   # Hz

# 異なるNF・所要SNRの組み合わせ
configs = [
    {"nf": 3, "snr": 8,  "label": "NF=3dB, SNR_req=8dB"},
    {"nf": 6, "snr": 10, "label": "NF=6dB, SNR_req=10dB"},
    {"nf": 10, "snr": 12, "label": "NF=10dB, SNR_req=12dB"},
]

plt.figure(figsize=(9, 5.5))
for c in configs:
    sens = sensitivity_dbm(bandwidths, c["nf"], c["snr"])
    plt.semilogx(bandwidths, sens, lw=2, label=c["label"])

# 代表的な帯域に縦線を引く
for bw, name in [(1e3, "1kHz"), (200e3, "200kHz"), (20e6, "20MHz")]:
    plt.axvline(bw, color="gray", ls=":", alpha=0.6)
    plt.text(bw, -135, name, rotation=90, va="bottom", fontsize=8)

plt.xlabel("Bandwidth B [Hz]")
plt.ylabel("Sensitivity $S_{min}$ [dBm]")
plt.title("Receiver Sensitivity vs Bandwidth")
plt.legend()
plt.grid(True, which="both", alpha=0.3)
plt.tight_layout()
plt.show()

このグラフから、いくつかの重要な特徴が読み取れます。第一に、どの曲線も右肩上がりの直線です。横軸が対数スケールなので、帯域を10倍にするたびに感度が $10\,\mathrm{dB}$ ずつ悪化する(数値が大きくなる)ことを示しています。これは公式の $10\log_{10}B$ の項そのものです。第二に、3本の曲線は平行に上下しているだけで、その間隔は $NF + \mathrm{SNR}_{\mathrm{req}}$ の差に等しくなっています。つまり帯域は曲線の「傾きに沿った位置」を、NFと所要SNRは「曲線全体の高さ」を決めるという役割分担が、視覚的にはっきり分かります。狭帯域(1 kHz)では $-120\,\mathrm{dBm}$ を下回る高感度が得られる一方、広帯域(20 MHz)では $-90\,\mathrm{dBm}$ 前後にとどまることも一目瞭然です。

データレートと感度の関係

帯域幅はデータレートと直結しています。シンボルレートはおおむね帯域幅に等しく、変調の次数(1シンボルあたりのビット数)を掛ければビットレートになります。ここでは「帯域 = データレート」と近似し、感度とのトレードオフを描きます。

import numpy as np
import matplotlib.pyplot as plt

# データレート(=帯域と近似) を 1 kbps 〜 100 Mbps で変化
data_rates = np.logspace(3, 8, 200)   # bps (= Hz と近似)
nf, snr_req = 6, 10                    # 固定

sensitivity = sensitivity_dbm(data_rates, nf, snr_req)

plt.figure(figsize=(9, 5.5))
plt.semilogx(data_rates, sensitivity, "b-", lw=2,
             label=f"NF={nf}dB, SNR_req={snr_req}dB")

# 実在システムの代表点をプロット
systems = [
    (300,    -137, "LoRa SF12"),
    (250e3,  -110, "Zigbee"),
    (1e6,    -100, "BLE/狭帯域"),
    (54e6,   -75,  "Wi-Fi 高速"),
]
for rate, s, name in systems:
    plt.scatter(rate, s, s=60, zorder=5)
    plt.annotate(name, (rate, s), textcoords="offset points",
                 xytext=(6, 6), fontsize=8)

plt.xlabel("Data rate (≈ Bandwidth) [bps]")
plt.ylabel("Sensitivity $S_{min}$ [dBm]")
plt.title("Sensitivity vs Data Rate Trade-off")
plt.legend()
plt.grid(True, which="both", alpha=0.3)
plt.tight_layout()
plt.show()

このグラフは、通信システム設計の核心的なトレードオフを表しています。理論曲線(青線)は右肩上がりで、高速なほど感度が悪化する=到達距離が短くなることを示します。重ねてプロットした実在システムの代表点を見ると、低速のLoRa(SF12)は理論曲線よりさらに下(高感度側)に位置しています。これは強力な誤り訂正と拡散により実効的な所要SNRを大きく下げているためで、だからこそ数km〜十数kmという長距離通信が可能になります。逆にWi-Fiの高速モードは高感度を犠牲にして大容量を得ており、近距離専用です。「速度と距離はトレードオフ」という無線の鉄則が、感度の式から定量的に説明できることが読み取れます。

雑音フロアとリンクバジェットのマージン

最後に、受信機に届く信号電力と感度の差であるリンクマージンを可視化します。これがリンクバジェット設計で最終的に確認する量です。

import numpy as np
import matplotlib.pyplot as plt

# 自由空間伝搬: 受信電力を距離の関数で簡易計算
# Pr = Pt + Gt + Gr - 20log10(4*pi*d/λ)  [dBm]
def received_power_dbm(distance_m, pt_dbm=20, gt=2, gr=2, freq_hz=2.4e9):
    c = 3e8
    wavelength = c / freq_hz
    fspl = 20 * np.log10(4 * np.pi * distance_m / wavelength)  # 自由空間損失
    return pt_dbm + gt + gr - fspl

distances = np.logspace(1, 4, 200)        # 10 m 〜 10 km
pr = received_power_dbm(distances)

# 受信機感度 (200 kHz, NF=6dB, SNR_req=10dB)
s_min = sensitivity_dbm(200e3, 6, 10)
margin = pr - s_min                        # リンクマージン

fig, ax1 = plt.subplots(figsize=(9, 5.5))
ax1.semilogx(distances, pr, "b-", lw=2, label="Received power $P_r$")
ax1.axhline(s_min, color="r", ls="--", lw=2,
            label=f"Sensitivity = {s_min:.0f} dBm")
ax1.fill_between(distances, s_min, pr, where=(pr > s_min),
                 alpha=0.2, color="green", label="Link OK (margin>0)")
ax1.set_xlabel("Distance [m]")
ax1.set_ylabel("Power [dBm]")
ax1.set_title("Link Budget: Received Power vs Sensitivity")
ax1.legend(loc="upper right")
ax1.grid(True, which="both", alpha=0.3)
plt.tight_layout()
plt.show()

# リンクが切れる距離を求める
idx = np.argmin(np.abs(margin))
print(f"リンク限界距離: 約 {distances[idx]:.0f} m (margin≈0)")

このグラフは、受信電力(青線)が距離とともに低下し、感度の床(赤破線)を下回った瞬間に通信が成立しなくなる様子を示しています。緑で塗られた領域は受信電力が感度を上回る「リンク成立ゾーン」で、その幅がリンクマージンです。距離が短いうちはマージンが大きく安定して通信できますが、ある距離で受信電力が感度線を横切り、そこが通信可能な限界距離になります。出力された限界距離は、設定したパラメータでおよそ数百mとなります。感度を改善(赤線を下げる)すれば、青線が赤線を横切る点が右に移動し、到達距離が伸びることも読み取れます。受信感度という単一の数値が、最終的に「どこまで届くか」を支配していることが、この一枚のグラフに凝縮されています。

まとめ

本記事では、受信機の雑音フロアと最小受信感度について、物理の根源から公式まで一気通貫で解説しました。

  • 熱雑音 $kTB$:抵抗の電子の熱運動に由来する消せない雑音で、エネルギー等分配則から $N = kTB$ と導かれます。常温の雑音電力密度はボルツマン定数から $kT_0 = -174\,\mathrm{dBm/Hz}$ と計算でき、これがすべての受信機の根源的な下限です
  • 雑音フロア:理想の熱雑音に受信機自身の雑音指数 $NF$ を加えた $P_{\mathrm{noise}} = -174 + 10\log_{10}B + NF$ が現実の床です。フリスの公式より、前段LNAの $NF$ と利得がこの床をほぼ決めます
  • 最小受信感度:床に所要SNRを足し合わせた $S_{\min} = -174 + 10\log_{10}B + NF + \mathrm{SNR}_{\mathrm{req}}$ が、復調できる最弱信号です。$\mathrm{SNR}_{\mathrm{req}} = 0$ とした MDS は雑音フロアそのものに一致します
  • トレードオフ:帯域を広げると速度は上がるが感度は $10\log_{10}B$ で悪化し、到達距離が縮みます。$NF$ と所要SNRは部品選定・変調方式・誤り訂正で削れる設計余地です
  • リンクバジェット:受信電力が感度を上回る差がリンクマージンであり、感度がそのまま到達距離を支配します

この感度の式は、信号対雑音比で学んだSNRと、雑音指数で学んだ $NF$ という2つの指標を、一本の設計式に統合する位置づけにあります。送信から受信までの利得と損失を積み上げ、最後に「受信電力 ≥ 感度」を確認するリンクバジェット設計は、あらゆる無線システムの出発点です。

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