summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Rondeau <tom@trondeau.com>2014-03-07 11:39:04 -0500
committerTom Rondeau <tom@trondeau.com>2014-03-07 11:39:04 -0500
commit2a43ac8bc025ed483ebdce06773220bc2de87e23 (patch)
tree27f037c23f2d6eda98169871303c793e3e1a8e1d
parentd5887214025201891879f3b61731bd68250b51d1 (diff)
parent533d392ef938089e24318a771dcf0b7fa5cadbbf (diff)
Merge remote-tracking branch 'drmpeg/rs-optimize'
-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--){