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.
198 lines
7.6 KiB
198 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. |
|
|
|
|