You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
199 lines
7.6 KiB
199 lines
7.6 KiB
.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.
|
|
|