view main/comm/inst/egolaydec.m @ 10707:2d15bf604652 octave-forge

egolaydec/egolayenc: use egolaygen and avoid repeating code
author carandraug
date Tue, 21 Aug 2012 01:12:21 +0000
parents 8f1434f40544
children
line wrap: on
line source

## Copyright (C) 2007 Muthiah Annamalai <muthiah.annamalai@uta.edu>
##
## This program is free software; you can redistribute it and/or modify it under
## the terms of the GNU General Public License as published by the Free Software
## Foundation; either version 3 of the License, or (at your option) any later
## version.
##
## This program is distributed in the hope that it will be useful, but WITHOUT
## ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
## FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
## details.
##
## You should have received a copy of the GNU General Public License along with
## this program; if not, see <http://www.gnu.org/licenses/>.

## -*- texinfo -*-
## @deftypefn {Function File} {[@var{C}, @var{err}] =} egolaydec (@var{R})
## Decode Extended Golay code.
## 
## Given @var{R}, the received Extended Golay code, this function tries to
## decode it using the Extended Golay code parity check matrix.
## Extended Golay code (24,12) which can correct up to 3 errors.
##
## The received code @var{R}, needs to be of length Nx24, for encoding. We can
## decode several codes at once, if they are stacked as a matrix of 24 columns,
## each code in a separate row.
##
## The generator used in here is same as obtained from the function
## @code{egolaygen}.
##
## The function returns @var{C}, the error-corrected code word from the received
## word. If decoding failed, @var{err} value is 1, otherwise it is 0.
## 
## Extended Golay code (24,12) which can correct up to 3
## errors. Decoding algorithm follows from Lin & Costello.
## 
## Ref: Lin & Costello, pg 128, Ch4, 'Error Control Coding', 2nd ed, Pearson.
##
## @example
## @group
##  M=[rand(10,12)>0.5];
##  C1=egolayenc(M); 
##  C1(:,1)=mod(C1(:,1)+1,2)
##  C2=egolaydec(C1)
## @end group
## @end example
##
## @seealso{egolaygen,egolayenc}
## @end deftypefn

function [C, dec_error] = egolaydec (R)

  if (nargin != 1)
    print_usage;
  elseif (columns (R) != 24)
    error ("extended golay code is (24,12), use rx codeword of 24 bit column size");
  endif

  dec_error = [];
  [~, P] = egolaygen ();
  H      = [eye(12); P]; # parity check matrix transpose
  C      = zeros (size (R));

  for rspn = 1:rows (R)
    RR   = R(rspn,:);
    S    = mod (RR*H, 2);
    wt   = sum (S);
    done = 0;
    E    = [S, zeros(1, 12)];
    if (wt <= 3)
      E    = [S, zeros(1, 12)];
      done = 1;
    else
      SP  = mod (repmat (S, [12, 1]) + P, 2);
      idx = find (sum (SP, 2) <= 2);
      if (idx)
        idx  = idx(1); %pick first of matches.
        Ui   = zeros (1, 12);
        Ui(idx) = 1;
        E    = [SP(idx, :), Ui];
        done = 1;
      endif
    endif

    if (!done)
      X  = mod (S*P, 2);
      wt = sum (X);
      if (wt==2 || wt==3)
        E    = [zeros(1, 12), X];
        done = 1;
      else
        SP  = mod (repmat(X, [12, 1]) + P, 2);
        idx = find (sum(SP, 2) == 2);
        if (idx)
          idx  = idx(1);
          Ui   = zeros (1, 12);
          Ui(idx) = 1;
          E    = [Ui, SP(idx, :)];
          done = 1;
        endif
      endif
    endif

    dec_error  = [dec_error; 1-done];
    C(rspn, :) = mod (E+RR, 2);
  endfor

endfunction

%!assert(egolaydec([1 1 1 zeros(1,21)]),zeros(1,24))
%!assert(egolaydec([1 0 1 zeros(1,20) 1]),zeros(1,24))