gr-satnogs/lib/libfec/encode_rs.c

59 lines
1.3 KiB
C

/* 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;
}
}
}