fun_ofdm  1.0
802.11a Physical Layer for USRP
 All Classes Namespaces Files Functions Variables Enumerations Enumerator Macros Pages
interleaver.h
Go to the documentation of this file.
1 
11 #ifndef INTERLEAVER_H
12 #define INTERLEAVER_H
13 
14 #include <stdlib.h>
15 #include <vector>
16 #include <cassert>
17 
18 #include "rates.h"
19 
20 namespace fun
21 {
22 
32  {
33  public:
34 
40  static std::vector<unsigned char> interleave(std::vector<unsigned char> data);
41 
47  static std::vector<unsigned char> deinterleave(std::vector<unsigned char> data);
48 
49  };
50 
56  struct BitInterleave {
57  unsigned int d_bpsc; // coded bits per subcarrier
58  unsigned int d_cbps; // coded bits per symbol
59  static const int d_num_chunks = 16;
60 
61  BitInterleave(int ncarriers, int nbits) :
62  d_bpsc(nbits),
63  d_cbps(nbits * ncarriers)
64  {}
65 
66  unsigned int index(unsigned int k)
67  {
68  // see 17.3.5.6 in 802.11a-1999, floor is implicit
69  assert (k < d_cbps);
70  unsigned int s = std::max(d_bpsc / 2, (unsigned int)1);
71  unsigned int i = (d_cbps / d_num_chunks) * (k % d_num_chunks) + (k / d_num_chunks);
72  unsigned int j = s * (i / s) + (i + d_cbps - (d_num_chunks * i / d_cbps)) % s;
73  assert (j < d_cbps);
74  return j;
75  }
76 
77  void fill(std::vector<unsigned int> &v, bool inverse)
78  {
79  v.resize(d_cbps);
80  if (!inverse)
81  {
82  for (unsigned int i = 0; i < d_cbps; ++i)
83  {
84  v[i] = index(i);
85  }
86  }
87  else
88  {
89  for (unsigned int i = 0; i < d_cbps; ++i)
90  {
91  v[index(i)] = i;
92  }
93  }
94  }
95  };
96 }
97 
98 
99 #endif // INTERLEAVER_H