衛星から送られてくる画像や、スマートフォンの通信で「電波が弱いと通信が切れる」のはなぜでしょうか。逆に言えば、どれだけ電波が弱くなっても、ある一定の品質までなら誤りなくデータを届けられるのはなぜでしょうか。この「どこまで送信電力を絞れるか」という問いに、ディジタル通信は一つの明快な数字で答えます。それが Eb/N0(イービーエヌゼロ、ビットあたりエネルギー対雑音電力密度比)です。
通信システムの性能を比較するとき、私たちは「送信電力が何ワットか」ではなく、「1ビットを運ぶのにどれだけのエネルギーを使い、それが雑音に対してどれだけ余裕があるか」で測ります。この尺度こそが Eb/N0 であり、そして受信側でどれだけビットを間違えるか、すなわち BER(Bit Error Rate、ビット誤り率)は、Eb/N0 の関数として綺麗な閉じた式で書けます。BPSK という最も基本的な変調方式では、その式は
$$ P_b = Q\!\left(\sqrt{\frac{2E_b}{N_0}}\right) $$
というたった一行で表されます。この記事の目的は、この一行がどこから来るのかを、雑音の統計と決定境界の幾何から一切省略せずに導き、さらに Python のモンテカルロ・シミュレーションで理論曲線がぴったり再現されることを確かめることです。
この関係を理解すると、次のような場面で力を発揮します。
- リンクバジェット設計: 衛星通信や深宇宙通信で、アンテナ利得・送信電力・距離を決めるとき、目標 BER から逆算して必要な Eb/N0 マージンを求めます。「あと何 dB 足りないのか」を定量的に議論できます。
- 変調方式の選択: BPSK・QPSK・16-QAM・64-QAM のどれを使うかは、使える Eb/N0 と要求スループットのトレードオフで決まります。BER 曲線を並べれば、どの方式がどの雑音環境で有利かが一目でわかります。
本記事の内容
- Eb/N0 の直感的な意味と、SNR との厳密な関係($E_b/N_0 = \mathrm{SNR}\cdot B/R_b$)
- AWGN 通信路で BPSK を整合フィルタ受信したときの、判定誤り確率の省略なしの導出
- $P_b = Q(\sqrt{2E_b/N_0})$ が現れる理由と Q 関数・相補誤差関数の関係
- QPSK・M-QAM への拡張とグレイ符号化の効果
- Python によるモンテカルロ伝送シミュレーションと、理論の Q 関数曲線との片対数グラフでの一致検証
前提知識
この記事を読む前に、以下の記事を読んでおくと理解が深まります。
- ビット誤り率(BER)とは — 誤り率の定義と測り方の基礎
- AWGN通信路モデル — 加法性白色ガウス雑音のモデルと性質
- 信号対雑音比(SNR)とは — 信号電力と雑音電力の比の定義
Eb/N0 とは — 「1ビットあたりの余裕」を測る
まず、なぜ SNR だけでは足りないのかという話から始めましょう。SNR(信号対雑音比)は「信号電力 $S$ と雑音電力 $N$ の比」です。しかし、同じ SNR でも、1秒間に 1000 ビット送るシステムと 100 万ビット送るシステムでは、1ビットに割り当てられるエネルギーがまったく違います。速く送るほど、1ビットあたりに使える「時間」と「エネルギー」は小さくなります。だから SNR だけを見ても、「このシステムはビットをどれだけ間違えるか」を公平に比較できないのです。
そこで登場するのが Eb/N0 です。イメージとしては、1ビットという小さな荷物を、雑音という嵐の中で運ぶときの「1個あたりの防御力」だと思ってください。$E_b$ は1ビットを運ぶために費やすエネルギー(ジュール)、$N_0$ は雑音のエネルギー密度(1ヘルツあたりの雑音電力、単位はワット毎ヘルツ = ジュール)です。両方ともエネルギーの次元を持つので、その比 $E_b/N_0$ は無次元量になります。この無次元の数こそが、変調方式やビットレートの違いを吸収して、通信システムを土俵にのせて比べるための共通言語です。
$E_b/N_0$ が大きいほど、1ビットあたりの信号エネルギーが雑音に対して潤沢で、受信側は自信を持って 0 か 1 かを判定できます。逆に小さいと、雑音が信号を覆い隠し、判定を間違えやすくなります。この直感を、次節で SNR との式の関係として厳密にします。

この図は Eb/N0 の全体像を示しています。送信側は1ビットにエネルギー $E_b$ を込めて送り出し、通信路では雑音密度 $N_0$ の嵐が信号を揺さぶり、受信側はその中から 0 か 1 かを判定します。この2つのエネルギー量の比 $E_b/N_0$ が「1ビットあたりの防御力」を表す無次元の指標であり、変調方式やビットレートの違いを超えて通信システムを公平に比較する共通尺度になります。
SNR と Eb/N0 の関係
エネルギーと電力の橋渡し
電力とエネルギーの関係を思い出しましょう。電力は「単位時間あたりのエネルギー」です。信号電力を $S$ [W]、1ビットを送るのにかかる時間を $T_b$ [s] とすると、1ビットあたりのエネルギーは
$$ E_b = S \cdot T_b = \frac{S}{R_b} $$
です。ここで $R_b = 1/T_b$ [bit/s] はビットレート(1秒あたりのビット数)です。つまり、同じ信号電力でも、速く送る($R_b$ が大きい)ほど1ビットに割り当てられるエネルギー $E_b$ は小さくなる、という先ほどの直感がそのまま式になっています。
一方、雑音側を考えます。AWGN 通信路の雑音は、片側電力スペクトル密度 $N_0$ [W/Hz] を持つ白色雑音です。「白色」とは、すべての周波数に一様なパワーが分布しているという意味です。実際のシステムは帯域幅 $B$ [Hz] のフィルタを通すので、その帯域内に入ってくる雑音電力は
$$ N = N_0 B $$
となります。帯域が広いほど、より多くの雑音を拾ってしまうわけです。
SNR と Eb/N0 を結ぶ式
以上を使って SNR を書き直します。SNR は定義より $\mathrm{SNR} = S/N$ です。分子と分母をそれぞれ上で得た式で置き換えると、
$$ \mathrm{SNR} = \frac{S}{N} = \frac{E_b R_b}{N_0 B} $$
となります。ここで $S = E_b R_b$($E_b = S/R_b$ を解いたもの)と $N = N_0 B$ を代入しました。この式を $E_b/N_0$ について整理すると、本節の主役の関係式が得られます。
$$ \boxed{\ \frac{E_b}{N_0} = \mathrm{SNR}\cdot\frac{B}{R_b}\ } $$

このグラフは横軸 SNR に対する Eb/N0 を、帯域比 $B/R_b$ の値ごとに描いたものです。$B/R_b=1$(点線と重なる青線)のときは Eb/N0 と SNR が完全に一致しますが、帯域を広げて $B/R_b=8$ にすると同じ SNR でも Eb/N0 が約 9 dB も上に持ち上がります。スペクトル拡散通信が「弱い信号でも届く」のは、帯域を広げてこの Eb/N0 の余裕を稼いでいるからだと読み取れます。
この式は非常に示唆的です。$B/R_b$ は「帯域幅とビットレートの比」で、通信の世界では帯域効率の逆数に相当します。たとえば BPSK でナイキスト帯域 $B \approx R_b$(1シンボル1ビットで帯域を目一杯使う理想的な場合)なら $E_b/N_0 = \mathrm{SNR}$ となり、両者は一致します。一方、拡散スペクトル通信のように $B \gg R_b$ とすると、同じ SNR でも $E_b/N_0$ は大きくなります。これがスペクトル拡散が「弱い信号でも通信できる」理由の一端です。
より一般的な多値変調では、1シンボルが $k = \log_2 M$ ビットを運びます。シンボルレートを $R_s$ とするとビットレートは $R_b = k R_s$ です。シンボルあたりエネルギー $E_s$ とビットあたりエネルギー $E_b$ の間には
$$ E_s = k E_b = (\log_2 M)\, E_b $$
という関係があります。1シンボルに複数ビットを詰め込むほど、シンボルは多くのエネルギーを担うことになる、という自然な関係です。この式は後で QPSK や M-QAM を扱うときに効いてきます。
ここまでで、Eb/N0 が SNR とどう結びつくかがわかりました。次に、この Eb/N0 が受信側の「間違えやすさ」、すなわち BER をどう決めるのかを、雑音の統計にまで踏み込んで導いていきます。
AWGN 通信路での BPSK 受信モデル
送信と受信のモデル化
最も基本的な変調である BPSK(Binary Phase Shift Keying、二位相偏移変調)を考えます。BPSK ではビット 0 と 1 を、それぞれ振幅 $+\sqrt{E_b}$ と $-\sqrt{E_b}$(位相にして 0 度と 180 度)の信号にマッピングします。信号の候補は次の2点だけです。
$$ s_0 = +\sqrt{E_b} \quad (\text{ビット } 0), \qquad s_1 = -\sqrt{E_b} \quad (\text{ビット } 1) $$
なぜ振幅を $\pm\sqrt{E_b}$ にするのでしょうか。信号のエネルギーは振幅の二乗ですから、$(\pm\sqrt{E_b})^2 = E_b$ となり、ちょうど1ビットあたりのエネルギーが $E_b$ になるようにスケールしているのです。

BPSK の信号点を1次元の軸上に配置したのがこの図です。ビット 0 と 1 は原点について対称な $\pm\sqrt{E_b}$ の2点に置かれ、両者を最も公平に切り分ける決定境界は自然と原点 $r=0$ になります。この対称性こそが、後の誤り確率の導出でビット 0 と 1 の誤りが同じ値になることを保証します。
送信信号は AWGN 通信路を通り、受信側では雑音が加わります。整合フィルタ(後述)を通した後の判定用の1次元の実数値を $r$ とすると、
$$ r = s + n, \qquad n \sim \mathcal{N}(0, \sigma^2) $$
とモデル化できます。$s$ は $s_0$ か $s_1$ のいずれか、$n$ は平均 0・分散 $\sigma^2$ のガウス雑音です。ここで、整合フィルタ出力における雑音分散が $\sigma^2 = N_0/2$ になることが、後の導出で決定的な役割を果たします。この $N_0/2$ がどこから来るのかを、次に整合フィルタの観点から見ておきましょう。
整合フィルタと最適受信
雑音の中から信号を最も鮮明に取り出すにはどうすればよいでしょうか。答えは整合フィルタ(matched filter)です。整合フィルタは、送信波形 $s(t)$ そのものと受信信号の相関を取る操作で、出力の信号対雑音比を最大化することが知られています。直感的には「送るはずの波形の型紙を受信信号に重ね、どれだけ一致するかを測る」操作です。

左の図は雑音に埋もれてほとんど見えない受信波形、右の図は送信波形との相関を取った整合フィルタの出力です。整合前は信号が雑音に紛れて判定が難しいのに対し、整合後は判定時刻に鋭いピークが立ち、そこで信号対雑音比が最大化されます。整合フィルタは「送るはずの波形の型紙を重ねて一致度を測る」操作であり、これが最適受信の要になります。
整合フィルタの出力を判定時刻でサンプリングすると、信号成分は $\pm E_b$ に比例した値になり、雑音成分は平均 0 のガウス分布になります。適切に正規化すると、判定変数は前節の $r = s + n$ の形に書け、その雑音分散は片側スペクトル密度を使って
$$ \sigma^2 = \frac{N_0}{2} $$
となります。係数 $1/2$ は、実数の判定変数に射影したときに、白色雑音の両側スペクトル($\pm f$)のうち実効的に半分が寄与することに対応します。この $\sigma^2 = N_0/2$ こそが、Eb/N0 と誤り確率をつなぐ鍵です。
整合フィルタが最適である理由まで踏み込むと本記事の範囲を超えますが、「整合フィルタ受信では判定変数が $r = s + n$、$n \sim \mathcal{N}(0, N_0/2)$ になる」という一点だけ押さえておけば、以降の導出は完結します。この準備のもとで、いよいよ判定誤り確率を計算していきましょう。
BPSKの判定誤り確率の導出
決定境界と誤りの条件
受信した判定変数 $r$ から、送られたビットを推定します。$s_0 = +\sqrt{E_b}$ と $s_1 = -\sqrt{E_b}$ は原点について対称なので、雑音が対称(平均 0)である限り、最適な決定境界は原点 $r = 0$ です。すなわち、
$$ \hat{b} = \begin{cases} 0 & (r \geq 0) \\ 1 & (r < 0) \end{cases} $$
と判定します。これは最尤判定(および事前確率が等しいときの最大事後確率判定)に一致します。$r$ が正なら「$+\sqrt{E_b}$ に近い」ので 0、負なら 1、という素直な規則です。
誤りが起きるのはどんなときでしょうか。ビット 0($s_0 = +\sqrt{E_b}$)を送ったのに、雑音のせいで $r < 0$ になってしまう場合です。このとき受信機は誤って 1 と判定します。ビット 0 を送ったときの受信変数は
$$ r = +\sqrt{E_b} + n, \qquad n \sim \mathcal{N}(0, \sigma^2) $$
なので、$r$ 自体が平均 $+\sqrt{E_b}$・分散 $\sigma^2$ のガウス分布に従います。誤り、すなわち $r < 0$ となる確率は
$$ P(\text{error} \mid s_0) = P(r < 0 \mid s_0) = P\big(\sqrt{E_b} + n < 0\big) = P\big(n < -\sqrt{E_b}\big) $$
です。雑音 $n$ が $-\sqrt{E_b}$ より小さくなる確率、つまり信号を原点の向こう側まで押し戻してしまうほど大きな負の雑音が乗る確率です。

この図は、ビット 0 とビット 1 を送ったときの受信変数 $r$ の分布(それぞれ平均 $+\sqrt{E_b}$、$-\sqrt{E_b}$ のガウス分布)を重ねたものです。ビット 0 を送ったのに雑音で $r<0$ になる誤りは、青い分布のうち境界を越えた左側の網掛け面積に対応します。この裾の面積こそが誤り確率であり、次節でこれが Q 関数として閉じた形に書けることを示します。
ガウス積分から Q 関数へ
この確率をガウス分布の積分として書き下します。$n \sim \mathcal{N}(0, \sigma^2)$ の確率密度関数は $\frac{1}{\sqrt{2\pi}\sigma}e^{-u^2/(2\sigma^2)}$ なので、
$$ P(\text{error} \mid s_0) = \int_{-\infty}^{-\sqrt{E_b}} \frac{1}{\sqrt{2\pi}\,\sigma} \exp\!\left(-\frac{u^2}{2\sigma^2}\right) du $$
となります。この積分を扱いやすくするため、標準化を行います。$z = u/\sigma$ と置換すると $du = \sigma\, dz$ であり、積分下限 $u = -\infty$ は $z = -\infty$、上限 $u = -\sqrt{E_b}$ は $z = -\sqrt{E_b}/\sigma$ に移ります。代入すると $\sigma$ が約分され、
$$ P(\text{error} \mid s_0) = \int_{-\infty}^{-\sqrt{E_b}/\sigma} \frac{1}{\sqrt{2\pi}} e^{-z^2/2}\, dz $$
という標準正規分布の裾の積分になります。ここで Q 関数を導入します。Q 関数は標準正規分布の「右の裾」の面積として定義されます。
$$ Q(x) = \int_{x}^{\infty} \frac{1}{\sqrt{2\pi}} e^{-z^2/2}\, dz = P(Z > x), \quad Z \sim \mathcal{N}(0,1) $$

Q 関数は、この図の網掛け部分——標準正規分布 $\phi(z)$ を閾値 $x$ から右へ積分した裾の面積——として定義されます。閾値 $x$ を右へ動かすほど残る面積は急速に小さくなるので、Q 関数は引数の増加に対して指数的に減衰します。BPSK の誤り確率がこの Q 関数で表せることが、Eb/N0 が増すと BER が崖のように落ちる理由の源です。
標準正規分布は左右対称なので、左の裾 $\int_{-\infty}^{-a}$ は右の裾 $\int_{a}^{\infty}$ に等しく、$\int_{-\infty}^{-a} = Q(a)$ が成り立ちます。したがって、上の積分は
$$ P(\text{error} \mid s_0) = Q\!\left(\frac{\sqrt{E_b}}{\sigma}\right) $$
と一行で書けます。同じ計算をビット 1($s_1 = -\sqrt{E_b}$)を送った場合について行うと、対称性からまったく同じ値 $Q(\sqrt{E_b}/\sigma)$ が得られます。ビット 0 と 1 が等確率なら、全体の平均ビット誤り率も
$$ P_b = \tfrac{1}{2}P(\text{error}\mid s_0) + \tfrac{1}{2}P(\text{error}\mid s_1) = Q\!\left(\frac{\sqrt{E_b}}{\sigma}\right) $$
です。
σ² = N0/2 を代入して Eb/N0 の形に
いよいよ最後の一歩です。整合フィルタ出力の雑音分散 $\sigma^2 = N_0/2$ を代入します。まず、Q 関数の引数を二乗して整理すると、
$$ \left(\frac{\sqrt{E_b}}{\sigma}\right)^2 = \frac{E_b}{\sigma^2} = \frac{E_b}{N_0/2} = \frac{2E_b}{N_0} $$
となります。$\sigma^2$ を $N_0/2$ で置き換えたことで、分母の $1/2$ が引数に $2$ の因子として現れる点が要です。引数そのものは、この二乗の平方根なので $\sqrt{2E_b/N_0}$ です。これで BPSK のビット誤り率の閉形式が完成します。
$$ \boxed{\ P_b = Q\!\left(\sqrt{\frac{2E_b}{N_0}}\right)\ } $$
この一行に、これまでの議論がすべて凝縮されています。$E_b/N_0$ が大きいほど Q 関数の引数が大きくなり、裾の面積すなわち誤り確率が急速に小さくなります。Q 関数は引数に対して指数関数的に減衰する(後述の上界 $Q(x)\le \frac{1}{2}e^{-x^2/2}$)ので、BER は Eb/N0 に対して急峻に落ちていきます。これが BER 曲線が「崖のように」見える理由です。
Q関数と相補誤差関数の関係
数値計算や他の文献との対応のために、Q 関数と相補誤差関数 $\mathrm{erfc}$ の関係を押さえておきましょう。$\mathrm{erfc}$ は次で定義されます。
$$ \mathrm{erfc}(x) = \frac{2}{\sqrt{\pi}}\int_{x}^{\infty} e^{-t^2}\, dt $$
Q 関数の積分で $z = \sqrt{2}\,t$ と変数変換すると、$dz = \sqrt{2}\,dt$、$e^{-z^2/2} = e^{-t^2}$ となり、次の対応が得られます。
$$ Q(x) = \frac{1}{2}\,\mathrm{erfc}\!\left(\frac{x}{\sqrt{2}}\right) $$
これを BPSK の式に代入すると、BER を $\mathrm{erfc}$ で書いた等価な表現
$$ P_b = \frac{1}{2}\,\mathrm{erfc}\!\left(\sqrt{\frac{E_b}{N_0}}\right) $$
が得られます。多くの数値ライブラリには erfc が組み込まれているので、Python では 0.5*erfc(np.sqrt(ebn0)) として理論値を計算できます。
具体的な感覚をつかむために、いくつかの Eb/N0 での BER を挙げておきます。$E_b/N_0 = 0$ dB(比が 1)のとき $P_b \approx 7.9\times 10^{-2}$、$6$ dB で $\approx 2.4\times 10^{-3}$、$8$ dB で $\approx 1.9\times 10^{-4}$、$10$ dB で $\approx 3.9\times 10^{-6}$ です。わずか数 dB の増加で BER が桁違いに改善するのが見て取れます。逆に BER $=10^{-5}$ を達成するには約 $9.6$ dB、BER $=10^{-4}$ には約 $8.4$ dB が必要です。

この対数目盛の棒グラフは、2 dB 刻みで Eb/N0 を上げたときの BER の変化を示します。0 dB の $7.9\times10^{-2}$ から 10 dB の $3.9\times10^{-6}$ まで、たった 10 dB の間に BER が約4桁も改善しています。Q 関数の指数的な減衰が、この「あと数 dB でBERが一気に落ちる崖」の正体です。
BPSK の誤り率が Q 関数一つで書けることがわかりました。では、より多くのビットを一度に運ぶ QPSK や M-QAM ではどうなるのでしょうか。次にその拡張を見ていきます。
QPSK・M-QAMへの拡張とグレイ符号化
QPSK — 直交する2つのBPSK
QPSK(Quadrature Phase Shift Keying、四位相偏移変調)は、1シンボルで2ビットを送る変調です。搬送波の同相成分(I 軸)と直交成分(Q 軸)に、それぞれ独立に BPSK を載せていると見なせます。I 軸と Q 軸は互いに直交していて雑音も独立なので、QPSK は「直交する2つの BPSK が並列に動いている」構造そのものです。
ここが QPSK の美点です。シンボルあたりエネルギー $E_s$ を I と Q に半分ずつ分配し、それぞれが1ビットを運ぶので、各軸のビットあたりエネルギーは $E_s/2 = E_b$ となり、BPSK とまったく同じ条件になります。したがって、グレイ符号化(後述)を施した QPSK のビット誤り率は BPSK と厳密に一致します。
$$ P_b^{\text{QPSK}} = Q\!\left(\sqrt{\frac{2E_b}{N_0}}\right) $$
つまり QPSK は、BPSK と同じ電力効率(同じ Eb/N0 で同じ BER)を保ったまま、帯域効率を2倍にできる、非常にコストパフォーマンスの高い変調なのです。これが衛星通信や多くの無線規格で QPSK が定番として使われる理由です。

QPSK の4つの信号点を I-Q 平面に配置し、グレイ符号でビットを割り当てたのがこの図です。隣り合う点(水平・垂直方向)のビット列は必ず1ビットだけ異なるように並んでおり、I 軸と Q 軸の決定境界はそれぞれの座標軸に一致します。各軸が独立な BPSK として働くため、軸ごとのビット判定は BPSK と全く同じ構造になります。
M-QAMへの一般化
さらに多くのビットを詰め込むには、振幅と位相の両方を使う M-QAM(Quadrature Amplitude Modulation)に進みます。$M$-QAM は $\log_2 M$ ビットを1シンボルで運びます。ただし、シンボル点が I-Q 平面上に密集するため、隣接する点との距離が縮まり、雑音に弱くなります。グレイ符号化された正方 QAM(16-QAM, 64-QAM など)のビット誤り率は、近似的に
$$ P_b^{M\text{-QAM}} \approx \frac{4}{\log_2 M}\left(1 – \frac{1}{\sqrt{M}}\right) Q\!\left(\sqrt{\frac{3\log_2 M}{M-1}\cdot\frac{E_b}{N_0}}\right) $$
で与えられます。Q 関数の引数に $\frac{3\log_2 M}{M-1}$ という係数が付くのが特徴で、$M$ が大きいほどこの係数は小さくなり、同じ BER を得るのに必要な Eb/N0 が増えます。たとえば 16-QAM は BPSK より約 3〜4 dB 多くの Eb/N0 を要します。これは「1シンボルに多くのビットを詰め込むほど、点が密集して雑音余裕が減る」という、帯域効率と電力効率のトレードオフを定量的に表しています。

16-QAM は I-Q 平面に 4×4 の格子状に16個の信号点を並べ、1シンボルで4ビットを運びます。I 軸・Q 軸それぞれの振幅レベルにグレイ符号を割り当てることで、隣接点間のビット差を1ビットに抑えています。BPSK/QPSK の2点に比べて点が密集しているため隣接距離が短く、これが雑音に弱くなる(同じ BER に多くの Eb/N0 を要する)直接の原因です。

この片対数グラフは BPSK/QPSK・16-QAM・64-QAM の理論 BER 曲線を並べたものです。同じ BER(たとえば $10^{-4}$)を達成するのに必要な Eb/N0 は、16-QAM で BPSK より数 dB、64-QAM ではさらに数 dB 右にずれます。曲線が右へ動くほど「多ビット化と引き換えに電力効率を犠牲にしている」ことが視覚的に読み取れます。
グレイ符号化の効果
最後に、なぜグレイ符号化(Gray coding)が重要かを説明します。M 値変調では、雑音によってシンボルが隣の点に間違われるのが最も起こりやすい誤りです。もしビット割り当てが適当だと、隣のシンボルに間違えたときに複数ビットが同時に反転してしまいます。
グレイ符号化は、隣り合うシンボルのビット列が必ず1ビットだけ異なるように割り当てる工夫です。これにより、最も頻度の高い「隣への誤り」が起きても、反転するビットはたった1ビットで済みます。結果として、シンボル誤り率 $P_s$ とビット誤り率 $P_b$ の間に、おおよそ
$$ P_b \approx \frac{P_s}{\log_2 M} $$
という関係が成り立ちます。1シンボル誤りあたりのビット誤りが最小化されるので、同じシンボル誤り率でもビット誤り率が最良になります。QPSK で BER が BPSK と一致するのも、このグレイ符号化の恩恵です。
理論の全体像がそろいました。ここからは、これらの式が本当に正しいのかを、実際にビット列を送受信するモンテカルロ・シミュレーションで確かめます。
Pythonによるモンテカルロ伝送シミュレーション
理論曲線とシミュレーションの比較方針
理論式 $P_b = Q(\sqrt{2E_b/N_0})$ は、無数の仮定(ガウス雑音・最適判定・整合フィルタ)の上に成り立っています。これが実際のビット伝送で再現されるかを確かめる最良の方法が、モンテカルロ・シミュレーションです。乱数でビット列を生成し、変調して雑音を加え、判定して誤り数を数える——この素朴な操作を大量に繰り返せば、実測 BER が得られます。まずは Eb/N0 から雑音分散を決める部分を実装します。
import numpy as np
from scipy.special import erfc
# 再現性のため乱数シードを固定
rng = np.random.default_rng(42)
def q_function(x):
"""Q関数: 標準正規分布の右裾。erfcで計算する"""
return 0.5 * erfc(x / np.sqrt(2))
def ebn0_to_sigma(ebn0_db, bits_per_symbol):
"""Eb/N0 [dB] から、各次元(I or Q)の雑音標準偏差を求める。
Es = bits_per_symbol * Eb, 各次元の雑音分散は N0/2。
信号振幅を Es=1 に正規化すると Eb = 1/bits_per_symbol。"""
ebn0 = 10 ** (ebn0_db / 10) # dBを真値に変換
eb = 1.0 / bits_per_symbol # Es=1 と正規化
n0 = eb / ebn0 # Eb/N0 = eb/n0 より
sigma = np.sqrt(n0 / 2) # 1次元あたり分散 N0/2
return sigma
このヘルパー関数では、シンボルエネルギーを $E_s = 1$ に正規化し、そこから $E_b = E_s / (\text{bits per symbol})$ と $N_0 = E_b / (E_b/N_0)$ を逆算しています。1次元(I 軸または Q 軸)あたりの雑音標準偏差が $\sqrt{N_0/2}$ になる点が、先の導出の $\sigma^2 = N_0/2$ に対応しています。次に、この雑音を使って BPSK の伝送を実際にシミュレートします。
BPSKのモンテカルロ伝送
def simulate_bpsk(ebn0_db, num_bits=2_000_000):
"""BPSK伝送のモンテカルロBER"""
sigma = ebn0_to_sigma(ebn0_db, bits_per_symbol=1)
# 送信ビット (0/1) を生成し、BPSKで +1/-1 にマッピング
bits = rng.integers(0, 2, size=num_bits)
symbols = 1 - 2 * bits # 0->+1, 1->-1 (振幅 sqrt(Es)=1)
# AWGN 雑音を加える
received = symbols + sigma * rng.standard_normal(num_bits)
# 決定境界 r=0 で硬判定: r>=0 なら 0, r<0 なら 1
decoded = (received < 0).astype(int)
# ビット誤り数を数える
ber = np.mean(decoded != bits)
return ber
ebn0_range = np.arange(0, 11, 1)
ber_bpsk_sim = np.array([simulate_bpsk(db) for db in ebn0_range])
ber_theory = q_function(np.sqrt(2 * 10 ** (ebn0_range / 10)))
for db, s, t in zip(ebn0_range, ber_bpsk_sim, ber_theory):
print(f"Eb/N0={db:2d}dB sim={s:.3e} theory={t:.3e}")
この出力を見ると、シミュレーション値 sim と理論値 theory が広い Eb/N0 範囲でよく一致します。たとえば 4 dB では理論 $1.25\times 10^{-2}$ に対して実測もほぼ同じ、8 dB では理論 $1.9\times 10^{-4}$ 付近の値が得られます。高 Eb/N0 では誤りが稀になるため、200 万ビットでも誤り数が数個〜数十個となり統計的なばらつきが目立ちますが、傾向は理論曲線に沿います。これは、実際にビットを送って数えた結果が、ガウス積分から導いた閉形式と一致することの直接の証拠です。次に、これを片対数グラフで可視化します。
片対数グラフでの可視化
import matplotlib, matplotlib.pyplot as plt
# 日本語フォント設定
for cand in ["Hiragino Sans", "Yu Gothic", "Noto Sans CJK JP", "IPAexGothic", "Meiryo"]:
if any(cand == f.name for f in matplotlib.font_manager.fontManager.ttflist):
plt.rcParams["font.family"] = cand
break
plt.rcParams["axes.unicode_minus"] = False
plt.figure(figsize=(8, 6))
# 縦軸を対数にした片対数プロット (semilogy)
plt.semilogy(ebn0_range, ber_theory, 'b-', lw=2, label="理論 $Q(\\sqrt{2E_b/N_0})$")
plt.semilogy(ebn0_range, np.clip(ber_bpsk_sim, 1e-7, 1), 'ro',
ms=7, label="BPSK シミュレーション")
plt.xlabel("$E_b/N_0$ (dB)")
plt.ylabel("ビット誤り率 (BER)")
plt.title("AWGN通信路におけるBPSKのBER曲線")
plt.grid(True, which="both", alpha=0.3)
plt.legend()
plt.ylim(1e-6, 1)
plt.tight_layout()
plt.show()

このグラフから、理論曲線(青い実線)の上にシミュレーション値(赤い点)がぴったり乗っていることが読み取れます。縦軸を対数にした片対数グラフでは、BER 曲線は右下がりの滑らかな曲線となり、Eb/N0 が増すごとに BER が桁で改善する様子が直線的に見えます。約 9.6 dB で BER が $10^{-5}$ に達するという理論予測も、グラフ上で確認できます。もし雑音分散の係数($N_0/2$ の $1/2$)を間違えていれば、点は曲線から系統的に横ずれするので、この一致は導出全体の正しさを裏付けています。次に BPSK と QPSK を重ね、両者の電力効率が同じであることを確かめます。
QPSKとの比較
def simulate_qpsk(ebn0_db, num_symbols=1_000_000):
"""グレイ符号化QPSK伝送のモンテカルロBER (I/Qが独立なBPSK)"""
sigma = ebn0_to_sigma(ebn0_db, bits_per_symbol=2)
# 2ビット/シンボル: I軸とQ軸にそれぞれ1ビット
bits_i = rng.integers(0, 2, size=num_symbols)
bits_q = rng.integers(0, 2, size=num_symbols)
# 各軸を振幅 1/sqrt(2) にして Es=1 に正規化
amp = 1 / np.sqrt(2)
sym_i = amp * (1 - 2 * bits_i)
sym_q = amp * (1 - 2 * bits_q)
# I/Q 独立に AWGN を付加し、軸ごとに硬判定
r_i = sym_i + sigma * rng.standard_normal(num_symbols)
r_q = sym_q + sigma * rng.standard_normal(num_symbols)
dec_i = (r_i < 0).astype(int)
dec_q = (r_q < 0).astype(int)
# 全ビット誤り率 (I/Qのビットをまとめて数える)
errors = np.sum(dec_i != bits_i) + np.sum(dec_q != bits_q)
return errors / (2 * num_symbols)
ber_qpsk_sim = np.array([simulate_qpsk(db) for db in ebn0_range])
plt.figure(figsize=(8, 6))
plt.semilogy(ebn0_range, ber_theory, 'b-', lw=2, label="理論 (BPSK=QPSK)")
plt.semilogy(ebn0_range, np.clip(ber_bpsk_sim, 1e-7, 1), 'ro', ms=7, label="BPSK 実測")
plt.semilogy(ebn0_range, np.clip(ber_qpsk_sim, 1e-7, 1), 'g^', ms=7, label="QPSK 実測")
plt.xlabel("$E_b/N_0$ (dB)")
plt.ylabel("ビット誤り率 (BER)")
plt.title("BPSKとQPSKのBER曲線の一致")
plt.grid(True, which="both", alpha=0.3)
plt.legend()
plt.ylim(1e-6, 1)
plt.tight_layout()
plt.show()

このグラフから、BPSK の実測(赤丸)と QPSK の実測(緑三角)が同じ理論曲線の上に重なることが確認できます。QPSK は BPSK の2倍のビットを同じ帯域で送っているにもかかわらず、Eb/N0 に対する BER はまったく同じです。これは、QPSK が I 軸と Q 軸の直交する2つの独立な BPSK として動作し、各軸のビットあたりエネルギーが BPSK と等しくなるためです。グレイ符号化のおかげで隣接シンボル誤りが1ビット誤りに抑えられていることも、この一致に寄与しています。
まとめ
本記事では、Eb/N0 と BER 曲線の関係を、定義から導出、そしてシミュレーション検証まで一貫して解説しました。
- Eb/N0 の意味と SNR との関係: Eb/N0 は「1ビットあたりのエネルギーと雑音密度の比」という無次元量で、ビットレートや帯域幅の違いを吸収して通信システムを公平に比較できます。SNR とは $E_b/N_0 = \mathrm{SNR}\cdot B/R_b$ で結ばれます。
- BPSKの誤り確率の導出: 整合フィルタ出力の判定変数 $r = s + n$($n\sim\mathcal{N}(0, N_0/2)$)に対し、決定境界 $r=0$ での誤り確率をガウス積分で計算すると、$P_b = Q(\sqrt{2E_b/N_0})$ という閉形式が得られます。$\sigma^2 = N_0/2$ を代入する一手で引数に $2$ が現れるのが鍵でした。
- Q関数とerfc: $Q(x) = \tfrac{1}{2}\mathrm{erfc}(x/\sqrt{2})$ の関係から、数値計算に便利な $\mathrm{erfc}$ 表現も得られます。
- QPSK・M-QAM・グレイ符号化: グレイ符号化された QPSK は BPSK と同じ BER 性能を保ったまま帯域効率を2倍にできます。M-QAM では多ビット化と引き換えに必要な Eb/N0 が増え、電力効率と帯域効率のトレードオフが定量化されます。
- モンテカルロ検証: 実際にビット列を送受信するシミュレーションで、実測 BER が理論の Q 関数曲線と広い Eb/N0 範囲で一致することを片対数グラフで確認しました。
Eb/N0 と BER の関係は、通信システム設計の出発点です。目標 BER が決まれば必要な Eb/N0 が決まり、そこからリンクバジェットを組んで送信電力・アンテナ利得・距離を設計できます。誤り訂正符号を導入すれば、同じ BER をより低い Eb/N0 で達成できる「符号化利得」が得られます。
次のステップとして、以下の記事も参考にしてください。
- ビット誤り率(BER)とは — 誤り率の定義と評価の基礎
- AWGN通信路モデル — 本記事の雑音モデルの詳細
- LDPC符号の理論 — スパースグラフ符号の原理と復号アルゴリズム — 符号化利得で Eb/N0 の壁を破る仕組み