復号手法

復号手法（ふくごうしゅほう、）は、符号理論における復号の手法であり、受信したメッセージを所定の符号の符号語の並びに変換する手法である。本項目では、主な復号手法を解説する。これらの手法は2元対称通信路などの通信路上を転送されるメッセージの復号に使われる。

本項目における記号 
以降の記述において、 は長さ  の符号、 は  の元、 は  間のハミング距離を表す。なお、 は線型符号とは限らない。

最適復号 
メッセージ  を受信したとき、最適復号（Ideal Observer Decoding）では、

が最大となるような符号語  を選択する。すなわち、メッセージ  の解釈として最適と考えられる符号語  を選択する。

復号における規定 
各符号語の確率はユニークではない。受信メッセージの解釈として複数の符号語が同じ確率となる場合もある。その場合、送信側と受信側の間で復号に関する規定を定めておく。一般的な規定は次のどちらかである。
 符号語の再送を要求する。
 最も確率の高い符号語群から無作為に1つを選択する。

最尤復号 
メッセージ  を受信したとき、最尤復号（Maximum Likelihood Decoding）では、

が最大となるような符号語  を選択する。すなわち、 を受信したときの条件付き確率の最も高い符号語  を選択する。なお、全ての符号語の出現確率が同じである場合、これは「最適復号」と等価である。

最終行では が固定されていることと、 が 依存性を持たないことを使っている。なお「最適復号」と同様、確率が同じ符号語がある場合の規定をしておく必要がある。

最小距離復号 
メッセージ  を受信したとき、最小距離復号（Minimum Distance Decoding）ではハミング距離

が最小となる符号語  を選択する。すなわち、なるべく  に近い符号語  を選択する。

（履歴記憶のない）離散通信路における誤り発生確率  が2分の1未満の場合、「最小距離復号」と「最尤復号」は同じである。なぜなら

としたとき、

となり（p が2分の1未満なので）、d を最小化することで値が最大になる。

最小距離復号は「最近傍復号（Nearest Neighbour Decoding）」とも呼ぶ。標準配列を使うと容易または自動的に行える。最小距離復号は、以下の条件が成り立つ場合に使いやすい。

 誤り発生確率 p が、シンボルの位置とは無関係である。
 誤り同士も無関係に独立して生じる（メッセージ内のある位置で誤りが発生したという事実が、他の位置での誤り発生に影響しない）。

これらの条件は2元対称通信路では妥当である。しかし例えばDVDの場合、ある箇所に傷が付くと、その周辺のシンボルや符号語で誤りが発生する確率が高くなり、誤り同士が相互に関係し、かつシンボルの位置が関係してくる。

他の復号手法と同様、復号が一意に定まらない場合の規定を予め決めておく必要がある。

シンドローム復号 
長さ  で最小ハミング距離  の符号 は、最小距離復号により  個以下の通信路で発生した誤りを訂正できる。シンドローム復号（Syndrome Decoding）は、線型符号のために最小距離復号を高効率に行う復号手法である。シンドローム復号は符号の線型性を利用して小さなルックアップテーブルを使うことで復号を可能にする。以下ではその方法を説明する。

符号語  を通信する際、誤りパターン  が発生したとする。すると受信されるメッセージは  となる。シンドローム復号では、与えられた符号のパリティ検査行列 を用いて受信したメッセージ  のシンドローム を計算する。ここでは符号語のなす部分空間の次元である。パリティ検査行列は全ての  についてとなる性質を持つため

が成立する。 個を超える誤りが発生しない前提で全ての誤りパターン  について値  を事前に求めておきルックアップテーブルを作成しておけば、のシンドロームから誤りパターンを得ることができる。誤りパターン  が得られれば、送信されたメッセージはの関係により簡単に求められる。

MATLABではシンドローム復号に用いるためのシンドローム復号のためのルックアップテーブルを生成する関数syndtableが用意されている

MATLABによる例：H = hammgen(3) % Hはパリティ検査行列
%% H = [ 1 0 0 1 1 0 1;  
%%       0 1 0 1 1 1 0;
%%       0 0 1 0 1 1 1]
G = gen2par(H) % Gは生成行列
%% G = [ 1 1 0 1 0 0 0;
%%       0 1 1 0 1 0 0;
%%       1 1 1 0 0 1 0;
%%       0 0 1 0 0 0 1]
t = syndtable(H) % tはシンドローム復号のためのルックアップテーブルである
%% t = [ 0 0 0 0 0 0 0   %1行目は He = [0 0 0] に対応する e
%%       0 0 1 0 0 0 0   %2行目は He = [0 0 1] に対応する e
%%       0 1 0 0 0 0 0   %3行目は He = [0 1 0] に対応する e
%%       0 0 0 0 1 0 0   %4行目は He = [0 1 1] に対応する e
%%       1 0 0 0 0 0 0                    .
%%       0 0 0 0 0 0 1                    .
%%       0 0 0 1 0 0 0                    .
%%       0 0 0 0 0 1 0 ] %8行目は He = [1 1 1] に対応する e
y = mod([0 1 0 1] * G, 2) % yは送信するメッセージ
%% y = [1 1 0 0 1 0 1] 
e = [0 0 0 1 0 0 0]; x = mod (y + e, 2) % xは受信するメッセージ
%% x = [1 1 0 1 1 0 1]
Hx = mod(parmat2 * x',2)'
%%シンドロームを計算 Hx = [1 1 0] →7行目を'ルックアップ'するとeがわかる →x-eでyを求める
y_decoded = mod(x + t(7,:), 2)
%% y_decoded = [1 1 0 0 1 0 1]

全ての符号語に対してハミング距離を直接計算する場合は全ての符号語個のハミング距離を計算する必要がある一方でシンドローム復号の場合に用いるルックアップテーブルのサイズは

となる。

関連項目 
 誤り検出訂正

参考文献 
 Hill, Raymond. (1988). A First Course In Coding Theory, New York: Oxford University Press.

符号理論
数学に関する記事