Hamming Code, その2
Matlabのcommunication toolboxには、Hamming codeのencode, decodeを行う関数が用意されています。符号化のやり方の中身まで知る必要がない場合は、この関数を使う方が早そうです。参考リンク encode, decode, biterr, randerr
clear all; rand('state', 123); numData=40; M=5; N=2^M-1; K=N-M; %% Add zero or one bit error -- should be corrected msg = randint(numData, K, [0, 1]); code = encode(msg, N, K, 'hamming/binary'); err = randerr(numData, N, [0, 1; 0.2, 0.8;]); noisycode = mod(code + err, 2); dec_msg = decode(noisycode, N, K, 'hamming/binary'); [numError, BER] = biterr(dec_msg, msg); disp(['BER num2str is ', num2str(BER)]); %% Add zero or one or two bits error -- two bits error can't be corrected. err = randerr(numData, N, [0, 1, 2; 0.2, 0.7, 0.1;]); noisycode = mod(code + err, 2); dec_msg = decode(noisycode, N, K, 'hamming/binary'); [numError, BER] = biterr(dec_msg, msg); disp(['BER num2str is ', num2str(BER)]);
Communication toolboxには、これ以外にもHamming Codeの生成行列を作成するhammgenという関数もあります。この関数を使ったプログラムに書き換えて見ました。参考リンク hammgen gfprimdf gen2par Galois field demo
clear all; rand('state', 123); numData=40; M=6; [H,G, N, K] = hammgen(M); G = flipud(fliplr(G)); H = flipud(fliplr(H)); GenPol=gfprimdf(M); % Coding and Decoding msg = randint(numData, K, [0, 1]); coded_msg = mod(msg*G, 2); err=randerr(numData, N, [0, 1; 0.2, 0.8;]); rcv_msg = mod(coded_msg + err, 2); err_syndrome = mod(rcv_msg*H', 2); for ii=[1:numData] % Find error location ShiftReg=zeros(1, M); ShiftReg=fliplr(err_syndrome(ii,:)); % Shift N times for i=1:N ShiftReg_next(1)=xor(0, GenPol(1)*ShiftReg(M)); for j=2:M ShiftReg_next(j) = xor(ShiftReg(j-1), GenPol(j)*ShiftReg(M)); end ShiftReg = ShiftReg_next; err_location(i)=ShiftReg(1)&(~any(ShiftReg(2:end))); end % Add correction fixed_msg = rcv_msg(ii,:); fixed_msg(err_location) = ~fixed_msg(err_location); fixed_msg_buf(ii,:)=fixed_msg(1:K); end [numError, BER] = biterr(msg, fixed_msg_buf); disp(['BER num2str is ', num2str(BER)]);