ディジタル通信システムは、情報を送信元から受信先へ正確かつ効率的に伝送するための仕組みです。音声、画像、テキストなど、あらゆる情報をビット列に変換し、物理的な伝送媒体(電波、光ファイバー、銅線など)を通じて送り届けます。
通信システムの設計には、各構成要素の数学的モデルを正確に理解することが不可欠です。本記事では、ディジタル通信の全体像をブロック図で示し、各ブロックの役割と数学的定式化を丁寧に解説します。さらに、システム性能の根本的な限界を与えるシャノン限界を導出し、Pythonで各種変調方式のBER特性を比較します。
本記事の内容
- ディジタル通信システムのブロック図と各ブロックの役割
- AWGN通信路モデルの数学的定式化
- $E_b/N_0$(ビットあたりエネルギー対雑音電力密度比)の定義と導出
- SNRとBERの関係
- シャノン限界 $E_b/N_0 > \ln 2 = -1.59$ dB の導出
- 帯域効率と電力効率のトレードオフ
- Pythonでシャノン限界と各変調方式のBER曲線を比較
前提知識
この記事を読む前に、以下の記事を読んでおくと理解が深まります。
ディジタル通信システムのブロック図
ディジタル通信システムは、以下のブロックで構成されます。
情報源 → 情報源符号化 → 通信路符号化 → 変調 → [通信路] → 復調 → 通信路復号 → 情報源復号 → 出力
各ブロックの役割を順に見ていきましょう。
情報源(Source)
情報源は伝送したい情報を生成します。情報源の出力はアナログ信号(音声、画像など)またはディジタルデータ(テキストファイルなど)です。離散無記憶情報源(DMS)の場合、アルファベット $\mathcal{A} = \{a_1, a_2, \dots, a_M\}$ から確率 $p(a_i)$ でシンボルが出力されます。情報源のエントロピーは
$$ H(S) = -\sum_{i=1}^{M} p(a_i) \log_2 p(a_i) \quad [\text{bit/symbol}] $$
で定量化されます。
情報源符号化(Source Coding)
情報源符号化は、冗長性を除去してデータを圧縮する処理です。シャノンの情報源符号化定理により、平均符号語長の下限は情報源エントロピー $H(S)$ で与えられます。
$$ \bar{L} \geq H(S) $$
代表的な情報源符号化として、ハフマン符号、算術符号、LZW圧縮、JPEG、MP3 などがあります。
通信路符号化(Channel Coding)
通信路符号化は、伝送中に生じるビット誤りを検出・訂正するために冗長ビットを付加する処理です。$k$ ビットの情報ビットを $n$ ビットの符号語に変換します。符号化率(コードレート)は
$$ R_c = \frac{k}{n} \leq 1 $$
です。$R_c$ が小さいほど冗長性が高く、誤り訂正能力は強くなりますが、伝送効率は下がります。代表的な通信路符号として、畳み込み符号、ターボ符号、LDPC符号があります。
変調(Modulation)
変調は、ビット列を搬送波に載せる処理です。$\log_2 M$ ビットを1つの変調シンボルにマッピングします。$M$ 値変調のシンボル集合を $\mathcal{S} = \{s_1, s_2, \dots, s_M\}$ とすると、第 $m$ シンボルの送信信号は
$$ s_m(t) = \text{Re}\left[ \tilde{s}_m(t) \, e^{j 2\pi f_c t} \right], \quad 0 \leq t \leq T_s $$
と表されます。ここで $\tilde{s}_m(t)$ は複素ベースバンド信号、$f_c$ は搬送波周波数、$T_s$ はシンボル長です。シンボルあたりの平均エネルギーは
$$ E_s = \frac{1}{M} \sum_{m=1}^{M} \int_0^{T_s} |s_m(t)|^2 \, dt $$
です。
通信路(Channel)
通信路は、信号が通過する物理媒体をモデル化したものです。最も基本的なモデルはAWGN(加法性白色ガウス雑音)通信路です。
復調・復号
受信側では、変調・符号化の逆操作を行います。復調器は受信信号からシンボルを判定し、通信路復号器は誤り訂正を行い、情報源復号器はデータを復元します。
AWGN通信路モデル
数学的定式化
AWGN(Additive White Gaussian Noise)通信路は、最も基本的かつ重要な通信路モデルです。受信信号 $r(t)$ は送信信号 $s(t)$ に加法性ガウス雑音 $n(t)$ が加わったものです。
$$ r(t) = s(t) + n(t) $$
雑音 $n(t)$ は以下の性質を持ちます。
1. 平均ゼロ:
$$ E[n(t)] = 0 $$
2. 白色: 電力スペクトル密度が全周波数で一定
$$ S_n(f) = \frac{N_0}{2} \quad [\text{W/Hz}] $$
ここで $N_0$ は片側雑音電力スペクトル密度です。
3. ガウス分布: 任意の時刻 $t$ における $n(t)$ はガウス分布に従う
4. 自己相関関数: 白色性より
$$ R_n(\tau) = E[n(t)n(t+\tau)] = \frac{N_0}{2} \delta(\tau) $$
ここで $\delta(\tau)$ はディラックのデルタ関数です。
離散時間モデル
マッチドフィルタ出力をサンプリングした離散時間モデルでは、受信シンボルは
$$ r_k = s_k + n_k $$
と表されます。$n_k$ は平均ゼロ、分散 $\sigma^2 = N_0/2$ のガウス確率変数です。
$$ n_k \sim \mathcal{N}(0, N_0/2) $$
$E_b/N_0$ の定義と導出
$E_b/N_0$ とは
$E_b/N_0$ は、1ビットあたりの受信信号エネルギー $E_b$ と雑音電力スペクトル密度 $N_0$ の比であり、ディジタル通信システムの性能を統一的に評価するための基本パラメータです。
シンボルエネルギーとビットエネルギーの関係
$M$ 値変調では、1シンボルで $\log_2 M$ ビットを伝送します。シンボルあたりのエネルギー $E_s$ と1ビットあたりのエネルギー $E_b$ の関係は
$$ E_s = E_b \cdot \log_2 M $$
です。これを $E_b/N_0$ について解くと
$$ \frac{E_b}{N_0} = \frac{E_s}{N_0 \cdot \log_2 M} $$
SNRとの関係
帯域幅 $W$ [Hz] のシステムにおいて、受信SNRは
$$ \text{SNR} = \frac{S}{N} = \frac{S}{N_0 W} $$
ここで $S$ は受信信号電力、$N = N_0 W$ は帯域内雑音電力です。シンボルレート $R_s = 1/T_s$、ビットレート $R_b = R_s \log_2 M$ とすると、$S = E_s R_s = E_b R_b$ なので
$$ \text{SNR} = \frac{E_b R_b}{N_0 W} $$
帯域効率 $\eta = R_b / W$ [bit/s/Hz] を導入すると
$$ \text{SNR} = \frac{E_b}{N_0} \cdot \eta $$
この関係式は、$E_b/N_0$ がSNRと帯域効率を結びつける正規化パラメータであることを示しています。
$E_b/N_0$ を使うメリット
$E_b/N_0$ の利点は、変調方式や帯域幅に依存しない「ビットあたりの品質」で公平に比較できることです。例えば、BPSKとQPSKは同じ $E_b/N_0$ に対して同じBERを達成しますが、QPSKは帯域効率が2倍です。
SNRとBERの関係
各変調方式のBER
AWGN通信路における各変調方式のBER(ビット誤り率)は、$E_b/N_0$ の関数として理論的に求まります。
BPSK / QPSK:
$$ P_b = Q\left(\sqrt{\frac{2E_b}{N_0}}\right) $$
ここで $Q(x) = \frac{1}{\sqrt{2\pi}} \int_x^{\infty} e^{-t^2/2} dt$ はQ関数です。
M-PSK ($M \geq 8$):
$$ P_b \approx \frac{2}{\log_2 M} Q\left(\sqrt{2 \log_2 M \cdot \frac{E_b}{N_0}} \sin\frac{\pi}{M}\right) $$
M-QAM ($M$ が4の冪乗の場合、グレイ符号化):
$$ P_b \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{2E_b}{N_0}}\right) $$
BER曲線の読み方
BER曲線(ウォーターフォールカーブ)は、横軸に $E_b/N_0$ [dB]、縦軸にBER(対数目盛)をプロットしたものです。BERが急激に低下する領域を「ウォーターフォール領域」と呼びます。変調次数 $M$ を上げると帯域効率は向上しますが、同じBERを達成するのに必要な $E_b/N_0$ は増加します。
シャノン限界の導出
通信路容量
AWGN通信路の通信路容量は、シャノンの通信路符号化定理により
$$ C = W \log_2\left(1 + \frac{S}{N_0 W}\right) \quad [\text{bit/s}] $$
で与えられます。ここで $W$ は帯域幅、$S$ は信号電力です。
帯域効率の上界
信頼性のある通信(BER → 0)のためには、情報レート $R_b$ が通信路容量以下でなければなりません。
$$ R_b \leq C = W \log_2\left(1 + \frac{S}{N_0 W}\right) $$
帯域効率 $\eta = R_b/W$ で書き直すと
$$ \eta \leq \log_2\left(1 + \frac{S}{N_0 W}\right) $$
$S = E_b R_b = E_b \eta W$ を代入します。
$$ \eta \leq \log_2\left(1 + \frac{E_b \eta W}{N_0 W}\right) = \log_2\left(1 + \frac{E_b}{N_0} \eta\right) $$
$E_b/N_0$ の下界の導出
上の不等式から $E_b/N_0$ の下界を導きます。
$$ \eta \leq \log_2\left(1 + \frac{E_b}{N_0} \eta\right) $$
両辺を指数化します。
$$ 2^\eta \leq 1 + \frac{E_b}{N_0} \eta $$
$E_b/N_0$ について解きます。
$$ \frac{E_b}{N_0} \geq \frac{2^\eta – 1}{\eta} $$
この式は、帯域効率 $\eta$ を達成するために必要な $E_b/N_0$ の最小値を与えます。
帯域幅制限がない場合($\eta \to 0$)
帯域効率が0に近づく極限で、$E_b/N_0$ の絶対的な下界を求めます。
$$ \lim_{\eta \to 0} \frac{2^\eta – 1}{\eta} $$
$f(\eta) = 2^\eta – 1$ とおくと、$f(0) = 0$ かつ $f'(\eta) = 2^\eta \ln 2$ なので、ロピタルの定理により
$$ \begin{align} \lim_{\eta \to 0} \frac{2^\eta – 1}{\eta} &= \lim_{\eta \to 0} \frac{f(\eta) – f(0)}{\eta – 0} \\ &= f'(0) \\ &= 2^0 \cdot \ln 2 \\ &= \ln 2 \end{align} $$
したがって、信頼性のある通信のための $E_b/N_0$ の絶対的な下界は
$$ \frac{E_b}{N_0} \geq \ln 2 \approx 0.6931 $$
デシベル表記では
$$ \left(\frac{E_b}{N_0}\right)_{\min} = 10 \log_{10}(\ln 2) \approx -1.59 \text{ dB} $$
これがシャノン限界です。いかなる変調方式・符号化方式を用いても、$E_b/N_0 < -1.59$ dB では誤りなし通信は不可能であることを意味します。
帯域効率と電力効率のトレードオフ
トレードオフの関係
上で導出した不等式
$$ \frac{E_b}{N_0} \geq \frac{2^\eta – 1}{\eta} $$
は、帯域効率 $\eta$ と電力効率(必要な $E_b/N_0$)のトレードオフを示しています。
- 帯域効率を上げる($\eta$ を大きくする)と、必要な $E_b/N_0$ が増加する(電力効率が悪化する)
- 電力効率を上げる($E_b/N_0$ を下げる)と、帯域効率が低下する
各変調方式の位置づけ
| 変調方式 | 帯域効率 $\eta$ [bit/s/Hz] | 必要な $E_b/N_0$ (BER=$10^{-5}$) |
|---|---|---|
| BPSK | 1 | 9.6 dB |
| QPSK | 2 | 9.6 dB |
| 8-PSK | 3 | 13.0 dB |
| 16-QAM | 4 | 13.4 dB |
| 64-QAM | 6 | 17.8 dB |
| 256-QAM | 8 | 21.6 dB |
通信路符号化を組み合わせることで、シャノン限界に近づけることができます。ターボ符号やLDPC符号は、シャノン限界の0.1 dB 以内まで到達することが知られています。
Pythonによる比較プロット
各変調方式のBER曲線とシャノン限界をPythonで描画します。
import numpy as np
import matplotlib.pyplot as plt
from scipy.special import erfc
# ===== Q関数の定義 =====
def Q(x):
"""Q関数: Q(x) = 0.5 * erfc(x / sqrt(2))"""
return 0.5 * erfc(x / np.sqrt(2))
# ===== 各変調方式のBER理論式 =====
def ber_bpsk(EbN0_linear):
"""BPSK/QPSKのBER"""
return Q(np.sqrt(2 * EbN0_linear))
def ber_8psk(EbN0_linear):
"""8-PSKのBER(近似)"""
return (2/3) * Q(np.sqrt(2 * 3 * EbN0_linear) * np.sin(np.pi/8))
def ber_16qam(EbN0_linear):
"""16-QAMのBER(近似、グレイ符号化)"""
return (3/4) * Q(np.sqrt((4/5) * 2 * EbN0_linear))
def ber_64qam(EbN0_linear):
"""64-QAMのBER(近似、グレイ符号化)"""
return (7/12) * Q(np.sqrt((2/7) * 2 * EbN0_linear))
def ber_256qam(EbN0_linear):
"""256-QAMのBER(近似、グレイ符号化)"""
return (15/32) * Q(np.sqrt((2/85) * 6 * 2 * EbN0_linear))
# ===== パラメータ =====
EbN0_dB = np.linspace(-2, 25, 500)
EbN0_linear = 10**(EbN0_dB / 10)
# ===== BER計算 =====
ber_bpsk_vals = ber_bpsk(EbN0_linear)
ber_8psk_vals = ber_8psk(EbN0_linear)
ber_16qam_vals = ber_16qam(EbN0_linear)
ber_64qam_vals = ber_64qam(EbN0_linear)
ber_256qam_vals = ber_256qam(EbN0_linear)
# ===== シャノン限界曲線 =====
# 帯域効率 η に対する最小 Eb/N0 を計算
eta_range = np.linspace(0.01, 12, 500)
EbN0_min = (2**eta_range - 1) / eta_range
EbN0_min_dB = 10 * np.log10(EbN0_min)
# ===== BER曲線のプロット =====
fig, axes = plt.subplots(1, 2, figsize=(16, 7))
# (1) BER vs Eb/N0
ax1 = axes[0]
ax1.semilogy(EbN0_dB, ber_bpsk_vals, 'b-', linewidth=2, label='BPSK/QPSK')
ax1.semilogy(EbN0_dB, ber_8psk_vals, 'g-', linewidth=2, label='8-PSK')
ax1.semilogy(EbN0_dB, ber_16qam_vals, 'r-', linewidth=2, label='16-QAM')
ax1.semilogy(EbN0_dB, ber_64qam_vals, 'm-', linewidth=2, label='64-QAM')
ax1.semilogy(EbN0_dB, ber_256qam_vals, 'c-', linewidth=2, label='256-QAM')
# シャノン限界の縦線
ax1.axvline(x=-1.59, color='k', linestyle='--', linewidth=2,
label=f'Shannon limit ({-1.59:.2f} dB)')
ax1.set_xlabel('$E_b/N_0$ [dB]', fontsize=12)
ax1.set_ylabel('BER', fontsize=12)
ax1.set_title('BER Curves of Various Modulation Schemes', fontsize=13)
ax1.legend(fontsize=10)
ax1.grid(True, which='both', alpha=0.3)
ax1.set_xlim([-2, 25])
ax1.set_ylim([1e-7, 1])
# (2) 帯域効率 vs Eb/N0(シャノン限界曲線)
ax2 = axes[1]
ax2.plot(EbN0_min_dB, eta_range, 'k-', linewidth=2.5, label='Shannon limit')
# 各変調方式のプロット(BER=1e-5での必要Eb/N0と帯域効率)
modulations = [
('BPSK', 1, 9.6, 'bo'),
('QPSK', 2, 9.6, 'bs'),
('8-PSK', 3, 13.0, 'g^'),
('16-QAM', 4, 13.4, 'r^'),
('64-QAM', 6, 17.8, 'md'),
('256-QAM', 8, 21.6, 'cd'),
]
for name, eta, ebn0, marker in modulations:
ax2.plot(ebn0, eta, marker, markersize=10, label=f'{name} ($\\eta$={eta})')
# 領域の色分け
ax2.fill_betweenx(eta_range, -2, EbN0_min_dB, alpha=0.15, color='red',
label='Unachievable region')
ax2.set_xlabel('$E_b/N_0$ [dB]', fontsize=12)
ax2.set_ylabel('Spectral Efficiency $\\eta$ [bit/s/Hz]', fontsize=12)
ax2.set_title('Bandwidth Efficiency vs Power Efficiency', fontsize=13)
ax2.legend(fontsize=9, loc='upper left')
ax2.grid(True, alpha=0.3)
ax2.set_xlim([-2, 25])
ax2.set_ylim([0, 10])
plt.tight_layout()
plt.savefig('digital_comm_model.png', dpi=150, bbox_inches='tight')
plt.show()
プロットの読み方
左図(BER曲線) では、$E_b/N_0$ が増加するにつれてBERが急激に低下するウォーターフォールカーブが確認できます。変調次数が高くなるほど、同じBERを達成するために必要な $E_b/N_0$ が大きくなります。シャノン限界 $-1.59$ dB より左側では、いかなる方式でも誤りなし通信は不可能です。
右図(帯域効率 vs $E_b/N_0$) では、シャノン限界曲線の左側(赤い領域)は達成不可能な領域です。各変調方式は符号化なし(BER = $10^{-5}$)の場合の動作点としてプロットされており、シャノン限界から大きく離れていることがわかります。通信路符号化を組み合わせることで、動作点をシャノン限界に近づけることができます。
# ===== Eb/N0とSNRの関係の可視化 =====
fig, ax = plt.subplots(figsize=(10, 6))
# 各帯域効率でのSNR = (Eb/N0) * η の関係
EbN0_dB_range = np.linspace(-2, 20, 300)
EbN0_lin = 10**(EbN0_dB_range / 10)
for eta_val, color, label in [(1, 'blue', '$\\eta=1$ (BPSK)'),
(2, 'green', '$\\eta=2$ (QPSK)'),
(4, 'red', '$\\eta=4$ (16-QAM)'),
(6, 'purple', '$\\eta=6$ (64-QAM)')]:
SNR_dB = EbN0_dB_range + 10*np.log10(eta_val)
ax.plot(EbN0_dB_range, SNR_dB, color=color, linewidth=2, label=label)
ax.set_xlabel('$E_b/N_0$ [dB]', fontsize=12)
ax.set_ylabel('SNR [dB]', fontsize=12)
ax.set_title('Relationship between $E_b/N_0$ and SNR', fontsize=13)
ax.legend(fontsize=11)
ax.grid(True, alpha=0.3)
ax.set_xlim([-2, 20])
plt.tight_layout()
plt.savefig('ebn0_snr_relation.png', dpi=150, bbox_inches='tight')
plt.show()
# ===== 通信路容量の帯域幅依存性 =====
fig, ax = plt.subplots(figsize=(10, 6))
# 固定 S/N0 = 10^6 Hz(SNR=30dBのとき W=1kHz)
S_over_N0 = 1e6 # [Hz]
W_range = np.logspace(2, 8, 500) # 帯域幅 [Hz]
C = W_range * np.log2(1 + S_over_N0 / W_range) # 通信路容量 [bit/s]
ax.semilogx(W_range, C / 1e6, 'b-', linewidth=2)
# W→∞ の極限: C_max = S/N0 * log2(e)
C_max = S_over_N0 * np.log2(np.e)
ax.axhline(y=C_max / 1e6, color='r', linestyle='--', linewidth=2,
label=f'$C_{{\\max}} = S/N_0 \\cdot \\log_2 e$ = {C_max/1e6:.2f} Mbit/s')
ax.set_xlabel('Bandwidth $W$ [Hz]', fontsize=12)
ax.set_ylabel('Channel Capacity $C$ [Mbit/s]', fontsize=12)
ax.set_title('Channel Capacity vs Bandwidth ($S/N_0$ = $10^6$ Hz)', fontsize=13)
ax.legend(fontsize=11)
ax.grid(True, which='both', alpha=0.3)
plt.tight_layout()
plt.savefig('channel_capacity_bandwidth.png', dpi=150, bbox_inches='tight')
plt.show()
帯域幅と容量の関係
AWGN通信路の容量 $C = W \log_2(1 + S/(N_0 W))$ は帯域幅 $W$ の増加とともに単調増加しますが、$W \to \infty$ で上界
$$ C_{\max} = \lim_{W \to \infty} W \log_2\left(1 + \frac{S}{N_0 W}\right) = \frac{S}{N_0} \log_2 e $$
に収束します。この導出は以下のとおりです。$x = S/(N_0 W)$ とおくと $W \to \infty$ で $x \to 0$ であり
$$ \begin{align} C &= W \log_2(1 + x) \\ &= \frac{S}{N_0 x} \log_2(1 + x) \\ &= \frac{S}{N_0} \cdot \frac{\log_2(1+x)}{x} \end{align} $$
$\lim_{x \to 0} \frac{\log_2(1+x)}{x} = \frac{1}{\ln 2} \cdot \lim_{x \to 0} \frac{\ln(1+x)}{x} = \frac{1}{\ln 2} = \log_2 e$ なので
$$ C_{\max} = \frac{S}{N_0} \log_2 e $$
帯域幅を増やしても容量は有限値に飽和するため、無限の帯域幅があっても無限のデータレートは得られません。
まとめ
本記事では、ディジタル通信システムの基本モデルについて解説しました。
- ブロック図: ディジタル通信は、情報源符号化、通信路符号化、変調、通信路、復調、復号の各段階で構成される
- AWGN通信路: 受信信号 $r(t) = s(t) + n(t)$ で、雑音は電力スペクトル密度 $N_0/2$ の白色ガウス雑音
- $E_b/N_0$: ビットあたりの正規化SNRであり、$\text{SNR} = (E_b/N_0) \cdot \eta$ の関係がある
- シャノン限界: 信頼性のある通信には $E_b/N_0 \geq \ln 2 \approx -1.59$ dB が必要
- 帯域効率と電力効率のトレードオフ: $E_b/N_0 \geq (2^\eta – 1)/\eta$ により、帯域効率を上げるには電力効率を犠牲にする必要がある
- BER曲線: 変調次数が高いほど帯域効率は向上するが、同じBERに必要な $E_b/N_0$ は増大する
次のステップとして、以下の記事も参考にしてください。