復号手法

復号手法（ふくごうしゅほう、）は、符号理論における復号の手法であり、受信したメッセージを所定の符号の符号語の並びに変換する手法である。本項目では、主な復号手法を解説する。これらの手法は2元対称通信路などの通信路上を転送されるメッセージの復号に使われる。
本項目における記号.
以降の記述において、formula_1 は長さ formula_2 の符号、formula_3 は formula_4 の元、formula_5 は formula_3 間のハミング距離を表す。なお、formula_7 は線型符号とは限らない。
最適復号.
メッセージ formula_8 を受信したとき、最適復号（Ideal Observer Decoding）では、
が最大となるような符号語 formula_10 を選択する。すなわち、メッセージ formula_11 の解釈として最適と考えられる符号語 formula_12 を選択する。
復号における規定.
各符号語の確率はユニークではない。受信メッセージの解釈として複数の符号語が同じ確率となる場合もある。その場合、送信側と受信側の間で復号に関する規定を定めておく。一般的な規定は次のどちらかである。
最尤復号.
メッセージ formula_8 を受信したとき、最尤復号（Maximum Likelihood Decoding）では、
が最大となるような符号語 formula_10 を選択する。すなわち、formula_11 を受信したときの条件付き確率の最も高い符号語 formula_12 を選択する。なお、全ての符号語の出現確率が同じである場合、これは「最適復号」と等価である。
最終行ではformula_19 が固定されていることと、 formula_20がformula_21 依存性を持たないことを使っている。なお「最適復号」と同様、確率が同じ符号語がある場合の規定をしておく必要がある。
最小距離復号.
メッセージ formula_8 を受信したとき、最小距離復号（Minimum Distance Decoding）ではハミング距離
が最小となる符号語 formula_10 を選択する。すなわち、なるべく formula_11 に近い符号語 formula_12 を選択する。
（履歴記憶のない）離散通信路における誤り発生確率 formula_27 が2分の1未満の場合、「最小距離復号」と「最尤復号」は同じである。なぜなら
としたとき、
となり（"p" が2分の1未満なので）、"d" を最小化することで値が最大になる。
最小距離復号は「最近傍復号（Nearest Neighbour Decoding）」とも呼ぶ。標準配列を使うと容易または自動的に行える。最小距離復号は、以下の条件が成り立つ場合に使いやすい。
これらの条件は2元対称通信路では妥当である。しかし例えばDVDの場合、ある箇所に傷が付くと、その周辺のシンボルや符号語で誤りが発生する確率が高くなり、誤り同士が相互に関係し、かつシンボルの位置が関係してくる。
他の復号手法と同様、復号が一意に定まらない場合の規定を予め決めておく必要がある。
シンドローム復号.
長さ formula_2 で最小ハミング距離 formula_31 の符号 formula_32は、最小距離復号により formula_33 個以下の通信路で発生した誤りを訂正できる。シンドローム復号（Syndrome Decoding）は、線型符号のために最小距離復号を高効率に行う復号手法である。シンドローム復号は符号の線型性を利用して小さなルックアップテーブルを使うことで復号を可能にする。以下ではその方法を説明する。
符号語 formula_34 を通信する際、誤りパターン formula_35 が発生したとする。すると受信されるメッセージは formula_36 となる。シンドローム復号では、与えられた符号のパリティ検査行列 formula_37を用いて受信したメッセージ formula_38 のシンドローム formula_39を計算する。ここでformula_40は符号語のなす部分空間の次元である。パリティ検査行列formula_41は全ての formula_42 についてformula_43となる性質を持つため
が成立する。formula_45 個を超える誤りが発生しない前提で全ての誤りパターン formula_35 について値 formula_47 を事前に求めておきルックアップテーブルを作成しておけば、formula_11のシンドロームから誤りパターンformula_49を得ることができる。誤りパターン formula_49 が得られれば、送信されたメッセージはformula_51の関係により簡単に求められる。
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]
全ての符号語に対してハミング距離を直接計算する場合は全ての符号語formula_52個のハミング距離を計算する必要がある一方でシンドローム復号の場合に用いるルックアップテーブルのサイズは
となる。