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.
52 lines
1.2 KiB
52 lines
1.2 KiB
/* Reed-Solomon encoder |
|
* Copyright 2002, Phil Karn, KA9Q |
|
* May be used under the terms of the GNU Lesser General Public License (LGPL) |
|
*/ |
|
#include <string.h> |
|
|
|
#ifdef FIXED |
|
#include "fixed.h" |
|
#elif defined(BIGSYM) |
|
#include "int.h" |
|
#else |
|
#include "char.h" |
|
#endif |
|
|
|
void ENCODE_RS( |
|
#ifdef FIXED |
|
data_t *data, data_t *bb,int pad){ |
|
#else |
|
void *p,data_t *data, data_t *bb){ |
|
struct rs *rs = (struct rs *)p; |
|
#endif |
|
int i, j; |
|
data_t feedback; |
|
|
|
#ifdef FIXED |
|
/* Check pad parameter for validity */ |
|
if(pad < 0 || pad >= NN) |
|
return; |
|
#endif |
|
|
|
memset(bb,0,NROOTS*sizeof(data_t)); |
|
|
|
for(i=0;i<NN-NROOTS-PAD;i++){ |
|
feedback = INDEX_OF[data[i] ^ bb[0]]; |
|
if(feedback != A0){ /* feedback term is non-zero */ |
|
#ifdef UNNORMALIZED |
|
/* This line is unnecessary when GENPOLY[NROOTS] is unity, as it must |
|
* always be for the polynomials constructed by init_rs() |
|
*/ |
|
feedback = MODNN(NN - GENPOLY[NROOTS] + feedback); |
|
#endif |
|
for(j=1;j<NROOTS;j++) |
|
bb[j] ^= ALPHA_TO[MODNN(feedback + GENPOLY[NROOTS-j])]; |
|
} |
|
/* Shift */ |
|
memmove(&bb[0],&bb[1],sizeof(data_t)*(NROOTS-1)); |
|
if(feedback != A0) |
|
bb[NROOTS-1] = ALPHA_TO[MODNN(feedback + GENPOLY[0])]; |
|
else |
|
bb[NROOTS-1] = 0; |
|
} |
|
}
|
|
|