
誤り検出方式 −巡回符号−
井澤 裕司
1. はじめに
- ディジタル信号の伝送・記録では、1ビットの誤りが致命的な問題を引き起こす可能性
- があります。
- このため、フロッピーディスクやモデム、Ethernetなどのネットワークの分野では、これ
- らの誤りを検出するため、巡回符号が用いられています。
- いわゆるCRC(Cyclic
Redundancy Checking)符号も、この巡回符号に属します。
-
- ここでは、巡回符号による誤り検出の原理と、その構成法について紹介します。
2. 定義
- ディジタル信号は0と1の符号で表され、コンピュータ内部では2進数による四則演算が
- 用いられています。一方、誤り訂正(検出)符号の構成法を記述する場合には、
- この2進数の演算とは異なる「modulo2」と称する演算が用いられます。
- はじめに、このmodulo2の演算について説明しましょう。
2.1 modulo2の演算
- modulo2の加算は次のようになります。

- 以下、表記の簡略化のため、単純にプラス(+)で表すことにします。

- すなわち、mudulo2の加算は、桁上げという操作を伴わない2進数の加算に等価です。
-
- 次に、減算を定義するため、(-a)
+ a = 0 を満たす (-a)
[加算の逆元]を求めます。
- 上の加算の結果から、
-

- が得られ、

- が成立します。
- これより、modulo2
の演算では、加算(プラス+)と減算(マイナス-)の結果に違いはなく、
- 同じ結果になることがわかります。
- 一方、modulo2
の乗算は以下のようになります。
-

- 除算では、(a-1)
・ a = 1 を満たす (a-1)
を求めます。
- 上の乗算の結果から、(1-1) = 1 となり、a = 0 のとき (a-1)
は存在しないことがわかります。
-
-
- また、modulo2の変数
x
を用いた多項式についても、以下のように加算、減算を行う
- ことができます。

-
- また、多項式におけるmodulo2の乗算と除算についても、次の例のように計算する
- ことができます。

2.2 生成多項式とは
- 符号長が n
の符号語を (a0, a1, a2, …, an-1) としたとき、これを変数 x の多項式 F(x)として
- 次のように表します。

- (n-1)次以下の多項式は全体で2n個存在しますが、その中でk次の特別な多項式
G(x) で
- 割り切れるものだけを符号として扱うことを考えます。
- このF(x) を符号多項式、G(x) を生成多項式といいます。
-

すなわち、符号長が nの符号多項式を
F(x)、生成多項式 G(x) の次数を k とすると、

- を満たす多項式 Q(x)
の次数は (n-k-1) となり、Q(x) の総数は2n-k となります。
- 個々のQ(x)
について、それぞれ異なる符号多項式 F(x)
が対応するので、F(x) の総数も
- 2n-k
となることがわかります。
- すなわち、多項式Q(x)
の各係数を (n-k)個の情報ビットに対応させることにより、
- (n-k)個の符号語ができることになります。
- 2.3 巡回符号とは
-
- xn-1 が生成多項式 G(x)
で割り切れるとき、このG(x)
から生成される符号語を巡回状にシフトしたものも
- また符号語になっています。(証明は後で示します。)
- このような性質をもつ符号語を「巡回符号」といいます。
-
- 2.2で述べたように、(n-k)個の情報ビットを係数とする多項式
Q(x) と、上で述べた巡回符号の
- 生成多項式 G(x)
から、F(x) = G(x) Q(x)
を計算することにより、巡回符号を作ることができます。
- しかし、このようにして生成した符号の各ビットは、情報ビットとの対応がついていません。
- そこで、次のように符号を構成することにより、符号ビットの特定の個所に情報ビットを対応させる
- ことを考えます。
- 伝送するm(=n-k)個の情報ビットを係数とする多項式を
P(x) で表します。
- すなわち、次式が成立します。

- この多項式に xn-m
を乗じ、符号多項式の高次のm項に対応させます。
- 言うまでもなく、xn-m ・P(x) の低次の (n-m = k)項の係数はすべて0となります。
-
- ここで、xn-m ・P(x) を 2.2で示した生成多項式
G(x) で割り、その商を Q(x) 、余りを R(x) とします。
- すなわち、
-

-
- となり、余り R(x)
の次数は (k-1)次以下になります。
- いま、上式を変形すると次の式が得られます。

- このようにすると、情報ビットは符号多項式の(n-1)次から
k次までの係数としてそのまま扱うことができます。
-
-
- このような多項式
F(x)に対応する符号を伝送します。
- なお、R(x) が k
ビットの検査符号に相当します。
[証明] 巡回符号に関する定理
- 上で示した巡回符号に関する定理を証明しましょう。
- いま、xn-1が以下に示す
F1(x) で割り切れるものとします。

- ここで F1(x)
について符号語を循環させた関数を F2(x)
とおくと、
- 以下のようになります。
-

- 上の2式より、次の関係が成立します。
-

- 一方、xn-1は
G(x) で割り切れるので、その商を Q'(x)
とおくと、
-

- 一方、 G(x)
の定義より、
-

- これより、次の関係式が成り立ちます。
-

-
- すなわち、循環変換した符号も符号語になっています。
3. 巡回符号の構成法
- ここでは、具体的な巡回符号の構成法について説明します。
-
- はじめに、送信側の手順を整理しましょう。
-
- (1) 伝送するm個の情報ビットから多項式
xn-m ・P(x) を求めます。
-
- (2) 上の多項式を生成多項式
G(x) で割り、その余り R(x) を求めます。

- (3) (1)の多項式 xn-m
・P(x) と、(2)の余り R(x) の和 F(x)
を求め、対応する符号を伝送します。

-
- 一方の受信側の手順は、以下のようになります。
-
- (1) 送信された F(x)
に伝送路で誤り E(x) が加わり、A(x) = F(x) +
E(x) を受信したものと仮定します。
- (2) 伝送された A(x)
を生成多項式 G(x) で割り、その余り R(x)
を求めます。
-
- (3) もし、伝送に誤りがなければ、A(x)
は G(x) で割り切れるので、余り R(x) = 0
となります。
- 逆に、誤りがあると、余り
R(x) ≠ 0 となります。
-
- それでは、簡単な例について、実際に
F(x) を計算してみましょう。
- 例えば、n=7,m=4 のとき、生成多項式として
G(x) = x3+x+1 を用います。
- 伝送する情報ビットが
(1,1,1,1)
のとき、以下のように余りが求められます。
-

- この余り R(x) は(1,1,1)の3ビットとなり、検査ビットといいます。
- これより、伝送する巡回符号は (1,1,1,1,1,1,1)
となります。
-
- 伝送路に誤りが生じなかった場合には、受信側ではA(x)
= F(x) を受信します。
- この A(x)
を生成多項式 G(x) = x3+x+1
で割ります。
- このとき、以下のように余りは0となり、誤りがなかったことがわかります。

-
- 一方、伝送路で誤りが発生した場合ですが、例えば3ビットに誤りが生じ、(1,1,0,1,1,1,1) という
- 符号が伝送されたものとします。
- この場合は、次のように余り
R(x) が0とならないことがわかります。

-
- 次に、これを一般化した4ビットの符号(a,b,c,d)について、巡回符号を求めてみましょう。
- 結果は、次のようになります。

- すなわち、求める
F(x) は以下のようになります。
-
-
- F(x) = ax6 + bx5
+ cx4 + dx3 + (a+b+c)x2
+ (b+c+d)x + a+b+d
-
- 受信側では、この
F(x) を生成多項式 G(x)で割ることにより、誤りの有無を調べます。
- 結果は以下のようになり、余りが0で、誤りがなかったことがわかります。
-

- 以上を、表の形に整理すると、以下のようになります。

-
- この表から、この巡回符号の最小符号間距離は
3 であることがわかります。
-
- 4. 巡回符号の誤り検出
-
- 次に、送信された符号のうちいずれか
1ビットに誤りがあった場合について考えてみましょう。
-
- 例えば、n=7,m=4 の例で整数
i (0 ≦ i ≦6) とおくと、この単一誤りは
E(x) = xi で表されます。
- このとき受信側の符号多項式は、
-
- F(x) + E(x) = ax6
+ bx5 + cx4 + dx3 +
(a+b+c)x2 + (b+c+d)x + a+b+d + xi
-
- となります。
-
- ここで、誤りの含まれない
F(x) を G(x) で割った余りは 0 です。
- したがって、{F(x)
+ E(x) }を G(x) で割った余りは、E(x) を G(x)
で割った余りに等しいことがわかります。
- E(x) = xi は
G(x)
を因数にもたないので、受信側の符号多項式が
G(x)で割り切れないことは明らかです。
- 実際に、割り算をして確かめてみましょう。
-
- ・ x6/(x3+x+1)
= x3+x+1 余り x2+1
- ・ x5/(x3+x+1)
= x2+1 余り x2+x+1
- ・ x4/(x3+x+1)
= x 余り x2+x
- ・ x3/(x3+x+1)
= 1余り x+1
- ・ x2/(x3+x+1)
= 0 余り x2
- ・ x/(x3+x+1)
= 0 余り x
- ・ 1/(x3+x+1)
= 0 余り 1
-
- これらの余りの値はすべて異なっており、この値から誤ったビットの位置
[ i ] を求めることができます。
- 例えば、余りが(x2+1)のとき上式の
a を反転させ、余りが(x2+x+1)のとき
b を反転させれば、
- 誤りを訂正することが可能です。
-
- 次に、連続的な誤り(バーストエラー)が発生した場合について、検討してみましょう。
- 次数
kの生成多項式 G(x)を用いて、巡回符号を構成したとき、連続する
kビット以下の誤りを検出
- することができます。
-
- 上の例(n=7、k=3)で確認してみましょう。
-
- 連続する3ビットの誤りのパターンを整理すると次の5種類になります。
-
- ・ x6+x5+x4
=x4 (x2+x+1)
- ・ x5+x4+x3
=x3 (x2+x+1)
- ・ x4+x3+x2
=x2 (x2+x+1)
- ・ x3+x2+x
= x (x2+x+1)
- ・ x2+x+1 =
x2+x+1
-
- これらは、3次の生成多項式、例えば
G(x) = x3+x+1
で割り切れないことは明らかです。
-
- 次に、連続する2ビットではどのようになるでしょうか。
- 答えは、次の6パターンになります。
-
- ・ x6+x5
= x5 (x+1)
- ・ x5+x4
= x4 (x+1)
- ・ x4+x3
= x3 (x+1)
- ・ x3+x2
= x2 (x+1)
- ・ x2+x = x
(x+1)
- ・ x+1 = x+1
-
- これらについても、3次の生成多項式では割り切れません。
-
- これを一般化し、生成多項式の次数を
k とした場合について、連続する k
ビット以下の誤りを
- 検出できることがわかります。
5. 巡回符号の回路構成
- 巡回符号を回路で実現する手法を紹介しましょう。
-
- ここでは、上で説明した
n=7, m=4, G(x)=x3+x+1の回路構成を示します。
- はじめに、送信側の構成です。
- 出力前半の4ビットは伝送する符号、後半の3ビットは余り
R(x) に相当します。

- 下の回路図は、受信側の構成です。
- 出力前半の7ビットは伝送された符号、後半の3ビットは余り
R(x) に相当します。
- この場合誤りがないので、余りはすべて0になります。

6. CRC符号の構成法
- 前章では巡回符号により、符号誤りが検出できることを示しました。
- 巡回符号では、(xn-1)
が 生成多項式 G(x)
で割り切れることが条件となります。
- しかし、任意の整数
n に対して、G(x)
がこのような条件を満たすとは限りません。
- たとえば、生成多項式
G(x) = x3+x+1
について、調べてみましょう。
- n が10から 4の場合について、(xn-1)
を G(x) で割ると次のようになります。

- これより、G(x) = x3+x+1の場合、10以下の
n について巡回符号となるのは、n = 7
の場合
- のみであり、それ以外では巡回符号が構成できないことがわかります。
-
- 実際には、アプリケーションにより様々なビット数の誤り検出符号が必要となります。
- そこで、短縮化巡回符号という方式が考案されました。
- これを、CRC(Cyclic redundancy Checking)方式と呼びます。
-
- この方式は、xn-1が生成多項式
G(x) で割り切れない場合は、 G(x)
で割り切れる(n-1)次以下
- の多項式を用いるというものです。
-
- 例えば、上の例で、n=6
、G(x) = x3+x+1の場合について検討してみましょう。
- G(x) で割り切れる5次以下の多項式は以下の8つです。
-
- ・ 0
- ・ x3+x+1
- ・ (x3+x+1) x
= x4+x2+x
- ・ (x3+x+1)(x+1)
= x4+x3+x2+1
- ・ (x3+x+1) x2
= x5+x3+x2
- ・ (x3+x+1)(x2+1)
= x5+x2+x+1
- ・ (x3+x+1)(x2+x)
= x5+x4+x3+x
- ・ (x3+x+1)(x2+x+1)
= x5+x4+1
-
- したがって、最終的な符号は次の表のようになります。
-

-
- 実は、この表は巡回符号の
n=7 、G(x) = x3+x+1の表の上半分(すなわちMSBが0)に対応しています。
-
- 一般には、次に示す生成多項式が用いられています。
-
-
- (1) CRC-CCITT
-
- G(x) = x16+x12+x5+1
-
- (2) CRC-16
-
- G(x) = x16+x15+x2+1
-
- (3) CRC-12
-
- G(x) = x12+x11+x3+x2+x+1
-
-
- これらの詳細については、文献等で調べて下さい。
-
7. まとめ
- データの誤りを検出する手法として、巡回符号を紹介し、その構成法について解説しました。
- 実際にモデム等で使用されているCRC符号は、ビット反転等の前処理・後処理が用いられています。
- その詳細については、参考文献等で調べて下さい。
-
- [参考文献]
-
- [1]南敏著、情報理論,産業図書
- [2]松本光功他著、コンピュータ回路,森北出版
- [3]今井秀樹著、情報理論、昭晃堂
-