.TH REED-SOLOMON 3
.SH 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
.SH SYNOPSIS
.nf
.ft B
#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,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];

.fi

.SH 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 \fB_int\fR handle data in integer arrays,
permitting arbitrarily large codewords limited only by machine
resources.

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

\fBencode_rs_8\fR and \fBdecode_rs_8\fR 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, \fInot\fR the dual-basis specified in
the CCSDS standard, to represent symbols. This code may be
shortened by giving a non-zero \fBpad\fR value to produce a
(255-\fBpad\fR,223-\fBpad\fR) code. The padding will consist of the
specified number of zeroes at the front of the full codeword.

For full CCSDS compatibility, \fBencode_rs_ccsds\fR and
\fBdecode_rs_ccsds\fR are provided. These functions use two lookup
tables, \fBTaltab\fR to convert from conventional to dual-basis, and
\fBTal1tab\fR to perform the inverse mapping from dual-basis to
conventional form, before and after calls to \fBencode_rs_8\fR
and \fBdecode_rs_8\fR.

The \fB_8\fR and \fB_ccsds\fR functions do not require initialization.

To use the general purpose RS encoder or decoder (i.e.,
the \fB_char\fR or \fB_int\fR versions), the user must first
call \fBinit_rs_int\fR or \fBinit_rs_char\fR as appropriate. The
arguments are as follows:

\fBsymsize\fR gives the symbol size in bits, up to 8 for \fBinit_rs_char\fR
or 32 for \fBinit_rs_int\fR 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^\fBsymsize\fR - 1 symbols,
each containing \fBsymsize\fR bits. The codeword may be shortened with the
\fBpad\fR parameter described below.

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

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

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

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

\fBpad\fR 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^\fBsymsize\fR - \fBpad\fR - 1 and K = N-\fBnroots\fR.

The \fBencode_rs_char\fR and \fBencode_rs_int\fR functions accept
the pointer returned by \fBinit_rs_char\fR or
\fBinit_rs_int\fR, respectively, to
encode a block of data using the specified code.
The input data array is expected to
contain K symbols (of \fBsymsize\fR bits each, right justified
in each char or int) and \fBnroots\fR parity symbols will be placed
into the \fBparity\fR array, right justified.

The \fBdecode_\fR 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 \fBeras_pos\fR
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 \fBno_eras\fR
parameter.

To maximize performance, the encode and decode functions perform no
"sanity checking" of their inputs. Decoder failure may result if
\fBeras_pos\fR 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 \fB_8\fR or
\fB_ccsds\fR functions,
or with the \fB_char\fR 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, -1 is returned
and the data block is unchanged. If \fBeras_pos\fR 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 \fImust\fR have at least \fBnroots\fR
elements to prevent a possible buffer overflow.

The \fBfree_rs_int\fR and \fBfree_rs_char\fR functions free the internal
space allocated by the \fBinit_rs_int\fR and \fBinit_rs_char\fR functions,
respecitively.

The functions \fBencode_rs_8\fR and \fBdecode_rs_8\fR do not have
corresponding \fBinit\fR and \fBfree\fR, nor do they take the
\fBrs\fR argument accepted by the other functions as their parameters
are statically compiled. These functions implement a code
equivalent to calling

\fBinit_rs_char\fR(8,0x187,112,11,32,pad);

and using the resulting pointer with \fBencode_rs_char\fR and
\fBdecode_rs_char\fR.

.SH RETURN VALUES
\fBinit_rs_int\fR and \fBinit_rs_char\fR 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 \fBdecode_\fR functions return a count of corrected
symbols, or -1 if the block was uncorrectible.

.SH 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).

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

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

.SH 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 \fBencode_rs_8\fR
and \fBdecode_rs_8\fR.

