ハミング符号:位置を突き止めてビットを訂正する

四つのデータビットを設定し、ボタンまたは図をクリックして通信路上のビットを反転させます。復号器は三つのパリティ検査をやり直し、失敗した検査を二進数として読み、その位置のビットを反転します。まず一度、手順を追ってから、二箇所の反転も試してみましょう。

インタラクティブシミュレーションを読み込んでいます...

レッスン

理論 — ハミング符号:位置を突き止めてビットを訂正する

ハミング符号はデータにパリティビットを加え、反転した一ビットを見つけて元に戻せるようにします。各パリティビットは、選ばれた位置にある1の個数を偶数にします。これがパリティ検査です。復号器は受信語に対して同じ検査を行います。失敗のパターンであるシンドロームを二進数として読むと、誤ったビットの位置が得られ、0なら誤りなしを表します。チェックディジットでわかるのは、どこかが誤っていることまでです。ハミング符号なら位置までわかります。拡張符号は、符号語全体の1の個数を偶数にするビットを一つ加えます。これにより、任意の一箇所の反転を訂正し、任意の二箇所の反転を訂正せずに検出できます。これがSECDEDです。

各記号の意味

dᵢ
位置3、5、6、7にある四つのデータビット
p₁, p₂, p₄
それぞれ添字と同じ位置に置かれるパリティビット。p0は拡張符号の全体パリティビット
s
シンドローム4s4 + 2s2 + s1。受信時に円kの1の個数が奇数なら、skは1
P
拡張符号で受信した全ビットのパリティ。1なら反転数が奇数
p
ビット誤り率。各ビットがほかのビットとは独立に反転する確率
前提
すべてのビットが同じ確率pで、互いに独立に反転すると仮定します。現実の通信路やメモリでは、隣接する複数のビットが一度に壊れるバースト誤りも起こります。こうした多重反転は、この種の符号が最も苦手とする誤りです。
成り立たない場合
三箇所が反転すると破綻します。拡張符号では全体パリティが奇数になるため、三重反転を一重反転と読み違え、正しかったビットを訂正してしまいます。全反転を調べた表では、896通りの三重反転がすべて、フラグなしで誤ったデータを出力しています。

奇数になった円の番号を足すと、反転したビットの位置になる 🖖

一箇所反転を押してください。通信路でビット5が反転し、円1と円4に含まれる1の個数が奇数になります。円2は偶数のままです。したがって1 + 4 = 5。この結果になるように例を選んだわけではありません。円kは、位置番号を二進数で表したときにkを含む位置だけを検査します。そのため位置iのビットが誤ると、番号の和がiになる円だけが乱れます。図の中の位置が、そのままビットのアドレスなのです。ハミングが1950年に求めたのは、単一誤りの位置を示し、誤りがなければゼロになる「検査数」でした。三つの検査から得られる答えは八通り。七ビットの符号語に必要なのも、七つの位置と「誤りなし」を合わせた八通りです。余りはありません。128個ある七ビット語のうち16個が符号語で、残る112個は、それぞれただ一つの符号語から一箇所だけ反転したものです。グラフ下の表では、この112個をすべて正しく復号しています。パリティビットを位置1、2、4に置く理由も、仕組みがわかれば単純です。これらの位置は二進数で1を一つしか含まないため、各パリティビットは一つの円だけに属し、その検査だけで値を決められます。ハミング自身もこの理由を挙げています。

二箇所が反転すると、復号器は三つ目のビットまで壊す 🖖

二箇所反転を押してください。ビット3とビット5が誤ります。円1には両方が含まれるので二度乱され、結局は偶数のままです。円2と円4は奇数になり、シンドロームは6を示します。実在する位置ですから、復号器は正しかったビット6を反転します。受信時には二つだったデータビットの誤りが、訂正後には三つになります。格子を見ると、どの組合せでも同じことが起きます。21組すべて、したがって16個のデータ語に対する336通りの二重反転が、フラグなしで誤ったデータを出力します。次にパリティビットのみを押してください。位置1と位置2はデータを含まず、データ自体は無傷で届いています。それでもシンドローム3に従い、復号器はd1を壊します。今度は拡張符号・二箇所反転を押します。八番目のビットによって全体の1の個数が偶数になるため、一箇所の反転なら全体パリティは必ず奇数、二箇所なら必ず偶数です。シンドロームがゼロでないのに全体パリティが偶数なら、復号器は何も変更せず、符号語にフラグを立てます。448通りの二重反転すべてが検出されます。ただし訂正はできません。3と5を反転した場合も、1と7を反転した場合も、シンドロームは6になるからです。ハミングの出発点も検出でした。1950年の論文は、ベル研究所がアバディーン性能試験場向けに製作した二台のリレー式計算機の話から始まります。初期には8,900個のリレーのうち一日に二、三個ほどが故障しましたが、見逃しはありませんでした。その一方で、夜間や週末に無人運転すると、計算機はたびたび停止しました。

各ビットを二重送信しても、同じ八ビットを使いながら何も訂正できない 🖖

各ビットの二重送信も拡張符号も、四つのデータに八ビットを使います。二つのコピーが一致しなければ誤りが起きたことはわかりますが、どちらが正しいかは判断できません。受信側にできるのはブロックにフラグを立てることだけです。p = 0.01では、ブロックの7.69×10⁻²が検出されます。さらに、同じビットのコピーが両方とも反転した3.77×10⁻⁴は、誤ったまま通過します。拡張ハミング符号なら一箇所の反転をすべて訂正し、2.64×10⁻³を検出し、誤ったまま通過するのは5.34×10⁻⁵です。同じビット数で、フラグは29分の1、誤ったブロックは7分の1になります。破線と実線を見ると、pが0.066を超えるまで両方の指標で拡張符号が優位です。これは十五ビットに一つが反転する通信路に相当します。各ビットを三重送信すれば、スライダー上のどのpでも、ブロック単位では七ビット符号を上回ります。ここでは1.19×10⁻³に対して2.03×10⁻³です。ただし必要なのは12ビットで、七ビット符号は7ビット。だからこそ、公平なのは八ビット同士の比較です。

全プロセスの詳細解説

  1. 64ビット語にはパリティビットがいくつ必要か 4 ステップ

    64個のデータビットを同じ方法で保護します。 拡張符号・一箇所反転を押してください。四つのデータビットに四つのパリティビットを使い、符号化率は50.0%です。一つの64ビット語について、任意の一箇所の反転を訂正し、任意の二箇所を検出するには、パリティビットがいくつ必要でしょうか。また、このプリセットのp = 0.001では、長い符号語にどれほどの代償が生じるでしょうか。

    この問題をツールで開く

    1. パリティ検査がr個なら、シンドロームは2r通りの値を取ります。一つは誤りなしを表し、m + r個の各位置にも固有の値が必要なので、2r ≥ m + r + 1です。このページではm = 4で、r = 3なら余りなく条件を満たします。

    2. m = 64の場合、検査が六つでは64通りしかなく、必要な71通りに足りません。七つなら128通りあり、72ビットに十分です。したがって、71ビットあれば任意の一箇所の反転を訂正できます。

    3. さらに全体パリティビットを一つ加えると72ビットになり、そのうち8ビットが検査用です。符号化率は88.9%で、このページの50.0%を大きく上回ります。

    4. ただし、符号語が長いほど二箇所反転を拾いやすくなります。SECDEDが訂正できないのは、まさにこの二重反転です。一つの8ビット語でその確率を求めるには、ページに表示された二つの値を足します。

    解答

    パリティビットは八つ、符号語は72ビット、符号化率は88.9%です。 p = 0.001では、二箇所以上が反転する確率は2.44×10⁻³です。同じ64ビットを十六個の8ビット語として送る場合、どれか一つでも失われる確率は4.46×10⁻⁴です。長い符号語では64ビットを失う確率が約5.5倍になる一方、パリティビット数は八分の一で済みます。

学習の道すじ

アルゴリズムが正しい理由

参考文献 (2)