diff options
author | Ron Economos <w6rz@comcast.net> | 2014-02-07 12:58:05 -0800 |
---|---|---|
committer | Ron Economos <w6rz@comcast.net> | 2014-02-07 13:13:21 -0800 |
commit | 533d392ef938089e24318a771dcf0b7fa5cadbbf (patch) | |
tree | 6f59f9fc04887f4c667732e4b3515d49aeef95ed /gr-fec | |
parent | 19d111e2448a58e20ff5c1c80ca69751376b2544 (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.h | 1 | ||||
-rw-r--r-- | gr-fec/lib/reed-solomon/encode_rs.c | 12 | ||||
-rw-r--r-- | gr-fec/lib/reed-solomon/init_rs.c | 23 |
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--){ |