IT++ Logo
sequence.cpp
Go to the documentation of this file.
1 
29 #include <itpp/comm/sequence.h>
30 #include <itpp/base/converters.h>
31 #include <itpp/base/math/log_exp.h>
32 
33 
34 namespace itpp
35 {
36 
37 LFSR::LFSR(const bvec &connections)
38 {
39  set_connections(connections);
40 }
41 
42 LFSR::LFSR(const ivec &connections)
43 {
44  set_connections(connections);
45 }
46 
47 void LFSR::set_connections(const bvec &connections)
48 {
49  int N = connections.size() - 1;
50  memory.set_size(N, true); // Should this be true???
51  Connections = connections.right(N);
52 }
53 
54 void LFSR::set_connections(const ivec &connections)
55 {
56  bvec temp = oct2bin(connections);
57  int N = temp.size() - 1;
58  memory.set_size(N, true); // Should this be true???
59  Connections = temp.right(N);
60 }
61 
62 void LFSR::set_state(const bvec &state)
63 {
64  it_assert(state.length() == memory.size(), "LFSR::set_state(): dimension mismatch");
65  memory = state;
66 }
67 
68 void LFSR::set_state(const ivec &state)
69 {
70  bvec temp = oct2bin(state, 1);
71  it_assert(temp.length() >= memory.size(), "LFSR::set_state(): dimension mismatch");
72  memory = temp.right(memory.size());
73 }
74 
75 bvec LFSR::shift(int no_shifts)
76 {
77  it_assert(no_shifts > 0, "LFSR::shift(): shift must be positive");
78  bvec temp(no_shifts);
79  for (int i = 0;i < no_shifts;i++) {
80  temp(i) = shift();
81  }
82  return temp;
83 }
84 
85 //--------------------------- class Gold -------------------------
86 Gold::Gold(int degree)
87 {
88  bvec mseq1_connections, mseq2_connections;
89  switch (degree) {
90  case 5:
91  mseq1_connections = bvec("1 0 1 0 0 1");
92  mseq2_connections = bvec("1 0 1 1 1 1");
93  break;
94  case 7:
95  mseq1_connections = bvec("1 0 0 1 0 0 0 1");
96  mseq2_connections = bvec("1 1 1 1 0 0 0 1");
97  break;
98  case 8:
99  mseq1_connections = bvec("1 1 1 0 0 1 1 1 1");
100  mseq2_connections = bvec("1 1 0 0 0 0 1 1 1");
101  break;
102  case 9:
103  mseq1_connections = bvec("1 0 0 0 1 0 0 0 0 1");
104  mseq2_connections = bvec("1 0 0 1 1 0 1 0 0 1");
105  break;
106  default:
107  it_error("This degree of Gold sequence is not available");
108  }
109  mseq1.set_connections(mseq1_connections);
110  mseq2.set_connections(mseq2_connections);
111  N = pow2i(mseq1.get_length()) - 1;
112 }
113 
114 Gold::Gold(const bvec &mseq1_connections, const bvec &mseq2_connections)
115 {
116  it_assert(mseq1_connections.size() == mseq2_connections.size(), "Gold::Gold(): dimension mismatch");
117  mseq1.set_connections(mseq1_connections);
118  mseq2.set_connections(mseq2_connections);
119  N = pow2i(mseq1.get_length()) - 1;
120 }
121 
122 Gold::Gold(const ivec &mseq1_connections, const ivec &mseq2_connections)
123 {
124  mseq1.set_connections(mseq1_connections);
125  mseq2.set_connections(mseq2_connections);
126  it_assert(mseq1.get_length() == mseq1.get_length(), "Gold::Gold(): dimension mismatch");
127  N = pow2i(mseq1.get_length()) - 1;
128 }
129 
130 void Gold::set_state(const bvec &state1, const bvec &state2)
131 {
132  mseq1.set_state(state1);
133  mseq2.set_state(state2);
134 }
135 
136 void Gold::set_state(const ivec &state1, const ivec &state2)
137 {
138  mseq1.set_state(state1);
139  mseq2.set_state(state2);
140 }
141 
142 bvec Gold::shift(int no_shifts)
143 {
144  it_assert(no_shifts > 0, "Gold::shift(): shift must be positive");
145  bvec temp(no_shifts);
146  for (int i = 0;i < no_shifts;i++) {
147  temp(i) = shift();
148  }
149  return temp;
150 }
151 
153 {
154  bmat codes(N + 2, N);
155  bvec temp = dec2bin(mseq1.get_length(), 1);
156  set_state(temp, temp);
157 
158  // The two m-seq.
159  codes.set_row(0, mseq1.shift(N));
160  codes.set_row(1, mseq2.shift(N));
161  // The sum of mseq1 and all time shifts of mseq2
162  for (int i = 0;i < N;i++) {
163  codes.set_row(i + 2, codes.get_row(0) + concat((codes.get_row(1)).right(i), (codes.get_row(1)).left(N - i)));
164  }
165  return codes;
166 }
167 
169 {
170  it_assert((SF == 1) || (SF == 2) || (SF == 4) || (SF == 8) || (SF == 16) || (SF == 32) || (SF == 64) || (SF == 128) || (SF == 256) || (SF == 512),
171  "wcdma_spreading_codes: SF must equal 1, 2, 4, 8, 16, 32, 64, 128, 256, or 512");
172  smat codes(SF, SF);
173  if (SF == 1) {
174  codes(0, 0) = short(1);
175  }
176  else {
177  int i;
178  smat prev_codes(SF / 2, SF / 2);
179  prev_codes = wcdma_spreading_codes(SF / 2);
180  for (i = 0; i < SF / 2; i++) {
181  codes.set_row(2*i, concat(prev_codes.get_row(i), prev_codes.get_row(i)));
182  codes.set_row(2*i + 1, concat(prev_codes.get_row(i), (-prev_codes.get_row(i))));
183  }
184  }
185  return codes;
186 }
187 
188 } // namespace itpp
Vec< Num_T > get_row(int r) const
Get row r.
Definition: mat.h:852
Definitions of binary sequence classes and functions.
bin shift(void)
Shift one step and output binary symbol.
Definition: sequence.h:129
Gold(int degree)
Class constructor.
Definition: sequence.cpp:86
#define it_assert(t, s)
Abort if t is not true.
Definition: itassert.h:94
Logarithmic and exponenential functions - header file.
Definitions of converters between different vector and matrix types.
bin shift(void)
Shift one step and output binary symbol.
Definition: sequence.h:125
int pow2i(int x)
Calculate two to the power of x (2^x); x is integer.
Definition: log_exp.h:53
void set_row(int r, const Vec< Num_T > &v)
Set row r to vector v.
Definition: mat.h:927
smat wcdma_spreading_codes(int SF)
Generates the OVSF (orthogonal variable spreading factor) spreading codes used in WCDMA...
Definition: sequence.cpp:168
itpp namespace
Definition: itmex.h:36
ITPP_EXPORT bvec dec2bin(int length, int index)
Convert a decimal int index to bvec using length bits in the representation.
bmat get_family(void)
Returns the code family.
Definition: sequence.cpp:152
#define it_error(s)
Abort unconditionally.
Definition: itassert.h:126
int get_length(void)
Return length of shift register.
Definition: sequence.h:126
ITPP_EXPORT bvec oct2bin(const ivec &octalindex, short keepzeros=0)
Convert ivec of octal form to bvec.
void set_state(const bvec &state1, const bvec &state2)
Set state (contents in the shift registers) in bvec format.
Definition: sequence.cpp:130
void set_state(const bvec &state)
Set state (contents in the shift registers) in bvec format.
Definition: sequence.cpp:62
LFSR(void)
Constructor.
Definition: sequence.h:57
void set_connections(const bvec &connections)
Input connect_polynomial=1+g1*D+g2*D^2+...+gr*D^r in bvec format [g0,g1,...,gr].
Definition: sequence.cpp:47
const Array< T > concat(const Array< T > &a, const T &e)
Append element e to the end of the Array a.
Definition: array.h:486
SourceForge Logo

Generated on Sun Apr 10 2022 12:00:00 for IT++ by Doxygen 1.8.14