summaryrefslogtreecommitdiff
path: root/gr-fec
diff options
context:
space:
mode:
authorRon Economos <w6rz@comcast.net>2014-02-07 12:58:05 -0800
committerRon Economos <w6rz@comcast.net>2014-02-07 13:13:21 -0800
commit533d392ef938089e24318a771dcf0b7fa5cadbbf (patch)
tree6f59f9fc04887f4c667732e4b3515d49aeef95ed /gr-fec
parent19d111e2448a58e20ff5c1c80ca69751376b2544 (diff)
Add a lookup table to the encoder inner loop for byte mode only
(used by the ATSC transmitter).
Diffstat (limited to 'gr-fec')
-rw-r--r--gr-fec/lib/reed-solomon/char.h1
-rw-r--r--gr-fec/lib/reed-solomon/encode_rs.c12
-rw-r--r--gr-fec/lib/reed-solomon/init_rs.c23
3 files changed, 36 insertions, 0 deletions
diff --git a/gr-fec/lib/reed-solomon/char.h b/gr-fec/lib/reed-solomon/char.h
index f76ad95cd4..4d3f22e5db 100644
--- a/gr-fec/lib/reed-solomon/char.h
+++ b/gr-fec/lib/reed-solomon/char.h
@@ -19,6 +19,7 @@ struct rs {
unsigned char fcr; /* First consecutive root, index form */
unsigned char prim; /* Primitive element, index form */
unsigned char iprim; /* prim-th root of 1, index form */
+ int *modnn_table; /* modnn lookup table, 512 entries */
};
static inline unsigned int modnn(struct rs *rs, unsigned int x){
diff --git a/gr-fec/lib/reed-solomon/encode_rs.c b/gr-fec/lib/reed-solomon/encode_rs.c
index cd31f32c6e..6a92255b65 100644
--- a/gr-fec/lib/reed-solomon/encode_rs.c
+++ b/gr-fec/lib/reed-solomon/encode_rs.c
@@ -35,12 +35,24 @@ DTYPE *data, DTYPE *bb){
feedback = MODNN(NN - GENPOLY[NROOTS] + feedback);
#endif
for(j=1;j<NROOTS;j++)
+#ifdef FIXED
+ bb[j] ^= ALPHA_TO[MODNN(feedback + GENPOLY[NROOTS-j])];
+#elif defined(BIGSYM)
bb[j] ^= ALPHA_TO[MODNN(feedback + GENPOLY[NROOTS-j])];
+#else
+ bb[j] ^= ALPHA_TO[rs->modnn_table[feedback + GENPOLY[NROOTS-j]]];
+#endif
}
/* Shift */
memmove(&bb[0],&bb[1],sizeof(DTYPE)*(NROOTS-1));
if(feedback != A0)
+#ifdef FIXED
+ bb[NROOTS-1] = ALPHA_TO[MODNN(feedback + GENPOLY[0])];
+#elif defined(BIGSYM)
bb[NROOTS-1] = ALPHA_TO[MODNN(feedback + GENPOLY[0])];
+#else
+ bb[NROOTS-1] = ALPHA_TO[rs->modnn_table[feedback + GENPOLY[0]]];
+#endif
else
bb[NROOTS-1] = 0;
}
diff --git a/gr-fec/lib/reed-solomon/init_rs.c b/gr-fec/lib/reed-solomon/init_rs.c
index f50592b55a..c3d8921616 100644
--- a/gr-fec/lib/reed-solomon/init_rs.c
+++ b/gr-fec/lib/reed-solomon/init_rs.c
@@ -23,6 +23,11 @@ void FREE_RS(void *p){
free(rs->alpha_to);
free(rs->index_of);
free(rs->genpoly);
+#ifdef FIXED
+#elif defined(BIGSYM)
+#else
+ free(rs->modnn_table);
+#endif
free(rs);
}
@@ -120,6 +125,24 @@ void *INIT_RS(unsigned int symsize,unsigned int gfpoly,unsigned fcr,unsigned pri
for (i = 0; i <= nroots; i++)
rs->genpoly[i] = rs->index_of[rs->genpoly[i]];
+#ifdef FIXED
+#elif defined(BIGSYM)
+#else
+ /* Form modnn lookup table */
+ rs->modnn_table = (int *)malloc(sizeof(int)*(2<<((sizeof(unsigned char))*8)));
+ if(rs->modnn_table == NULL){
+ free(rs->genpoly);
+ free(rs->alpha_to);
+ free(rs->index_of);
+ free(rs);
+ return NULL;
+ }
+ for(i = 0; i < (2<<((sizeof(unsigned char))*8)); i++){
+ j = i;
+ rs->modnn_table[i] = modnn(rs,j);
+ }
+#endif
+
#if 0
printf ("genpoly:\n");
for (i = nroots; i >= 0; i--){