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)]);