]> Creatis software - CreaPhase.git/blobdiff - octave_packages/communications-1.1.1/gfweight.m
Add a useful package (from Source forge) for octave
[CreaPhase.git] / octave_packages / communications-1.1.1 / gfweight.m
diff --git a/octave_packages/communications-1.1.1/gfweight.m b/octave_packages/communications-1.1.1/gfweight.m
new file mode 100644 (file)
index 0000000..f3ea95c
--- /dev/null
@@ -0,0 +1,78 @@
+## Copyright (C) 2003 David Bateman
+##
+## 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{w} = } gfweight (@var{gen})
+## @deftypefnx {Function File} {@var{w} = } gfweight (@var{gen},'gen')
+## @deftypefnx {Function File} {@var{w} = } gfweight (@var{par},'par')
+## @deftypefnx {Function File} {@var{w} = } gfweight (@var{p},n)
+##
+## Calculate the minimum weight or distance of a linear block code. The
+## code can be either defined by its generator or parity check matrix, or
+## its generator polynomial. By default if the first argument is a matrix,
+## it is assumed to be the generator matrix of the code. The type of the
+## matrix can be defined by a flag 'gen' for the generator matrix or
+## 'par' for the parity check matrix.
+##
+## If the first argument is a vector, it is assumed that it defines the
+## generator polynomial of the code. In this case a second argument is
+## required that defines the codeword length.
+##
+## @end deftypefn
+## @seealso{hammgen,cyclpoly,bchpoly}
+
+function w = gfweight (arg1, arg2)
+
+  if ((nargin < 1) || (nargin > 2))
+    usage ("gfweight(mat,typ) or gfweight(poly,n)");
+  endif
+
+  if (isvector(arg1))
+    if (nargin != 2)
+      error ("gfweight: need the codeword length if passing generator polynomial");
+    endif
+    [ign, gen] = cyclgen(arg2, arg1);
+  elseif (ismatrix(arg1))
+    if (nargin == 2)
+      if (ischar(arg2))
+       if (strcmp(arg2,"gen"))
+         gen = arg1;
+       elseif (strcmp(arg2,"par"))
+         gen = gen2par(arg1);
+       else
+         error ("gfweight: unrecognized string argument");
+       endif
+      else
+       error ("gfweight: if first argument is a matrix, the second must be a string");
+      endif
+    else
+      gen = arg1;
+    endif
+  else
+    error ("gfweight: first argument must be a matrix or a vector");
+  endif
+
+  [k, n] = size(gen);
+  if (n < k)
+    error ("gfweight: generator matrix in an illegal form");
+  endif
+
+  ## We only need to test codewords 1:2^k-1 against the zero code word
+  ## We do the equivalent of 
+  ## w = min(sum((mod(de2bi([1:2^k-1]') * gen, 2))'));
+  ## But in a more memory efficient manner in an oct-file
+  w = __gfweight__(gen);
+
+endfunction