竹下徹の応用電磁気学II-2002 第十回
デジタル通信
コンピュータ間の通信はゼロと1の各ビットのやりとりによるデジタル通信が行われる。ここでは通信が疎外される可能性が有る場合(と言ってもその可能性は低い場合であるが、1ビットたりとも間違ってはいけないので)訂正するための通信技術を取り上げる。コンピュータの内部のような近距離で孤立して制御されている世界では通信の誤りは制御可能で、無いと考える。一方通信距離が大きくなったり、途中に制御不能な存在が予想される場合、通信には間違いが混入する可能性がある。これを議論しよう。また通信距離の増大は同期を取った並列データ転送をほぼ不可能にする。そのためここで考える通信とは物理ケーブル1本によるシリアル(serial)データ転送である。時間方向に瞬間には1ビットのみが送られ、また受信される。
誤りの検出と訂正
情報伝達の途中でどこかのビットひっくり返る可能性の有る(誤りのある)通信を考える。例えば、送りたい情報は"A","B","C"の3つであるとする。これを例えば、3ビットで"A"=001,"B"=011,"C"=111として送る(受け取り方もその内容を知っているとする)。単一誤り(1ビットのみ変化する可能性だけを考えると)受け取る受信符号は次の7つの場合がありうる。"A"=001を送って、最初の1ビットが誤ると、 101として受信される。同様に、011(2ビット目の誤り),000(3ビット目の誤り)そして正しく送られる場合001、合計4つの到着符号がありうる。これを"B", "C"についても考え合わせると、000が到着すると、"A"=001の1ビット誤りだけが起こりうるので、訂正可能である。しかし、001が到着して場合、"A"=001の正しい通信なのか、"B"=011の2ビット目の誤りなのか2通りの可能性があり、誤りが有ったかどうかすら判らない。そのほか、010と110の受信は訂正可能、101は誤っていることは判るが"A"か"C"かは判断できない。 001と同じく011, 111は誤りがあったのか正しく送られてきたのか判断できない。また100は2重の誤りが重ならない限り起こらないので、ここでは無視できる。
さて付加情報を加えて情報を送り上記のような誤りやその訂正が可能かどうか考える。最も簡単な符号化であるパリティ符号から始めよう。パリティ符号は全データのビットデータの1の数が偶数のとき1をビットとして付け加える(反対に全データのビットデータの1の数が奇数のとき0をビットとして付け加える)偶パリティーがある。{反対のパリティ符号は全データのビットデータの1の数が偶数のとき0をビットとして付け加える(反対に全データのビットデータの1の数が奇数のとき1をビットとして付け加える)奇パリティーがある。}原符号がA1A2A3...Anのときパリティ符号をaとして、(A1A2A3...Ana)として符号化する。 例えば原符号(送信もとのデータ)が3ビットのときは次の表のようになる。
原符号 | 偶パリティ | 奇パリティ |
000 | 0000 | 0001 |
001 | 0011 | 0010 |
010 | 0101 | 0100 |
100 | 1001 | 1000 |
011 | 0110 | 0111 |
101 | 1010 | 1011 |
110 | 1100 | 1101 |
111 | 1111 | 1110 |
もっと良い(誤り訂正のできる)符号の例としてハミング符号をあげる。パリティーではなんビットデータがあっても1ビットだけ付加情報(検査ビットとよぶ)を加えた。これでは情報を元に戻すことはできないかもしれない。それならばもっと沢山のビットを付加的に付けて冗長性を持たせればノイズ(誤動作によりビットがひっくり返る根元をノイズと言っている)につよいシステムができあがあるかもしれない。いまkビットのデータにrビットの検査ビットを付けるとしよう。しかしいくらでもrを増やせばいいと言うものではない。経済効果つまり符号化効率は最大にしたい。kビットのデータにrビットの検査ビットを付けるときは、符号効率=(k)/(k+r) で、全ての符号化集合が離れていて単一誤りを全て訂正までできる条件(dAB>3 )は というハミング条件に置き換えることができる。この条件式からk=4のときはr=3で等号が成立する。同様にk=11 then r=4, k=26 then r=5, k=57 then r=6 であり、 例えば32ビットデータ(k=32)の時はr=6で有れば不等号が成立する事が判る。ではいったいどうやって符号を付けるかみてみよう。具体例としてk=4,r=3の場合を考える。データはabcdの4ビットで、誤り訂正用の符号(これをハミング符号という)がp0,p1,p2の3ビットである。ちなみに符号効率=(4)/(4+3)=4/7=0.57である。試しにp0=a+b+c,p1=b+c+d,p2=a+b+dで付けてみよう。ここでa,b,c,dはそれぞれのビットでゼロか1である。和は2進法で取る。つまりパリティの時と同じようにXORである。異なるのは複数の符号かビットを持つ点である。これを表にすると次のようになる。
a | b | c | d | p0 | p1 | p2 |
0 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 1 | 0 | 1 | 1 |
0 | 0 | 1 | 0 | 1 | 1 | 0 |
0 | 1 | 0 | 0 | 1 | 1 | 1 |
1 | 0 | 0 | 0 | 1 | 0 | 1 |
0 | 0 | 1 | 1 | 1 | 0 | 1 |
0 | 1 | 0 | 1 | 1 | 0 | 0 |
0 | 1 | 1 | 0 | 0 | 0 | 1 |
1 | 0 | 0 | 1 | 1 | 1 | 0 |
1 | 0 | 1 | 0 | 0 | 1 | 1 |
1 | 1 | 0 | 0 | 0 | 1 | 0 |
0 | 1 | 1 | 1 | 0 | 1 | 0 |
1 | 0 | 1 | 1 | 0 | 0 | 0 |
1 | 1 | 0 | 1 | 0 | 0 | 1 |
1 | 1 | 1 | 0 | 1 | 0 | 0 |
1 | 1 | 1 | 1 | 1 | 1 | 1 |
a | b | c | d | p0 | p1 | p2 | S0 | S1 | S2 |
1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 |
0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 |
0 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 0 |
0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 1 |
0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 |
0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 |
clock | R2 | R1 | R0 |
1 | a+0 | a+0 | 0 |
2 | b+0 | a+b | a+0 |
3 | a+c | a+b+c | a+b |
4 | a+b+d | b+c+d | a+b+c |
=p2 | =p1 | =p0 |
clock | R2' | R1' | R0' |
1 | a | 0 | 0 |
2 | 0+b | a+0 | 0 |
3 | c | b | a |
4 | d+a | c+a | b |
5 | p0+b | d+a+b | c+a |
6 | p1+c+a | p0+b+c+a | d+a+b |
7 | p2+d+a+b | p1+c+a+d+a+b | p0+b+c+a |
=S2 | =S1 | =S0 |
1ビットの誤りを自動的に訂正する回路は次のようなる。最終出力が訂正された符号である。
実はこれらの図がk=4でr=3の時ばかりでなく拡張は容易で、k=26,r=5の時のハミング符号エンコーダー(符号化回路)は次の図で十分である。同様にデコーダー(複合化回路:つまり誤り訂正回路)の26ビットデータ+ハミング符号5ビット=31ビットでは、上記のR3'を31段シフトレジスターにし、R2'を3段にすればよい。もちろん左からの入力は31ビットである。