ECC チェックデジット、パリティチェック、CRC方式、ハミング符号
ECC(Error-Correcting Code:誤り訂正符号)とは、データを記録・伝送する際に発生する誤りを受け手の側で検出し、訂正することができるように付加される符号、あるいは、その方式の総称です。
符号を長くすれば検出・訂正できる誤りも増えます。しかし、符号ビットによる容量の増大や計算量の増大が必要となります。誤りの発生率、訂正手段、コストなどを勘案して適切なものが選ばれます。
メモリ自体にパリティチェックを行う機構を組み込んだECC機能付きメモリも使われています。
長い数字列のコードの場合は入力誤りをしがちです。それで、コードの末尾に1桁のチェック用の桁をもうけておき、例えばコードの各桁を加算したときの1の位の数字を入れておき、コード入力したときに計算をして、答が合致するかどうかをチェックする方法があります(実際には後述のような複雑な計算をします)。そのチェック用の桁をチェックデジットといいます。
POSシステムではJANコード(バーコード)をスキャンしますが、読み取りエラーを防ぐために、JANコードにはチェックデジットがつけられています。
JANコードは12桁のコードと1桁のチェックデジットからできています。次の手順によりチェックデジットを計算します(モジュラス10、ウエイト1、3の計算方法)。
12桁のコード部分を「4 9 1 0 1 2 3 4 5 0 6 4 」とします。
キャラクタ単位に、誤りがないかチェックする方式です。送信時にキャラクタ内の1の個数がすべて偶数個(偶数パリティといいます。すべて奇数にするなら奇数パリティです)になるように,1ビットのパリティビットを付加して送信します。受信側で1のビット数を数えることにより誤りの検出ができます。簡単な方法であり,奇数個の誤りは検出できますが,偶数個の誤り時には検出できません。また訂正はできません。
水平パリティチェック方式ともいいます。ブロックについて,キャラクタの各ビット桁の1の数が偶数(奇数)になるようにBCC(Block Check Character)を付加します。水平と垂直のパリティチェックを組み合わせることにより、
・1ビットの誤り:誤り個所がわかるので正しく訂正できる
・2ビット以上の誤り:誤りの検出はできるが訂正はできない(誤り箇所が特定できない)
ができます。
ここでは話を簡単にするために、4ビットのデータを4件送信することとし、偶数パリティにします。
データに水平パリティ符号と垂直パリティ符号による次のビット列が送られたとします。
1000~110110110001
└───┬───┘└┬─┘└┬─┘
データ │ └垂直パリティ符号
└水平パリティ符号
送られたビット列から、改めてデータ部分から1の個数を計算し、偶数なら0、奇数なら1とします。
正しく送られたときは、次図のように、パリティ符号列と計算値列が一致します。
符号 計算値
1000 1 1
0110 0 0
0010 1 1
1101 1 1
符号 0001
計算値 0001
次の赤字の1ビットに誤りが生じたときは、その位置の水平および垂直でパリティ符号と計算値が不一致になるので、誤りを検出するとともに正しく訂正できます。
符号 計算値
1000 1 1
0110 0 0
0110 1 0←不一致
1101 1 1
符号 0001
計算値 0101
↑
不一致
2ビットに誤りが生じたとき、例えば下左図のように垂直でパリティ符号と計算値が不一致になることから誤りを検出できます。しかし、下右図でも同じ不一致結果になるので、誤り箇所が特定できず、訂正はできません。
符号 計算値 符号 計算値
1000 1 1 1000 1 1
0110 0 0 0110 0 0
0110 1 0←不一致 1010 1 0←不一致
0101 1 0←不一致 1001 1 0←不一致
符号 0001 符号 0001
計算値 1101 計算値 1101
↑↑ ↑↑
不一致 不一致
なお、ここではデータ部分の誤りを対象にしましたが、水平パリティ符号列の垂直パリティ符号も送ることにより、パリティ符号の誤りもチェックできます。
巡回符号検査方式ともいいます。送信データをビット列を多項式として,それを決められた生成多項式(16ビットの生成多項式はX16+X12+X5+1)で割り,その余りのビット列を付加します。受信側ではその逆算を行って誤りを検出します。非常に高い精度で の誤り検出が可能です。特に通信では連続的にビット誤りが発生します。それをバースト誤りといいますが,その検出に効果的です。CRCはHDLCでの誤り制御に採用されているので,LANやインターネットで広く用いられている方法です。
CRCの説明はかなり面倒ですので,簡単な例題で説明します。
例えば,送信するべきビット列を1111,生成多項式をG(X)=X3+X+1とします。すると, X3 X2 X 1 X6 X5 X4 X3 X2 X 1 1 1 1 . 1 0 1 1 ) 1 1 1 1 1 0 1 1 . 1 1 0 1 1 . 1 1 1 0 1 1 1 1 1 となります(ここで0-1が-1ではなく,+1になっていますが,気にしないでください)。
余りがX2+X+1ですので,付加するビットは111になり,これを検査ビット(FCS)といいます。
受信側にデータ1111とFCS111が送られてきたときは, X3 X2 X 1 X6 X5 X4 X3 X2 X 1 1 1 1 . 1 0 1 1 ) 1 1 1 1 1 1 1 1 0 1 1 . 1 0 0 1 1 1 1 0 1 1 . 1 0 1 1 1 0 1 1 0 となり,割り切れますので,誤りがなかったことがわかります。 1101111が送られてきたときは, X3 X2 X 1 X6 X5 X4 X3 X2 X 1 1 1 1 1 . 1 0 1 1 ) 1 1 0 1 1 1 1 1 0 1 1 . 1 1 0 1 1 1 1 0 1 1 . 1 1 0 1 1 1 0 1 1 . 1 1 0 1 1 0 1 1 1 1 0 となり,割り切れないので,誤りがあることがわかります。
(ここでは、理解を容易にするため、厳密性を欠いた説明にしています)
ハミング符号とは,情報ビットに冗長ビットを付加して,2ビットの誤り検出と1ビットの誤り訂正機能をできるようにしたものです。自動訂正機能に採用されています。
4ビットX1,X2,X3,X4を送りたいとします。そのとき,冗長ビットとして,
X1 +X3+X4+P1 =偶数 X1+X2 +X4 +P2 =偶数 X1+X2+X3 +P3=偶数
となるようなP1,P2,P3の3ビットを付加して,X1X2X3X4P1P2P3を送るのです。
たとえば,1011を送るのであれば,
1 +1+1+P1 =偶数 1+0 +1 +P2 =偶数 1+0+1 +P3=偶数
から,P1=1,P2=0,P3=0ですので,1011100として送ります。
もし,1110011を受け取ったとします。
X1 X2 X3 X4 P1 P2 P3 1 1 0 0 1 1 1 1 +0 +0 +1 =偶数 (a) 1 +1 +0 +1 =奇数 (b) 1 +1 +0 +1 =奇数 (c)
なので,bとcの両方にあってaにない変数X2が誤りで,1を0にする必要があること,すなわち,送信元は1010を送ったのだということがわかります。
過去問題: 「誤りの検出と訂正」