ハミング符号(ハミングコード)とは:誤り訂正の仕組み・符号化と復号の解説

ハミング符号の基本原理から符号化・復号の手順、応用例までを図解でわかりやすく解説。誤り訂正の仕組みを短時間で理解できます。

著者: Leandro Alegsa

ハミングコードは、誤り訂正用のブロック符号の一種です。名称は1950年代にこの方式を提案したリチャード・ハミングに由来します。当時ハミングはリレーを備えた機械で作業し、データの入出力にパンチングカードを使用していましたが、カードや読み取りの誤りが頻発し、それを自動的に検出・訂正する手法を考案しました(この経緯はリレーを用いた当時の作業環境に関する記述と結びつきます)。

ハミングコードは、通信や記憶媒体の信頼性向上のために広く使われ、デジタル信号処理や電気通信などの分野で採用されています。基本的には複数のパリティビット(冗長ビット)をデータビットに挿入することで、受信側で単一ビット誤りを検出して訂正できるようにした符号です。ハミング符号は短い符号長で効率良く単一ビットの訂正(single-error correction, SEC)と二重ビット誤りの検出(double-error detection, DED)を実現できます。

基本的な性質

  • 最小ハミング距離は3。これにより任意の1ビット誤りを訂正できる。
  • 冗長性の設計式:パリティビット数をkとすると、符号長 n は一般に 2^k − 1 と表されます。元のテキスト中の表記:2 k - 1 {displaystyle 2^{k}-1{\displaystyle 2^{k}-1} が該当します。
  • このときのデータビット数は n − k = 2^k − k − 1 になります。例えば k = 3 の場合は n = 7、データビット数は4で、(7,4)符号と呼ばれます。

符号化(生成)の仕組み)

ハミング符号は通常、符号語を「整列」した形(systematic form)で表します。パリティビットは符号語の中で2の冪(1, 2, 4, 8, ... の位置)に置かれ、その他の位置にデータビットが入ります。各パリティビットは自身の位置番号の二進表現でビットが1になっている位置にあるビット全体をカバーして偶数パリティ(または奇数パリティ)を取るというルールで計算されます。

例:(7,4) ハミング符号(k=3)ではビット位置を1〜7とすると、位置1,2,4がパリティビット、位置3,5,6,7がデータビットです。パリティの計算例(偶数パリティ):

  • p1(位置1)はビット1,3,5,7をチェック
  • p2(位置2)はビット2,3,6,7をチェック
  • p3(位置4)はビット4,5,6,7をチェック
それぞれのパリティは、該当する位置のビットの合計が偶数になるように設定します。

復号(シンドロームによる誤り検出と訂正)

受信側では同じチェックを行い、各パリティチェックの結果(0=パリティが合っている、1=不一致)を並べたビット列を「シンドローム」と呼びます。シンドロームは誤りの位置を二進数で示すという重要な性質があります。たとえば(7,4)でシンドロームが101なら(上位から p3 p2 p1 と読んだ場合)それは位置5に誤りがあることを示します。示された位置のビットを反転すれば単一ビット誤りは修正されます。

シンドロームが全て0なら誤りなし、0でないがパリティで示された位置が存在すればそのビットを反転して訂正します。シンドロームの値が0以外でかつ全体パリティ(拡張符号で用いる追加パリティ)も一致しない場合は二重誤りなどの検出に用いることができます。

具体例:(7,4) 符号の簡単な符号化と復号

データビットを d1 d2 d3 d4 とし、符号語を位置1〜7に配置すると(pはパリティ)

  • 位置1 = p1
  • 位置2 = p2
  • 位置3 = d1
  • 位置4 = p3
  • 位置5 = d2
  • 位置6 = d3
  • 位置7 = d4

各 p は上記のチェック集合により計算します。受信後、同じチェックを行ってシンドロームを得て、非ゼロならその位置のビットを反転して訂正します。

拡張ハミング符号(SECDED)

単一ビット訂正に加え二重誤り検出(Single Error Correction, Double Error Detection: SECDED)を行いたい場合は、符号語にさらに全体パリティビットを1つ追加します(全体の偶数パリティを取る)。これにより最小距離が4になり、1ビット訂正・2ビット検出が可能になります。一般に「拡張ハミング符号」と呼ばれます。

制限と実用上の注意

  • ハミング符号は単一ビット誤りの訂正に最適化されているが、複数ビットの誤り(特に近接したビットのバースト誤り)には弱い。
  • 冗長性(伝送オーバーヘッド)が生じるため、符号長と誤り環境に応じて適切な符号を選ぶ必要がある。
  • 現代の大容量ストレージや高速通信では、ハミング符号の発展版や畳み込み符号、ターボ符号、LDPC符号などより強力な符号が使われることも多いが、ハミング符号は単純さと低コスト実装の利点から現在でも組込み機器やメモリの一部で広く利用されています。

補足:短い符号の例((3,1))

最短のハミング符号の一つとして(3,1)があり、k=2のパリティビットでn=3、データビットは1となります。この符号ではデータ0と1に対してそれぞれ符号語が割り当てられ、受信で1ビット誤りがあれば元の符号語に訂正されます。符号語と誤りからの復元は、シンドロームに基づいて行います(テーブルでの対応づけにより、受信語を最も近い有効な符号語に戻すことができます)。

ハミング符号は設計が明快で、符号化・復号アルゴリズムも単純なので、学習用や実機実装の導入例としても非常に有用です。

質問と回答

Q:ハミングコードとは何ですか?


A:ハミングコードとは、1950年代にリチャード・ハミングによって開発された誤り訂正ブロック符号です。デジタル信号処理、電気通信などで、誤り検出、誤り訂正に利用されています。

Q:ハミングコードの仕組みは?


A:ハミングコードは、データの各ビットを複数のパリティビットでカバーすることにより、誤りを検出し、場合によっては訂正することができます。また、冗長性を持たせているため、符号語の全長は2^k - 1(kはパリティビットの数)に等しくなければなりません。

Q:ハミングコードを発明したのは誰ですか?


A:ハミングコードは、1950年代にリチャード・ハミングによって発明されました。

Q:リチャード・ハミングは自分の発明を何に使ったのか?


A:開発当時、リチャード・ハミングは、リレーを備えた機械で多用されていたパンチカードの誤りを訂正するために彼の発明を利用しました。現在では、主にデジタル信号処理、通信に利用されています。

Q:ハミングコードの場合、(N,n)と表記されるのは?


A:ハミングコードの(N,n)は、符号語の長さ(1番目の数字)とユーザデータのビット数(2番目の数字)の合計を意味します。例えば、(7,4)は合計7ビットで、4ビットがユーザデータのビットであることを意味します。

Q:最短のハミングコードとは何ですか?


A: 最も短いハミングコードは(3,1)で、これは3ビットの合計があり、1がユーザデータのビットであることを意味します。


百科事典を検索する
AlegsaOnline.com - 2020 / 2025 - License CC3