軟判定復号の理論と導出と実装

深宇宙探査機から地球へ画像を送る場面を想像してください。何十億kmも離れた場所から届く電波は、地球に着くころには雑音に埋もれるほど弱くなっています。送信電力は太陽電池パネルの発電量で厳しく制限され、1デシベルの利得を稼ぐことが、探査機の寿命やデータ量を大きく左右します。このとき、受信した信号をどう料理して誤り訂正符号に渡すかで、通信性能が2デシベル近くも変わることがあります。その分かれ道が、硬判定(hard decision)復号軟判定(soft decision)復号の違いです。

受信機は、アンテナで拾った連続的な電圧波形を、まず「このビットは0か1か」という離散的な値に変換したくなります。しかし、いったん0/1に丸めてしまうと、「たぶん0だが自信がない」のか「ほぼ確実に0」なのかという確からしさの情報が失われます。軟判定復号は、この確からしさ(尤度)を捨てずに誤り訂正に使う方法です。結論を先取りすると、軟判定は硬判定に対しておよそ2デシベルの符号化利得を得ます。これは送信電力を約1.6倍に増やすのと同じ効果であり、電力制約の厳しい通信では極めて大きな差です。

軟判定復号を理解すると、次のような分野で「なぜその設計になっているのか」が腑に落ちます。

  • 衛星・深宇宙通信: DVB-S2やCCSDS規格のLDPC符号・ターボ符号は、受信信号の対数尤度比(LLR)を入力とする軟判定復号を前提に設計されています。硬判定では規格性能が出ません。
  • 無線通信(5G / Wi-Fi): 5G NRのLDPC復号器やWi-Fiのビタビ/LDPC復号器は、復調器が出力する軟情報(LLR)を受け取って動作します。復調と復号の間を流れるのは0/1ではなくLLRです。
  • ストレージ(SSD / HDD): 近年のNANDフラッシュのECCも、読み出し電圧を多段階に量子化した軟情報を使うことで、素子の劣化に対する耐性を高めています。

本記事の内容

  • 硬判定と軟判定の違い — 量子化で何を捨てているのか(直感)
  • AWGN通信路のモデルと対数尤度比 $L(y)=2y/\sigma^2$ の導出(省略なし)
  • 軟判定最尤復号が「受信ベクトルと符号語のユークリッド距離最小化」に帰着することの証明
  • 硬判定復号が「ハミング距離最小化」に帰着することの証明と両者の対比
  • 約2デシベルの符号化利得の由来 — ペア誤り確率と誤り指数から
  • PythonでのハミングHamming(7,4)符号の硬判定・軟判定復号の実装とBER対 $E_b/N_0$ 曲線のモンテカルロ実測

前提知識

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

硬判定と軟判定 — 量子化で何を捨てているのか

まず、この2つの復号法の違いを直感的につかみましょう。天気予報を例にとります。明日の天気を「晴れ」か「雨」の2択で伝える予報士がいるとします。ある日は「70%の確率で晴れ」、別の日は「95%の確率で晴れ」と考えていても、口頭では両方とも「晴れ」としか言えません。もし後で「実は雨でした」という訂正情報が入ったとき、70%の日の予報は簡単にひっくり返せますが、95%の日の予報を覆すには相当強い証拠が要ります。確信度の情報があれば、複数の予報を突き合わせて総合判断するときにずっと賢く振る舞えるのです。

通信路の受信信号も同じです。アンテナが受け取るのは $+0.9$ や $-0.1$ や $+2.3$ といった連続的な実数値です。硬判定はこれを「$0$ より大きければビット0、小さければビット1」というルールで即座に0/1へ丸めます。$+2.3$ も $+0.05$ も同じ「ビット0」になり、後者が「かろうじて0側」だったという情報は消えます。一方、軟判定は連続値そのもの(あるいはその尤度)を復号器に渡し、「$+2.3$ は自信のある0、$+0.05$ は怪しい0」という強弱を誤り訂正に活かします。

硬判定は符号だけ残し確信度を捨て軟判定は連続値を保持する数直線の概念図

数直線上の5つの受信値を見ると、硬判定は判定しきい値0の左右だけを見て $y=-2.5$ も $y=-0.2$ も同じ「1」、$y=+0.05$ も $y=+2.3$ も同じ「0」に丸めてしまいます。しかし $y=-0.2$ は「かろうじて1側」、$y=+2.3$ は「揺るぎない0」であり、その大きさ $|y|$ が確信度を表しています。軟判定はこの $|y|$ を最後まで捨てないため、強い証拠が弱い証拠を覆すという賢い総合判断ができます。

イメージを固めるため、3ビットの多数決(反復符号)で考えます。3つの受信値が $+2.0,\ +1.5,\ -0.2$ だったとしましょう。硬判定では $(0, 0, 1)$ となり、多数決で「0」と判定します。ここで最後の $-0.2$ は「$-$ 側だがほとんど0に近い」という弱い1です。軟判定では3つの値を足して $+2.0+1.5-0.2 = +3.3 > 0$ とし、やはり0と判定しますが、弱い $-0.2$ が結果をほとんど引っ張らないことが自然に反映されます。もし受信値が $+0.3,\ +0.2,\ -2.5$ なら、硬判定は $(0,0,1)$ で多数決「0」ですが、軟判定は和が $-2.0 < 0$ で「1」と判定します。強い1が2つの弱い0を正しく打ち負かすわけです。この「強い証拠が弱い証拠を覆せる」性質こそ、軟判定が硬判定に勝る根源です。

反復符号での軟判定(和)と硬判定(多数決)の比較

左の例1は硬判定でも軟判定でも同じ「0」に落ち着きますが、右の例2では判定が割れます。硬判定は $(0,0,1)$ の多数決で「0」とするのに対し、軟判定は和が $-2.0$ と負なので「1」を選びます。1つだけあった強い1($y_3=-2.5$)が、自信の乏しい2つの弱い0($+0.3,\ +0.2$)を正しく打ち負かしており、これがのちに導く最尤復号そのものになっています。

ここで自然な疑問が湧きます。「連続値をそのまま使う」とは具体的にどんな数式になるのでしょうか。そして「足し算で総合判断する」のはなぜ正しいのでしょうか。それを厳密にするために、まず通信路のモデルを立て、確からしさを定量化する対数尤度比を導入します。

通信路モデルと対数尤度比の導出

AWGN通信路とBPSK

最も基本的な通信路として、加法性白色ガウス雑音(AWGN: Additive White Gaussian Noise)通信路を考えます。送信側は各符号語ビット $c_j \in \{0,1\}$ をBPSK(二相位相偏移変調)で実数の送信シンボルに写します。

$$ x_j = 1 – 2c_j \quad (c_j=0 \to x_j=+1,\ \ c_j=1 \to x_j=-1) $$

受信信号は送信シンボルにガウス雑音が加わったものです。

$$ y_j = x_j + n_j, \qquad n_j \sim \mathcal{N}(0, \sigma^2) $$

ここで $n_j$ は平均0・分散 $\sigma^2$ の独立なガウス雑音です。雑音分散と信号対雑音比 $E_b/N_0$(1情報ビットあたりのエネルギーと雑音電力密度の比)は、符号化率 $R$ を用いて

$$ \sigma^2 = \frac{1}{2R\,(E_b/N_0)} $$

で結ばれます。SNRが高いほど $\sigma^2$ は小さくなり、受信値 $y_j$ は $\pm 1$ の近くに集まります。

受信値 $y_j$ が与えられたときの、送信ビットが0だった確率と1だった確率の比を評価したい。これを一発で扱う道具が対数尤度比です。

対数尤度比(LLR)の定義

ビット $c_j$ に関する対数尤度比(LLR: Log-Likelihood Ratio)を、受信値 $y_j$ を条件とした事後確率の比の対数として定義します。

$$ L(c_j) = \ln \frac{P(c_j=0 \mid y_j)}{P(c_j=1 \mid y_j)} $$

この量の符号と大きさには、はっきりした意味があります。$L>0$ なら0の方が確からしく、$L<0$ なら1の方が確からしい。そして $|L|$ が大きいほど、その判定への確信が強い。天気予報の例でいえば、LLRは「どちらの天気か(符号)」と「どれくらい自信があるか(絶対値)」を1つの実数に束ねたものです。硬判定はこのうち符号 $\mathrm{sign}(L)$ だけを取り出して絶対値を捨てる操作に相当します。

事前確率が等しい($P(c_j=0)=P(c_j=1)=1/2$)とすると、ベイズの定理より事後確率の比は尤度の比に一致します。

$$ L(c_j) = \ln \frac{P(y_j \mid c_j=0)}{P(y_j \mid c_j=1)} = \ln \frac{P(y_j \mid x_j=+1)}{P(y_j \mid x_j=-1)} $$

LLR = 2y/σ² の導出

いよいよ本記事の第一の核心、AWGN通信路のLLRが受信値に比例するという結果を導きます。目標は $L(y_j) = 2y_j/\sigma^2$ を示すことです。

まず、送信シンボルが $x_j=+1$ のときと $x_j=-1$ のときの受信値の確率密度を書き下します。$y_j$ は平均 $x_j$・分散 $\sigma^2$ のガウス分布に従うので、

$$ P(y_j \mid x_j=+1) = \frac{1}{\sqrt{2\pi\sigma^2}} \exp\!\left(-\frac{(y_j-1)^2}{2\sigma^2}\right), \qquad P(y_j \mid x_j=-1) = \frac{1}{\sqrt{2\pi\sigma^2}} \exp\!\left(-\frac{(y_j+1)^2}{2\sigma^2}\right) $$

送信0と1の受信値の尤度ガウス分布と重なり領域

2つの尤度は $\pm1$ を中心とする同じ形のガウス山で、受信値 $y$ に対する「送信が0だった/1だった確からしさ」を表します。中央の赤い重なり領域が、雑音によって判定を誤る確率の源です。LLRはこの2つの高さの比の対数であり、$y$ が右に寄るほど青(送信0)の山が高くなって $L>0$、左に寄るほど $L<0$ になる、という符号と大きさが自然に読み取れます。

これらの比を取ると、正規化係数 $1/\sqrt{2\pi\sigma^2}$ が分子分母で打ち消し合い、指数関数の商だけが残ります。

$$ \frac{P(y_j \mid x_j=+1)}{P(y_j \mid x_j=-1)} = \exp\!\left(-\frac{(y_j-1)^2}{2\sigma^2} + \frac{(y_j+1)^2}{2\sigma^2}\right) $$

対数を取ると指数の肩がそのまま降りてきます。ここで指数の中身を通分してまとめます。

$$ L(y_j) = \frac{1}{2\sigma^2}\Big[-(y_j-1)^2 + (y_j+1)^2\Big] $$

角括弧の中を展開します。$-(y_j-1)^2 = -(y_j^2 – 2y_j + 1)$、$(y_j+1)^2 = y_j^2 + 2y_j + 1$ なので、$y_j^2$ の項と定数 $1$ が相殺し、$2y_j+2y_j=4y_j$ だけが残ります。

$$ L(y_j) = \frac{1}{2\sigma^2}\big[(y_j^2+2y_j+1) – (y_j^2-2y_j+1)\big] = \frac{4y_j}{2\sigma^2} = \frac{2y_j}{\sigma^2} $$

こうして、AWGN通信路の通信路LLRは受信値に単純比例することがわかりました。

$$ \boxed{\,L(y_j) = \dfrac{2y_j}{\sigma^2}\,} $$

対数尤度比LLRが受信値に比例し雑音が小さいほど傾きが急になる図

LLRは受信値 $y$ に対する直線で、原点を通り傾きが $2/\sigma^2$ です。雑音が小さい($\sigma$ が小さい)ほど傾きが急になり、同じ $y$ でも $|L|$ が大きく=確信が強くなることが読み取れます。この図はガウス密度の比の対数を数値的に計算した値(点)と公式 $2y/\sigma^2$ が完全に一致することを確認しており、導出が正しいことの視覚的な裏づけになっています。

この結果は驚くほど示唆に富んでいます。第一に、受信値 $y_j$ がそのまま(定数倍を除いて)確からしさの尺度になっている。$y_j$ が大きな正なら大きな正のLLR=自信のある0、$y_j$ が $0$ 付近なら $L\approx 0$=どちらとも言えない、という直感どおりの振る舞いです。第二に、比例係数 $2/\sigma^2$ に雑音分散が現れ、雑音が小さい(SNRが高い)ほど同じ $y_j$ でもLLRの絶対値が大きくなる、つまり確信が強まる。第三に、この定数倍は復号の判定(大小比較)には効かないため、軟判定では通信路LLRとして $y_j$ そのものを使えばよいという実装上の簡明さが得られます。

対数尤度比という言葉で「確からしさ」を数式にできました。次に、この確からしさを符号語全体にわたって最適に使う復号則、すなわち最尤復号を組み立てます。

軟判定最尤復号はユークリッド距離最小化になる

最尤復号の定式化

受信ベクトル $\bm{y}=(y_1,\dots,y_n)$ が得られたとき、どの符号語 $\bm{c}$ が送られたかを推定します。各符号語が等確率で送られるなら、事後確率最大(MAP)は尤度最大(ML: Maximum Likelihood)に一致します。すなわち、送られた確率が最も高い符号語を選びます。

$$ \hat{\bm{c}} = \arg\max_{\bm{c}\in\mathcal{C}} P(\bm{y}\mid \bm{c}) $$

ここで $\mathcal{C}$ は符号(全符号語の集合)です。AWGN通信路では各ビットの雑音が独立なので、ベクトル全体の尤度は各成分の尤度の積に分解できます。$\bm{x}=(x_1,\dots,x_n)$ を $\bm{c}$ に対応するBPSKシンボル列として、

$$ P(\bm{y}\mid \bm{c}) = \prod_{j=1}^{n} \frac{1}{\sqrt{2\pi\sigma^2}} \exp\!\left(-\frac{(y_j-x_j)^2}{2\sigma^2}\right) $$

積のままでは扱いにくいので、単調増加関数である対数を取ります。対数を取っても $\arg\max$ の位置は変わりません。

$$ \ln P(\bm{y}\mid \bm{c}) = -\frac{n}{2}\ln(2\pi\sigma^2) – \frac{1}{2\sigma^2}\sum_{j=1}^{n}(y_j – x_j)^2 $$

右辺の第1項は符号語 $\bm{c}$ に依存しない定数です。第2項の係数 $-1/(2\sigma^2)$ は負なので、対数尤度を最大化することは $\sum_j (y_j-x_j)^2$ を最小化することと同値になります。

$$ \hat{\bm{c}} = \arg\max_{\bm{c}\in\mathcal{C}} \ln P(\bm{y}\mid\bm{c}) = \arg\min_{\bm{c}\in\mathcal{C}} \sum_{j=1}^{n}(y_j – x_j)^2 = \arg\min_{\bm{c}\in\mathcal{C}} \lVert \bm{y}-\bm{x} \rVert^2 $$

幾何的な意味

これで第二の核心が示せました。軟判定最尤復号とは、受信ベクトル $\bm{y}$ にユークリッド距離が最も近いBPSK信号点 $\bm{x}$(に対応する符号語)を選ぶことに他なりません。$n$ 次元の実空間に符号語の数だけ信号点が散らばっていて、受信点 $\bm{y}$ からいちばん近い信号点を選ぶ、という素直な幾何になります。連続値 $y_j$ をそのまま距離計算に投入するので、確からしさの情報が最後まで使われます。

軟判定MLは受信点に最も近い信号点を選ぶユークリッド距離の幾何

2次元に簡略化した図で、2つの信号点A($+1$側)とB($-1$側)に対し受信点 $y$ がどちらに近いかを測っています。この例では距離がAまで2.01、Bまで1.35なので、軟判定MLはBを選びます。緑の点線は2信号点の垂直二等分線=決定境界で、受信点がこの線のどちら側にあるかが判定を決める、というのが「最も近い信号点を選ぶ」ことの幾何的な中身です。

先ほどの反復符号での「受信値を足す」という操作も、この枠組みから自然に出てきます。反復符号の符号語は全0($\bm{x}=(+1,\dots,+1)$)か全1($\bm{x}=(-1,\dots,-1)$)の2つだけです。ユークリッド距離の差を展開すると $\lVert\bm{y}-\bm{x}\rVert^2$ の $\bm{x}$ 依存項は $-2\sum_j y_j x_j$ なので、距離最小化は相関 $\sum_j y_j x_j$ の最大化と同値です。全0符号語($x_j=+1$)を選ぶ条件は $\sum_j y_j > 0$、つまり受信値の総和の符号で決まります。「値を足して符号を見る」という軟判定多数決は、ML復号そのものだったのです。

さらに、LLRとの関係も明快です。$\lVert\bm{y}-\bm{x}\rVert^2 = \sum_j(y_j^2 – 2y_jx_j + x_j^2)$ のうち、$y_j^2$ と $x_j^2=1$ は符号語によらない定数なので、距離最小化は $\sum_j y_j x_j$ の最大化、すなわち $\sum_j L(y_j)\,x_j$ の最大化($L=2y/\sigma^2$ は正の定数倍)と同値です。軟判定復号はLLRと信号点の相関を最大にする符号語を選ぶ、と言い換えられます。

ここまでは連続値を捨てない軟判定を見ました。対比のため、次に受信値を先に0/1へ丸めてしまう硬判定が、どんな最適化に対応するのかを調べます。

硬判定復号はハミング距離最小化になる

二元対称通信路への帰着

硬判定では、復号に先立って各受信値を符号で丸めます。

$$ z_j = \begin{cases} 0 & (y_j \ge 0) \\ 1 & (y_j < 0) \end{cases} $$

送信ビットが $c_j=0$($x_j=+1$)なのに雑音で $y_j<0$ となって $z_j=1$ に化ける確率を $p$ とすると、これは対称なガウス雑音なので

$$ p = P(y_j < 0 \mid x_j=+1) = P(n_j < -1) = Q\!\left(\frac{1}{\sigma}\right) $$

です。ここで $Q(x)=\frac{1}{\sqrt{2\pi}}\int_x^\infty e^{-t^2/2}\,dt$ は標準ガウス分布の上側確率です。逆向きの誤り($c_j=1$ が $z_j=0$ に化ける)も対称性から同じ確率 $p$ で起きます。こうして硬判定は、入力ビットが確率 $p$ で反転する二元対称通信路(BSC: Binary Symmetric Channel)に受信を単純化したことになります。連続的な $y_j$ が持っていた強弱の情報は、この時点ですべて $p$ という1つの数に押し込められて失われます。

硬判定が連続値をBSC反転確率pへ圧縮する様子

反転確率 $p=Q(1/\sigma)$ はSNRが上がる($\sigma$ が小さくなる)につれて急激に小さくなります。硬判定が失うのは、受信値ごとに違っていたはずの確からしさで、それらがすべて「一律に確率 $p$ で反転する」という1本のパラメータに潰されてしまいます。この情報の圧縮こそが、次に見る性能損失の正体です。

ハミング距離最小化の導出

BSC上での最尤復号を書き下します。硬判定ビット列 $\bm{z}=(z_1,\dots,z_n)$ が観測されたとき、符号語 $\bm{c}$ が送られた尤度は、$\bm{z}$ と $\bm{c}$ が異なるビット数を $d_H(\bm{z},\bm{c})$(ハミング距離)として

$$ P(\bm{z}\mid \bm{c}) = p^{\,d_H(\bm{z},\bm{c})}\,(1-p)^{\,n-d_H(\bm{z},\bm{c})} $$

と書けます。ちょうど $d_H$ 個のビットが反転し、残り $n-d_H$ 個は正しく届いた、という確率です。対数を取って整理します。

$$ \ln P(\bm{z}\mid\bm{c}) = d_H(\bm{z},\bm{c})\ln p + (n-d_H(\bm{z},\bm{c}))\ln(1-p) = d_H(\bm{z},\bm{c})\ln\frac{p}{1-p} + n\ln(1-p) $$

第2項 $n\ln(1-p)$ は符号語によらない定数です。第1項の係数 $\ln\frac{p}{1-p}$ は、雑音が優勢でない普通の状況($p<1/2$)ではになります。したがって対数尤度の最大化は $d_H(\bm{z},\bm{c})$ の最小化と同値です。

$$ \hat{\bm{c}} = \arg\min_{\bm{c}\in\mathcal{C}} d_H(\bm{z},\bm{c}) $$

つまり硬判定最尤復号は、丸めたビット列 $\bm{z}$ にハミング距離が最も近い符号語を選ぶことです。線形ブロック符号ではこれをシンドロームと標準配列で効率的に実行します(線形ブロック符号の理論を参照)。

2つの距離の対比

これで2つの復号法がきれいに対比できます。軟判定は連続空間でのユークリッド距離を最小化し、硬判定は0/1に丸めた空間でのハミング距離を最小化します。ハミング距離は「何ビット違うか」しか数えないので、$+2.3$ と $+0.05$ の違い(=どれだけ自信を持って0だったか)を区別できません。一方ユークリッド距離は $|y_j-x_j|$ の二乗和なので、$y_j$ が信号点からどれだけ離れているかを連続的に測り、確からしさをそのまま距離に反映します。

ハミング距離は自信の差を潰しユークリッド距離は連続的に測る比較

左は同じ「$(0,0,0)$」に丸められる2つの受信ベクトルで、自信の大きい受信Aと自信の乏しい受信Bはハミング距離では全く区別がつきません。ところが右のように全0信号点までのユークリッド距離を測ると、AとBは明確に異なる値になります。硬判定が捨ててしまう確信度の差を、軟判定は距離という連続量にきちんと反映していることが一目で分かります。

言い換えれば、硬判定は「まず量子化してから復号」、軟判定は「量子化せずに復号」です。データ処理不等式が教えるとおり、途中で情報を捨てる(量子化する)処理は性能を改善しません。硬判定は必ず軟判定以下の性能になります。問題は「どれだけ損をするか」です。次のセクションで、その損失が漸近的に約2デシベルであることを定量的に導きます。

約2デシベルの符号化利得の由来

ペア誤り確率で比べる

損失を見積もるには、2つの符号語を取り違える確率(ペア誤り確率)を軟判定・硬判定それぞれで評価し、比べるのが早道です。符号語 $\bm{c}$ と、それとハミング距離 $d$ だけ離れた符号語 $\bm{c}’$ の2つに絞って考えます。

軟判定の場合。 BPSK信号点 $\bm{x},\bm{x}’$ は $d$ 個の位置で符号が逆(片方 $+1$、もう片方 $-1$)なので、各差分位置での二乗距離は $(+1-(-1))^2=4$、合計すると信号点間のユークリッド二乗距離は $\lVert\bm{x}-\bm{x}’\rVert^2 = 4d$ です。受信点がどちらに近いかで判定するので、ML復号で $\bm{c}$ を $\bm{c}’$ と取り違える確率は、信号点間距離の半分を雑音が超える確率になります。

$$ P_2^{\text{soft}}(d) = Q\!\left(\frac{\lVert\bm{x}-\bm{x}’\rVert}{2\sigma}\right) = Q\!\left(\frac{\sqrt{4d}}{2\sigma}\right) = Q\!\left(\frac{\sqrt{d}}{\sigma}\right) $$

$\sigma^2 = 1/(2R\,E_b/N_0)$ を代入して $Q$ の引数の二乗を作ると、$d/\sigma^2 = 2dR\,(E_b/N_0)$ となるので

$$ P_2^{\text{soft}}(d) = Q\!\left(\sqrt{2\,d\,R\,\frac{E_b}{N_0}}\right) $$

を得ます。符号なしBPSKのビット誤り率 $Q(\sqrt{2E_b/N_0})$ と見比べると、$Q$ の中身が $dR$ 倍に増えています。$Q$ 関数の引数の二乗が実効SNRを表すので、軟判定は実効SNRを $dR$ 倍する、つまり軟判定の漸近符号化利得は $10\log_{10}(R\,d_{\min})$ デシベルです($d_{\min}$ は符号の最小距離)。

硬判定の場合。 BSCの反転確率は $p = Q(1/\sigma) = Q(\sqrt{2R\,E_b/N_0})$ です。$\bm{c}$ を $\bm{c}’$ と取り違えるには、両者が異なる $d$ 位置のうち過半数が反転する必要があります。二項分布の裾を評価すると、チャーノフ限界により

$$ P_2^{\text{hard}}(d) \le \big[\,2\sqrt{p(1-p)}\,\big]^{d} = \big[4p(1-p)\big]^{d/2} \approx (4p)^{d/2} $$

が成り立ちます(最後は $p\ll 1$ の近似)。$Q$ 関数の指数的な上界 $Q(x)\le \tfrac12 e^{-x^2/2}$ を使うと $p \le \tfrac12 e^{-R E_b/N_0}$ なので、$4p \approx 2\,e^{-R E_b/N_0}$、したがって

$$ P_2^{\text{hard}}(d) \lesssim 2^{d/2}\exp\!\left(-\frac{d}{2}\,R\,\frac{E_b}{N_0}\right) $$

となります。

指数を比べると

2つのペア誤り確率の指数(SNRに比例する肩の係数)だけを取り出して比べます。

$$ \text{軟判定: } \ \exp\!\left(-\,d\,R\,\frac{E_b}{N_0}\right), \qquad \text{硬判定: } \ \exp\!\left(-\frac{d}{2}\,R\,\frac{E_b}{N_0}\right) $$

軟判定の指数は硬判定のちょうど2倍の速さでSNRとともに減衰します。同じ誤り確率を達成するには、硬判定は軟判定の2倍の $E_b/N_0$ を必要とする、つまり $10\log_{10}2 \approx 3.0$ デシベル余分に電力が要る、という結論になります。これがチャーノフ限界に基づく漸近的な最悪見積もりです。

ペア誤り確率の軟判定と硬判定の減衰速度の比較

$d=3$ のペア誤り確率を片対数で比べると、軟判定(水色)の曲線が硬判定(橙)よりはるかに急な傾きで落ちていきます。片対数プロットでの傾きが指数の減衰率に対応するので、軟判定の傾きが硬判定の約2倍という関係が視覚的に確認できます。同じペア誤り確率に到達する $E_b/N_0$ を横に見ると、硬判定が数デシベル右側に位置しており、これが符号化利得の差として現れます。

3デシベルと2デシベルの間

上のチャーノフ限界は硬判定に対してやや厳しすぎる(誤り確率を過大評価する)ため、実際に測ると損失は3デシベルより小さく、多くの符号・多くの実用的なBER領域で約2デシベルに落ち着きます。これが教科書で広く言われる「軟判定は硬判定より約2デシベル有利」という経験則の正体です。3デシベルは高SNR・チャーノフ限界の理想化された上界、2デシベルは現実的な数字だと理解してください。

より厳密な情報理論的な裏づけもあります。低SNR極限で、AWGN通信路(軟)を2値量子化してBSC(硬)にすると、遮断レート(cutoff rate)や容量の観点で失われる量はちょうど因子 $\pi/2$ に対応し、

$$ 10\log_{10}\frac{\pi}{2} = 1.96\ \text{dB} $$

というきれいな値になります。この $\pi/2\approx 1.96$ デシベルが、「2デシベル」という数字の理論的な芯です。8段階程度に量子化した軟情報を使えば、この損失の大半(残り約0.25デシベルまで)を取り戻せることも知られており、実装では無限精度の連続値ではなく数ビットの量子化LLRで十分な理由になっています。

量子化段数と情報損失で硬判定2値が約1.96dB損する図

軟判定(水色)は受信値をそのまま連続なLLRとして渡すのに対し、硬判定(赤)は符号だけを残す2値量子化で、その損失が低SNR極限で $10\log_{10}(\pi/2)\approx1.96$ デシベルに相当します。橙の8段階量子化は連続曲線を階段状に粗く近似しますが、それでも軟判定にごく近く、残る損失は約0.25デシベルにとどまります。これが、実装で無限精度ではなく数ビットの量子化LLRを使えば十分だとされる理由です。

具体的な符号で数字を見ておきましょう。後で実装するハミングHamming(7,4)符号は $R=4/7$、最小距離 $d_{\min}=3$、訂正能力 $t=1$ です。軟判定の漸近利得は $10\log_{10}(R\,d_{\min}) = 10\log_{10}(12/7) \approx 2.34$ デシベル、硬判定の漸近利得は $10\log_{10}(R(t+1)) = 10\log_{10}(8/7)\approx 0.58$ デシベルで、その差は約 $1.76$ デシベル。まさに「約2デシベル」の目安どおりです。

理論で約2デシベルという数字が出ました。本当にそうなるのか、実際に符号を組んでモンテカルロで確かめます。

PythonによるHamming(7,4)符号の実装

硬判定・軟判定の両復号

Hamming(7,4)符号(情報4ビット、符号語7ビット、全16符号語)を題材に、硬判定復号(シンドローム復号)と軟判定復号(全符号語とのユークリッド距離最小=ML)を実装します。まず符号の定義と2つの復号器を用意します。

import numpy as np

# Hamming(7,4): 系統形の生成行列 G(4x7) と検査行列 H(3x7)
P = np.array([[1,1,0],[0,1,1],[1,1,1],[1,0,1]])       # 4x3 パリティ部
G = np.hstack([np.eye(4, dtype=int), P]) % 2           # [I4 | P]
H = np.hstack([P.T, np.eye(3, dtype=int)]) % 2         # [P^T | I3]

# 全16符号語とその情報ビットを列挙
msgs = np.array([[(i >> b) & 1 for b in range(4)] for i in range(16)])
codewords = (msgs @ G) % 2            # 16x7 の符号語
x_signals = 1 - 2 * codewords.astype(float)   # BPSK 信号点 (0->+1, 1->-1)

# シンドローム -> 誤りパターン の対応表(1ビット誤りまで訂正)
synd_table = {(0, 0, 0): np.zeros(7, dtype=int)}
for e in range(7):
    ev = np.zeros(7, dtype=int); ev[e] = 1
    synd_table[tuple((H @ ev) % 2)] = ev

上のコードでHamming(7,4)符号を系統形で定義しました。H @ G.T % 2 はすべて0になり(検査行列と生成行列が直交する)、正しい符号であることが確認できます。synd_table は各シンドロームに対応する1ビット誤りパターンを引く辞書で、硬判定のシンドローム復号に使います。

続いて2つの復号関数を定義します。硬判定は受信値を符号で丸めてシンドロームから誤りを訂正し、軟判定は受信ベクトルに最も近い符号語を全探索で選びます。

def decode_hard(y):
    """硬判定: 0/1へ丸め、シンドロームで1ビット誤りを訂正"""
    z = (y < 0).astype(int)                 # 硬判定ビット
    s = tuple((H @ z) % 2)                   # シンドローム
    c_hat = (z + synd_table[s]) % 2          # 誤り訂正
    return c_hat[:4]                          # 情報ビット(系統形の先頭4)

def decode_soft(y):
    """軟判定: 受信ベクトルにユークリッド距離最小の符号語を選ぶ(ML)"""
    dist2 = ((y[None, :] - x_signals) ** 2).sum(axis=1)  # 各符号語との二乗距離
    return msgs[np.argmin(dist2)]            # 最も近い符号語の情報ビット

硬判定の decode_hard は連続値 y を最初の1行で0/1に丸め、以降はビット列だけで動きます。ここで確からしさの情報が捨てられます。対して decode_softy を丸めずに全16符号語の信号点との二乗距離を計算し、最小のものを選びます。これが前節で導いた「ユークリッド距離最小化=軟判定ML」の直接的な実装です。

BER対 Eb/N0 のモンテカルロ

各 $E_b/N_0$ で多数のフレームを送り、硬判定・軟判定・符号なしのビット誤り率を実測して比較します。

from scipy.special import erfc

def Q(x):
    return 0.5 * erfc(x / np.sqrt(2))       # ガウス上側確率

R = 4 / 7                                    # 符号化率
rng = np.random.default_rng(0)
ebn0_db = np.arange(0, 9.1, 1.0)
ber_uncoded, ber_hard, ber_soft = [], [], []

for db in ebn0_db:
    ebn0 = 10 ** (db / 10)
    sigma = np.sqrt(1 / (2 * R * ebn0))      # 雑音標準偏差
    n_frame = 40000
    err_h = err_s = 0
    for _ in range(n_frame):
        m_idx = rng.integers(0, 16)          # 送信メッセージ
        c = codewords[m_idx]
        y = (1 - 2 * c) + sigma * rng.standard_normal(7)  # AWGN受信
        err_h += np.sum(decode_hard(y) != msgs[m_idx])
        err_s += np.sum(decode_soft(y) != msgs[m_idx])
    ber_hard.append(err_h / (4 * n_frame))
    ber_soft.append(err_s / (4 * n_frame))
    ber_uncoded.append(Q(np.sqrt(2 * ebn0))) # 符号なしBPSKの理論値

このループは各SNRで多数のフレームを送信し、硬判定・軟判定それぞれの情報ビット誤り数を数えています。符号なしはBPSKの理論BER $Q(\sqrt{2E_b/N_0})$ を基準線として併記します。実行すると、たとえば $E_b/N_0=8$ デシベルで符号なし約 $1.9\times10^{-4}$、硬判定約 $1.1\times10^{-4}$、軟判定約 $6\times10^{-6}$ となり、軟判定は硬判定より一桁も低いBERを達成します(統計を安定させるには数百万フレーム規模が必要で、本記事の図は200万フレームで測定しています)。

BER曲線の可視化

得られた3本のBER曲線を片対数プロットで描きます。

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, 5))
plt.semilogy(ebn0_db, ber_uncoded, 'k--', marker='s', label='符号なし(理論)')
plt.semilogy(ebn0_db, ber_hard, 'b-', marker='o', label='硬判定 (ハミング距離)')
plt.semilogy(ebn0_db, ber_soft, 'r-', marker='^', label='軟判定 (ユークリッド距離/ML)')
plt.xlabel('$E_b/N_0$ [dB]')
plt.ylabel('ビット誤り率 (BER)')
plt.title('Hamming(7,4) 符号: 硬判定 vs 軟判定 の符号化利得')
plt.legend(); plt.grid(True, which='both', alpha=0.3)
plt.ylim(1e-5, 1); plt.tight_layout()
plt.show()

Hamming(7,4)符号の符号なし硬判定軟判定のBER対Eb/N0曲線

このグラフから、軟判定復号の効果がはっきり読み取れます。第一に、高SNR側で軟判定(赤)の曲線が硬判定(水色)よりも一貫して左側にあり、同じBERをより低い $E_b/N_0$ で達成しています。第二に、軟判定曲線は硬判定曲線より傾きが急で、これは軟判定の実効SNR利得が $d_{\min}=3$ 倍(硬判定は $t+1=2$ 倍)に効くという指数の違いを反映しています。第三に、低SNR側($E_b/N_0$ が2デシベル程度以下)では硬判定が符号なしよりむしろ悪化する領域が現れます。これは、雑音が強いと1ビット訂正能力しかないHamming符号が誤訂正を起こしやすく、丸めによる情報損失がたたるためで、軟判定はこの領域でも符号なしを下回る安定した性能を保ちます。

同じBERを達成するEb/N0の水平差で表した符号化利得

同じBERに到達するための水平方向の隔たりが、軟判定と硬判定の符号化利得の差です。このモンテカルロでは $\text{BER}=10^{-4}$ で約1.4デシベルの差が測定され、SNRを上げるにつれて漸近値 $10\log_{10}(R\,d_{\min})-10\log_{10}(R(t+1))\approx1.76$ デシベルへ近づいていきます。有限のBER領域では利得はまだ漸近値に達しておらず、「約2デシベル」は高SNR極限での目安である点に注意してください。

念のため、軟判定復号がLLRの相関最大化と等価であることも数値で確かめられます。x_signals との二乗距離最小化と、(2*y/sigma**2) @ x_signals.T の最大化は、同じ符号語を選びます。定数倍と定数項を除けば両者が一致するという、前節の代数的な議論どおりの結果です。

まとめ

本記事では、軟判定復号の理論を導出から実装まで通して解説しました。

  • 量子化で捨てる情報: 硬判定は受信連続値を0/1に丸め、「どれだけ自信のある判定か」という確からしさを捨てます。軟判定はこれを対数尤度比として保持し、誤り訂正に活かします。
  • LLRの導出: AWGN通信路の対数尤度比は $L(y)=2y/\sigma^2$ と受信値に単純比例します。受信値そのものが確からしさの尺度になり、雑音が小さいほど確信が強まります。
  • 軟判定ML = ユークリッド距離最小化: 各ビットの雑音が独立なガウスなので、最尤復号は受信ベクトルに最も近い信号点(符号語)を選ぶ幾何に帰着します。連続値が最後まで使われます。
  • 硬判定 = ハミング距離最小化: 先に0/1へ丸めるとBSCになり、最尤復号は丸めたビット列にハミング距離最小の符号語を選ぶ操作になります。「何ビット違うか」しか数えられません。
  • 約2デシベルの符号化利得: ペア誤り確率の指数を比べると、軟判定の減衰は硬判定の2倍速く、チャーノフ限界では最大3デシベル、実際的には約2デシベル(理論的な芯は低SNR極限の $10\log_{10}(\pi/2)\approx1.96$ デシベル)の差が生まれます。Hamming(7,4)のモンテカルロでもこの利得が確認できました。

軟判定は、受信機と復号器の間を流れる情報を「0か1か」ではなく「LLR」にするだけで、追加の帯域も符号長も要らずに約2デシベルを稼ぎます。だからこそ現代のあらゆる高性能通信・ストレージの復号器はLLR入力を前提に設計されています。

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