Hayami Kaito Web
← Apps

誤り訂正符号

パリティ・ハミング符号・CRC・リード・ソロモン符号で、通信路で反転したビットに気づいたり直したりする様子を見せます。ビットを押して壊し、ベン図や筆算、復号の手順で確かめられます。

ハミング (7,4)

4 ビットに 3 つの検査ビットを足します。3 つの検査の結果(シンドローム)が誤りの位置を 2 進で指すので、1 ビットの誤りを直せます。2 ビットの誤りは別の位置を指してしまいます。

データを 4 ビットずつのブロックに分け、それぞれを 7 ビットの符号語にして送ります(符号化率 4/7 = 57%)。

送る符号語と通信路

ビットを押すと、通信路でそのビットが反転したことにします。もう一度押すと元に戻ります。

ブロック 1(1011)
ブロック 2(0110)
  • データのビット
  • 検査用のビット
  • 通信路で反転したビット
  • 受け取った側が直したビット

受け取った側

ブロック受け取った符号語調べた結果判定取り出したデータ結果
10110111シンドローム 101(位置 5)訂正した1011正しく受け取れた
21100110シンドローム 000(誤りなし)誤りなし0110正しく受け取れた

ベン図で見るハミング符号

3 つの円は検査ビット p1・p2・p4 と、それぞれが受け持つデータビットです。円の中の 1 の数が偶数になるように検査ビットを決めるので、1 つのビットが反転すると、そのビットを含む円だけが「奇数」になります。失敗した円がすべて重なり、成功した円の外にある場所が誤りの位置です。

p1 の検査(失敗)p2 の検査p4 の検査(失敗)0p1(1)1p2(2)1d1(3)0p4(4)1d2(5)1d3(6)1d4(7)

雑音のある通信路で比べる

4 ビットのデータを 20,000 回送り、各ビットが確率 p で反転する通信路(二元対称通信路)を通したときの結果を数えます。CRC-3 は 4 ビットに 3 ビットの余りを付けます。

p
方式送るビット数正しく受け取れた誤りに気づいた気づかず間違えた内訳
符号なし481.5%0.00%18.5%
3 回繰り返し1297.2%0.00%2.8%
パリティ577.9%20.0%2.0%
ハミング (7,4)795.7%0.00%4.3%
拡張ハミング (8,4)894.1%5.2%0.64%
CRC-3(検出だけ)769.9%30.0%0.05%
  • 正しく受け取れた
  • 誤りに気づいた
  • 気づかず間違えた

使い方

  • 上のボタンで符号の種類を選びます。送るデータ(0 と 1 を 16 ビットまで、リード・ソロモン符号は文字列)を入力すると、検査用のビットを付けた符号語を表示します。
  • 符号語のビット(バイト)を押すと、通信路でそこが反転したことにできます。「ランダムに反転」のボタンでも壊せます。受け取った側がどう判定し、どこを直したかが下に出ます。
  • ハミング符号ではベン図で、CRC では筆算で、リード・ソロモン符号では復号の手順で、しくみを確かめられます。
  • 一番下の表では、雑音のある通信路にたくさんのデータを送ったときの結果を方式ごとに比べます。

検出と訂正

誤り検出・訂正符号は、データに検査用のビットを足して、正しい符号語どうしをわざと「離して」おくしくみです。2 つの符号語で違うビットの数(ハミング距離)の最小値を d とすると、d − 1 個までの誤りに気づけ、(d − 1) / 2 個までの誤りを一番近い符号語に戻して直せます。パリティは d = 2、ハミング (7,4) と 3 回繰り返しは d = 3、拡張ハミング (8,4) は d = 4 です。

直せる数を超えた誤りは、別の符号語に「直して」しまうことがあります(誤訂正)。気づかずに間違ったデータを受け取るのが一番困るので、用途によって、直すことと気づくことのどちらを優先するかを選びます。送り直してもらえる通信では CRC のように検出だけを行い、送り直せない記録媒体や遠い宇宙からの通信では訂正できる符号を使います。

効率

データのビット数 k と符号語のビット数 n の比 k / n を符号化率と呼びます。3 回繰り返しは 1 ビットを直すのに 3 倍の量を送りますが、ハミング (7,4) は 1.75 倍で同じ 1 ビットの訂正ができます。リード・ソロモン符号は、検査用の記号を 2t 個足すだけで t 個の記号の誤りを直せ、この数は理論上の限界(シングルトン限界)に達しています。