49 int N = connections.size() - 1;
50 memory.set_size(N,
true);
51 Connections = connections.right(N);
56 bvec temp =
oct2bin(connections);
57 int N = temp.size() - 1;
58 memory.set_size(N,
true);
59 Connections = temp.right(N);
64 it_assert(state.length() == memory.size(),
"LFSR::set_state(): dimension mismatch");
71 it_assert(temp.length() >= memory.size(),
"LFSR::set_state(): dimension mismatch");
72 memory = temp.right(memory.size());
77 it_assert(no_shifts > 0,
"LFSR::shift(): shift must be positive");
79 for (
int i = 0;i < no_shifts;i++) {
88 bvec mseq1_connections, mseq2_connections;
91 mseq1_connections = bvec(
"1 0 1 0 0 1");
92 mseq2_connections = bvec(
"1 0 1 1 1 1");
95 mseq1_connections = bvec(
"1 0 0 1 0 0 0 1");
96 mseq2_connections = bvec(
"1 1 1 1 0 0 0 1");
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");
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");
107 it_error(
"This degree of Gold sequence is not available");
109 mseq1.set_connections(mseq1_connections);
110 mseq2.set_connections(mseq2_connections);
111 N =
pow2i(mseq1.get_length()) - 1;
114 Gold::Gold(
const bvec &mseq1_connections,
const bvec &mseq2_connections)
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;
122 Gold::Gold(
const ivec &mseq1_connections,
const ivec &mseq2_connections)
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;
132 mseq1.set_state(state1);
133 mseq2.set_state(state2);
138 mseq1.set_state(state1);
139 mseq2.set_state(state2);
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++) {
154 bmat codes(N + 2, N);
155 bvec temp =
dec2bin(mseq1.get_length(), 1);
159 codes.
set_row(0, mseq1.shift(N));
160 codes.
set_row(1, mseq2.shift(N));
162 for (
int i = 0;i < N;i++) {
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");
174 codes(0, 0) = short(1);
178 smat prev_codes(SF / 2, 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))));
Definitions of binary sequence classes and functions.
bin shift(void)
Shift one step and output binary symbol.
Gold(int degree)
Class constructor.
#define it_assert(t, s)
Abort if t is not true.
Logarithmic and exponenential functions - header file.
Vec< Num_T > get_row(int r) const
Get row r.
Definitions of converters between different vector and matrix types.
bin shift(void)
Shift one step and output binary symbol.
int pow2i(int x)
Calculate two to the power of x (2^x); x is integer.
void set_row(int r, const Vec< Num_T > &v)
Set row r to vector v.
smat wcdma_spreading_codes(int SF)
Generates the OVSF (orthogonal variable spreading factor) spreading codes used in WCDMA...
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.
#define it_error(s)
Abort unconditionally.
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.
void set_state(const bvec &state)
Set state (contents in the shift registers) in bvec format.
void set_connections(const bvec &connections)
Input connect_polynomial=1+g1*D+g2*D^2+...+gr*D^r in bvec format [g0,g1,...,gr].
const Array< T > concat(const Array< T > &a, const T &e)
Append element e to the end of the Array a.