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 
9  rs = NULL;
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;
30  rs->pad = pad;
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  }
76  rs->fcr = fcr;
77  rs->prim = prim;
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)
92  rs->genpoly[j] = rs->genpoly[j-1] ^ rs->alpha_to[modnn(rs,rs->index_of[rs->genpoly[j]] + root)];
93  else
94  rs->genpoly[j] = rs->genpoly[j-1];
95  }
96  /* rs->genpoly[0] can never be zero */
97  rs->genpoly[0] = rs->alpha_to[modnn(rs,rs->index_of[rs->genpoly[0]] + root)];
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 }
rs nroots
Definition: init_rs.h:78
int i
Definition: decode_rs.h:71
int j
Definition: decode_rs.h:71
Definition: rs-common.h:7
int iprim
Definition: rs-common.h:16
int fcr
Definition: rs-common.h:14
data_t root[NROOTS]
Definition: decode_rs.h:78
int nn
Definition: rs-common.h:9
data_t * genpoly
Definition: rs-common.h:12
#define NULL
Definition: decode_rs.h:63
data_t * alpha_to
Definition: rs-common.h:10
int nroots
Definition: rs-common.h:13
#define A0
Definition: char.h:20
int prim
Definition: rs-common.h:15
rs pad
Definition: init_rs.h:30
rs fcr
Definition: init_rs.h:76
data_t * index_of
Definition: rs-common.h:11
rs prim
Definition: init_rs.h:77
sr
Definition: init_rs.h:49
static int modnn(struct rs *rs, int x)
Definition: rs-common.h:20
unsigned char data_t
Definition: char.h:6
int pad
Definition: rs-common.h:17
int mm
Definition: rs-common.h:8
rs iprim
Definition: init_rs.h:83