Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
REED-SOLOMON(3) 	    Library Functions Manual		 REED-SOLOMON(3)

NAME
     init_rs_int,  encode_rs_int,  decode_rs_int, free_rs_int, init_rs_char, en-
     code_rs_char, decode_rs_char, free_rs_char, encode_rs_8,  decode_rs_8,  en-
     code_rs_ccsds, decode_rs_ccsds - Reed-Solomon encoding/decoding

SYNOPSIS
     #include "rs.h"

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

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

     int decode_rs_int(void *rs,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 func-
     tions are supplied. To access these functions, add "-lrs"	to  your  linker
     command line.

     The functions with names ending in _int handle data in integer arrays, per-
     mitting 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 pro-
     vided. These functions use two lookup tables, Taltab to convert  from  con-
     ventional	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  appro-
     priate. 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 prim-
     itive; 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 polyno-
     mial. 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 us-
     ing the specified code.  The input data array is expected to contain K sym-
     bols (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 sym-
     bol 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  sym-
     bols  in  error.  If  the codeword is uncorrectable, -1 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 ele-
     ments to prevent a possible buffer overflow.

     The free_rs_int and free_rs_char functions free the  internal  space  allo-
     cated 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 struc-
     ture that must be passed to the corresponding encode, decode and free func-
     tions. These functions return NULL on error.

     The decode_ functions return a count of corrected symbols,  or  -1  if  the
     block was uncorrectible.

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	2002,  Phil  Karn,  KA9Q. May be used under the terms of the GNU
     General Public License (GPL).

SEE ALSO
     CCSDS  101.0-B-5:	Telemetry  Channel  Coding.   http://www.ccsds.org/docu-
     ments/pdf/CCSDS-101.0-B-5.pdf

NOTE
     CCSDS  chose  the	"dual basis" symbol representation because it simplified
     the implementation of a Reed-Solomon encoder in  dedicated  hardware.  How-
     ever,  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)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=rs&sektion=3&manpath=FreeBSD+Ports+15.1.quarterly>

home | help