Provided by: libfec-dev_1.0-26-gc5d935f-1_amd64 bug

NAME

       init_rs_int,  encode_rs_int,  decode_rs_int,  free_rs_int,  init_rs_char, encode_rs_char, decode_rs_char,
       free_rs_char, encode_rs_8, decode_rs_8, encode_rs_ccsds, decode_rs_ccsds - Reed-Solomon encoding/decoding

SYNOPSIS

       #include "fec.h"

       void *init_rs_int(int symsize,int gfpoly,int fcr,int prim,
            int nroots,int pad);

       void encode_rs_int(void *rs,unsigned int *data,unsigned int *parity);

       int decode_rs_int(void *rs,unsigned int *data,int *eras_pos,int no_eras);

       void free_rs_int(void *rs);

       void *init_rs_char(int symsize,int gfpoly,int fcr,int prim,
            int nroots,int pad);

       void encode_rs_char(void *rs,unsigned char *data,
            unsigned char *parity);

       int decode_rs_char(void *rs,unsigned char *data,int *eras_pos,
            int no_eras);

       void free_rs_char(void *rs);

       void encode_rs_8(unsigned char *data,unsigned char *parity,
            int pad);

       int decode_rs_8(unsigned char *data,int *eras_pos,int no_eras,
            int pad);

       void encode_rs_ccsds(unsigned char *data,unsigned char *parity,
            int pad);

       int decode_rs_ccsds(unsigned char *data,int *eras_pos,int no_eras,
            int pad);

       unsigned char Taltab[256];
       unsigned char Tal1tab[256];

DESCRIPTION

       These functions implement Reed-Solomon error control encoding and decoding. For optimal performance in  a
       variety  of applications, three sets of functions are supplied. To access these functions, add "-lfec" to
       your linker command line.

       The functions with names ending in _int handle data in unsigned integer  arrays,  permitting  arbitrarily
       large codewords limited only by machine resources.

       The functions with names ending in _char take unsigned char arrays and can handle codes with symbols of 8
       bits or less (i.e., with codewords of 255 symbols or less).

       encode_rs_8 and decode_rs_8 implement a specific (255,223) code  with  8-bit  symbols  specified  by  the
       CCSDS:  a  field  generator of 1 + X + X^2 + X^7 + X^8 and a code generator with first consecutive root =
       112 and a primitive element of 11. These functions use the conventional polynomial form,  not  the  dual-
       basis  specified in the CCSDS standard, to represent symbols. This code may be shortened by giving a non-
       zero pad value to produce a (255-pad,223-pad) code. The padding will consist of the specified  number  of
       zeroes at the front of the full codeword.

       For  full  CCSDS compatibility, encode_rs_ccsds and decode_rs_ccsds are provided. These functions use two
       lookup tables, Taltab to convert from conventional to dual-basis, and  Tal1tab  to  perform  the  inverse
       mapping from dual-basis to conventional form, before and after calls to encode_rs_8 and decode_rs_8.

       The _8 and _ccsds functions do not require initialization.

       To  use the general purpose RS encoder or decoder (i.e., the _char or _int versions), the user must first
       call init_rs_int or init_rs_char as appropriate. The arguments are as follows:

       symsize gives the symbol size in bits, up to 8 for init_rs_char or 32 for init_rs_int on a  machine  with
       32-bit  ints  (though  such  a  huge code would exhaust memory limits on a 32-bit machine). The resulting
       Reed-Solomon code word will have 2^symsize - 1 symbols, each containing symsize bits. The codeword may be
       shortened with the pad parameter described below.

       gfpoly gives the extended Galois field generator polynomial coefficients, with the 0th coefficient in the
       low order bit. The polynomial must be primitive; if not, the call will fail and NULL will be returned.

       fcr gives, in index form, the first consecutive root of the Reed Solomon code generator polynomial.

       prim gives, in index form, the primitive element in the Galois field used to generate  the  Reed  Solomon
       code generator polynomial.

       nroots gives the number of roots in the Reed Solomon code generator polynomial. This equals the number of
       parity symbols per code block.

       pad gives the number of leading symbols in the codeword that are implicitly padded to zero in a shortened
       code block.

       The resulting Reed-Solomon code has parameters (N,K), where N = 2^symsize - pad - 1 and K = N-nroots.

       The   encode_rs_char  and  encode_rs_int  functions  accept  the  pointer  returned  by  init_rs_char  or
       init_rs_int, respectively, to encode a block of data using the specified code.  The input data  array  is
       expected  to  contain  K  symbols  (of symsize bits each, right justified in each char or int) and nroots
       parity symbols will be placed into the parity array, right justified.

       The decode_ functions correct the errors in a Reed-Solomon codeword of N symbols up to the capability  of
       the  code.   An optional list of "erased" symbol indices may be given in the eras_pos array to assist the
       decoder; this parameter may be NULL if no erasures are given. The number of erased symbols must be  given
       in the no_eras parameter.

       To  maximize  performance,  the encode and decode functions perform no "sanity checking" of their inputs.
       Decoder failure may result if eras_pos contains duplicate entries, and both encoder and decoder will fail
       if  an  input  symbol  exceeds  its  allowable range.  (Symbol range overflow cannot occur with the _8 or
       _ccsds functions, or with the _char functions when 8-bit symbols are specified.)

       The decoder corrects the symbols "in place", returning the number of symbols in error. If the codeword is
       uncorrectable,  then  a negative number is returned and the data block is unchanged.  If eras_pos is non-
       null, it is used to return a list of corrected symbol positions, in no particular order.  This means that
       the  array  passed through this parameter must have at least nroots elements to prevent a possible buffer
       overflow.

       The free_rs_int and free_rs_char functions free the internal  space  allocated  by  the  init_rs_int  and
       init_rs_char functions, respecitively.

       The  functions  encode_rs_8 and decode_rs_8 do not have corresponding init and free, nor do they take the
       rs argument accepted by the other functions as their parameters are statically compiled. These  functions
       implement a code equivalent to calling

       init_rs_char(8,0x187,112,11,32,pad);

       and using the resulting pointer with encode_rs_char and decode_rs_char.

RETURN VALUES

       init_rs_int and init_rs_char return a pointer to an internal control structure that must be passed to the
       corresponding encode, decode and free functions. These functions return NULL on error.

       The decode_ functions return a count of corrected  symbols,  or  a  negative  number  if  the  block  was
       uncorrectible.   Note  that  "erased"  symbols do not count as corrected symbols unless the symbol at the
       erased position was corrupted.

AUTHOR

       Phil  Karn,  KA9Q  (karn@ka9q.net),  based  heavily  on   earlier   work   by   Robert   Morelos-Zaragoza
       (robert@spectra.eng.hawaii.edu)  and Hari Thirumoorthy (harit@spectra.eng.hawaii.edu). Extra improvements
       suggested by Detmar Welz (dwelz@web.de).

COPYRIGHT

       Copyright 2004, Phil Karn, KA9Q. May be used under the terms of the GNU  Lesser  General  Public  License
       (LGPL).

SEE ALSO

       CCSDS 101.0-B-6: Telemetry Channel Coding.  http://www.ccsds.org/documents/101x0b6.pdf

NOTE

       CCSDS  chose  the  "dual basis" symbol representation because it simplified the implementation of a Reed-
       Solomon encoder in dedicated hardware.  However,  this  approach  holds  no  advantages  for  a  software
       implementation  on  a  general  purpose  computer,  so  use  of  the  dual  basis  is recommended only if
       compatibility with the CCSDS standard is needed, e.g., to decode data from an existing  spacecraft  using
       the  CCSDS  standard.  If  you just want a fast (255,223) RS codec without needing to interoperate with a
       CCSDS standard code, use encode_rs_8 and decode_rs_8.

                                                                                                 REED-SOLOMON(3)