|
!GAIさんの、投稿にありました ハミング・コード についての実験。
! コード自身が、1bit までの誤りビットを、特定する仕組みを、動かしてみます。
! データーが縦に伸びる 列ベクトルは、表示の難があり、行列は、逆にしています。
! プログラムは、冗長ビット4での最大全長14ビット の場合の例です。
DIM M(1,14), h(14,4), bcc(1,4)
PRINT "--- パリティ 行列 h"
MAT READ h
DATA 0,0,0,1 ! 1 ! 0 は エラー無しの予約値。
DATA 0,0,1,0 ! 2
DATA 0,0,1,1 ! 3
DATA 0,1,0,0 ! 4
DATA 0,1,0,1 ! 5
DATA 0,1,1,0 ! 6
DATA 0,1,1,1 ! 7
DATA 1,0,0,0 ! 8
DATA 1,0,0,1 ! 9
DATA 1,0,1,0 ! 10
DATA 1,0,1,1 ! 11
DATA 1,1,0,0 ! 12
DATA 1,1,0,1 ! 13
DATA 1,1,1,0 ! 14 !オール1の、15 も使用できない。(※注)
MAT PRINT h;
PRINT "上の、14 x 4 の行列 h を、"
PRINT
PRINT "メッセージ・データー 14bit長"
PRINT " (1行 14 列 のベクトル)に乗ずると、"
PRINT " チェック・データー 4bit長"
PRINT " (1行 4 列 のベクトル)が出来る。"
PRINT
MAT READ M ! メッセージ・データー 14bit長
DATA 1,1,0,1,0,0,1,1,0,1, 0,0,0,0 ! 左 10bit長 が、任意で、適当に変えてみるとよい。
! メッセージ・データー 14bit長 を、行ベクトル( m1,m2,m3,,,m14 ) として、
! 行列 h を右に置いて乗ずると、bcc1,bcc2,bcc3,bcc4 …4要素の行ベクトル、
! チェック・データー ができる。この時の積和の計算は、
! 1ビット幅の桁上り無し。 排他的論理和 xor や、Modulo2 の和 =MOD( … ,2)
! で行い、4要素は、4bit として求める。これが常に、0000 となる条件が必要です。
!
! そのために、次のような代数式を解く。加算は、桁上り無しの1ビット幅( modulo 2)
!「行列乗算で計算する過程、右(左?)90度回した状態」
!
!(1) 0= m1 +m3 +m5 +m7 +m9 +m11 +m13
!(2) 0= m2+m3 +m6+m7 +m10+m11 +m14
!(3) 0= m4+m5+m6+m7 +m12+m13+m14
!(4) 0= m8+m9+m10+m11+m12+m13+m14
!
!(3)+(4) 0=m4+m5+m6+m7+m8+m9+m10 +m11 (同じものを加算すると0になる。)
!(1)+(2)+(3) 0=m1+m2+m4+m7+m9+m10 +m12
!(1)+(3)+(4) 0=m1+m3+m4+m6+m8+m10 +m13
!(2)+(3)+(4) 0=m2+m3+m4+m5+m8+m9 +m14
!
! 14 bit の右端 4bit を、下の様に従属させると、左 10bit は、自由に
! 選んでも、上の、0000 となる条件を、満たす事ができる。
LET M(1,11)=MOD( M(1,4)+M(1,5)+M(1,6)+M(1,7)+M(1,8)+M(1,9)+M(1,10) ,2)
LET M(1,12)=MOD( M(1,1)+M(1,2)+M(1,4)+M(1,7)+M(1,9)+M(1,10) ,2)
LET M(1,13)=MOD( M(1,1)+M(1,3)+M(1,4)+M(1,6)+M(1,8)+M(1,10) ,2)
LET M(1,14)=MOD( M(1,2)+M(1,3)+M(1,4)+M(1,5)+M(1,8)+M(1,9) ,2)
!-----エラー・ビットを、順番に置いてみる。0:エラー無しから1~14まで
FOR j=0 TO 14
CALL error(j)
NEXT j
SUB error(j)
PRINT "-------------------------------------"
PRINT "原形のメッセージ・データー"
MAT PRINT M;
IF j<>0 THEN
LET back=M(1,j)
PRINT "左から";j;"番目のビットが、反転すると"
IF M(1,j)=1 THEN LET M(1,j)=0 ELSE LET M(1,j)=1
ELSE
PRINT "全ビット反転なければ、"
END IF
MAT PRINT M;
!---
CALL check
!---
PRINT "チェック・データーも";bcc(1,1)*8+bcc(1,2)*4+bcc(1,3)*2+bcc(1,4);"になる。2進数"
MAT PRINT bcc;
IF j<>0 THEN LET M(1,j)=back !元へ戻す
END SUB
SUB check
MAT bcc=M*h
FOR i=1 TO 4
LET bcc(1,i)=MOD( bcc(1,i), 2)
NEXT i
END SUB
END
!(※注)
! 書物の、2^(m:冗長ビット) >= (n:データービット)+(m:冗長ビット)+1 の式からは、
! m=4 の場合、n=11 までとなるが、文中の「!オール1の、15」を使用する事に相当し、
! メッセージ・データーの中に m4+m5+m6+m7+m8+m9+m10+m11=0 の条件が発生する。
! (m:冗長ビット)を越えて、制約が入り、11bit が、自由に選べない結果となった。
! 式の等号は、外すべきではないか?
|
|