GNU Radio's DAB Package
init_rs.h
Go to the documentation of this file.
1/* Common code for intializing a Reed-Solomon control block (char or int symbols)
2 * Copyright 2004 Phil Karn, KA9Q
3 * May be used under the terms of the GNU Lesser General Public License (LGPL)
4 */
5
6{
7 int i, j, sr,root,iprim;
8
10 /* Check parameter ranges */
11 if(symsize < 0 || symsize > 8*sizeof(data_t)){
12 goto done;
13 }
14
15 if(fcr < 0 || fcr >= (1<<symsize))
16 goto done;
17 if(prim <= 0 || prim >= (1<<symsize))
18 goto done;
19 if(nroots < 0 || nroots >= (1<<symsize))
20 goto done; /* Can't have more roots than symbol values! */
21 if(pad < 0 || pad >= ((1<<symsize) -1 - nroots))
22 goto done; /* Too much padding */
23
24 rs = (struct rs *)calloc(1,sizeof(struct rs));
25 if(rs == NULL)
26 goto done;
27
28 rs->mm = symsize;
29 rs->nn = (1<<symsize)-1;
31
32 rs->alpha_to = (data_t *)malloc(sizeof(data_t)*(rs->nn+1));
33 if(rs->alpha_to == NULL){
34 free(rs);
35 rs = NULL;
36 goto done;
37 }
38 rs->index_of = (data_t *)malloc(sizeof(data_t)*(rs->nn+1));
39 if(rs->index_of == NULL){
40 free(rs->alpha_to);
41 free(rs);
42 rs = NULL;
43 goto done;
44 }
45
46 /* Generate Galois field lookup tables */
47 rs->index_of[0] = A0; /* log(zero) = -inf */
48 rs->alpha_to[A0] = 0; /* alpha**-inf = 0 */
49 sr = 1;
50 for(i=0;i<rs->nn;i++){
51 rs->index_of[sr] = i;
52 rs->alpha_to[i] = sr;
53 sr <<= 1;
54 if(sr & (1<<symsize))
55 sr ^= gfpoly;
56 sr &= rs->nn;
57 }
58 if(sr != 1){
59 /* field generator polynomial is not primitive! */
60 free(rs->alpha_to);
61 free(rs->index_of);
62 free(rs);
63 rs = NULL;
64 goto done;
65 }
66
67 /* Form RS code generator polynomial from its roots */
68 rs->genpoly = (data_t *)malloc(sizeof(data_t)*(nroots+1));
69 if(rs->genpoly == NULL){
70 free(rs->alpha_to);
71 free(rs->index_of);
72 free(rs);
73 rs = NULL;
74 goto done;
75 }
79
80 /* Find prim-th root of 1, used in decoding */
81 for(iprim=1;(iprim % prim) != 0;iprim += rs->nn)
82 ;
84
85 rs->genpoly[0] = 1;
86 for (i = 0,root=fcr*prim; i < nroots; i++,root += prim) {
87 rs->genpoly[i+1] = 1;
88
89 /* Multiply rs->genpoly[] by @**(root + x) */
90 for (j = i; j > 0; j--){
91 if (rs->genpoly[j] != 0)
93 else
94 rs->genpoly[j] = rs->genpoly[j-1];
95 }
96 /* rs->genpoly[0] can never be zero */
98 }
99 /* convert rs->genpoly[] to index form for quicker encoding */
100 for (i = 0; i <= nroots; i++)
101 rs->genpoly[i] = rs->index_of[rs->genpoly[i]];
102 done:;
103
104}
#define A0
Definition char.h:20
unsigned char data_t
Definition char.h:6
#define NULL
Definition decode_rs.h:63
int j
Definition decode_rs.h:73
int i
Definition decode_rs.h:73
data_t root[NROOTS]
Definition decode_rs.h:78
rs pad
Definition init_rs.h:30
sr
Definition init_rs.h:49
rs nroots
Definition init_rs.h:78
rs fcr
Definition init_rs.h:76
rs prim
Definition init_rs.h:77
rs iprim
Definition init_rs.h:83
static int modnn(struct rs *rs, int x)
Definition rs-common.h:20
Definition rs-common.h:7
int nn
Definition rs-common.h:9
int nroots
Definition rs-common.h:13
int iprim
Definition rs-common.h:16
data_t * genpoly
Definition rs-common.h:12
data_t * index_of
Definition rs-common.h:11
int fcr
Definition rs-common.h:14
int mm
Definition rs-common.h:8
int pad
Definition rs-common.h:17
int prim
Definition rs-common.h:15
data_t * alpha_to
Definition rs-common.h:10