36#include <itpp/itexports.h>
85 int rows, cols, input_length;
131 Vec<T> tempvec, zerostemp;
187 ivec interleaver_sequence;
188 int interleaver_depth, input_length;
208 input_length = input.
length();
209 int steps = (
int)std::ceil(
double(input_length) /
double(rows * cols));
216 for (s = 0; s <
steps; s++) {
217 for (
c = 0;
c < cols;
c++) {
218 for (r = 0; r < rows; r++) {
219 output(s*rows*cols + r*cols +
c) = input(s * rows * cols +
c * rows + r);
226 for (s = 0; s <
steps - 1; s++) {
227 for (
c = 0;
c < cols;
c++) {
228 for (r = 0; r < rows; r++) {
229 output(s*rows*cols + r*cols +
c) = input(s * rows * cols +
c * rows + r);
237 for (
c = 0;
c < cols;
c++) {
238 for (r = 0; r < rows; r++) {
249 interleave(input, output);
264 for (s = 0; s <
steps; s++) {
265 for (r = 0; r < rows; r++) {
266 for (
c = 0;
c < cols;
c++) {
267 output(s*rows*cols +
c*rows + r) = input(s * rows * cols + r * cols +
c);
274 for (s = 0; s <
steps - 1; s++) {
275 for (r = 0; r < rows; r++) {
276 for (
c = 0;
c < cols;
c++) {
277 output(s*rows*cols +
c*rows + r) = input(s * rows * cols + r * cols +
c);
285 for (r = 0; r < rows; r++) {
286 for (
c = 0;
c < cols;
c++) {
292 output.
set_size(input_length,
true);
310 inter_matrix.
set_size(order, order,
false);
318 input_length = input.
length();
319 int steps = (
int)std::ceil(
float(input_length) / order) + order;
324 inter_matrix.clear();
331 for (
c = order - 1;
c > 0;
c--)
332 inter_matrix.set_col(
c, inter_matrix.get_col(
c - 1));
335 if ((
i*order + order) < input_length)
336 tempvec = input.
mid(
i * order, order);
337 else if ((
i*order) < input_length)
338 tempvec =
concat(input.
right(input_length -
i * order), zerostemp.
left(order - (input_length -
i * order)));
341 inter_matrix.set_col(0, tempvec);
344 for (r = 0; r < order; r++)
345 output(
i*order + r) = inter_matrix(r, r);
353 interleave(input, output);
366 inter_matrix.clear();
373 for (
c = order - 1;
c > 0;
c--)
374 inter_matrix.set_col(
c, inter_matrix.get_col(
c - 1));
378 tempvec = input.
mid(
i * order, order);
383 inter_matrix.set_col(0, tempvec);
386 for (r = 0; r < order; r++)
387 output(
i*order + r) = inter_matrix(r, order - 1 - r);
390 output = output.
mid(
round_i(std::pow(
double(order), 2)) - order, input_length);
406 inter_matrix.
set_size(order, order,
false);
432 input_length = input.
length();
433 int steps = (
int)std::ceil(
double(input_length) /
double(interleaver_depth));
441 for (s = 0; s <
steps; s++) {
442 for (
i = 0;
i < interleaver_depth;
i++) {
443 output(s*interleaver_depth +
i) = input(s * interleaver_depth + interleaver_sequence(
i));
451 for (s = 0; s <
steps - 1; s++) {
452 for (
i = 0;
i < interleaver_depth;
i++) {
453 output(s*interleaver_depth +
i) = input(s * interleaver_depth + interleaver_sequence(
i));
460 for (
i = 0;
i < interleaver_depth;
i++) {
471 interleave(input, output);
487 for (s = 0; s <
steps; s++) {
488 for (
i = 0;
i < interleaver_depth;
i++) {
489 output(s*interleaver_depth + interleaver_sequence(
i)) = input(s * interleaver_depth +
i);
496 for (s = 0; s <
steps - 1; s++) {
497 for (
i = 0;
i < interleaver_depth;
i++) {
498 output(s*interleaver_depth + interleaver_sequence(
i)) = input(s * interleaver_depth +
i);
505 for (
i = 0;
i < interleaver_depth;
i++) {
509 output.
set_size(input_length,
true);
525 interleaver_sequence = sort_index(
randu(interleaver_depth));
531 return interleaver_sequence;
538 interleaver_depth = interleaver_sequence.
size();
Array< T > mid(int pos, int n) const
Get n elements of the array starting from pos.
void set_length(int n, bool copy=false)
Resizing an Array<T>.
int size() const
Returns the number of data elements in the array object.
Array< T > left(int n) const
Get n left elements of the array.
void set_size(int n, bool copy=false)
Resizing an Array<T>.
friend const Array< T > concat(const Array< T > &a1, const T &e)
Append element e to the end of the Array a.
int length() const
Returns the number of data elements in the array object.
Array< T > right(int n) const
Get n right elements of the array.
Vec< T > deinterleave(const Vec< T > &input, short keepzeros=0)
Function for block deinterleaving. Removes additional zeros if keepzeros = 0.
Vec< T > interleave(const Vec< T > &input)
Function for block interleaving. May add some zeros.
Block_Interleaver(void)
Block_Interleaver constructor.
void set_cols(int in_cols)
Set the number of columns for block interleaving.
int get_rows(void)
Get the number of rows for block interleaving.
int get_cols(void)
Get the number of columns for block interleaving.
void set_rows(int in_rows)
Set the number of rows for block interleaving.
void set_order(int in_order)
Set the order of the Cross Interleaver.
int get_order(void)
Get the order of the Cross Interleaver.
Cross_Interleaver(void)
Cross_Interleaver constructor.
Vec< T > deinterleave(const Vec< T > &input, short keepzeros=0)
Function for cross deinterleaving. Removes aditional zeros if keepzeros = 0.
Vec< T > interleave(const Vec< T > &input)
Function for cross interleaving. Adds some zeros.
Sequence Interleaver Class.
void set_interleaver_depth(int in_interleaver_depth)
Set the length of the interleaver sequence to be used.
Sequence_Interleaver(int in_interleaver_depth)
Sequence_Interleaver constructor.
Vec< T > interleave(const Vec< T > &input)
Function for sequence interleaving. May add some zeros.
Sequence_Interleaver(ivec in_interleaver_sequence)
Sequence_Interleaver constructor.
Sequence_Interleaver(void)
Sequence_Interleaver constructor.
Vec< T > deinterleave(const Vec< T > &input, short keepzeros=0)
Function for sequence deinterleaving. Removes additional zeros if keepzeros = 0.
int get_interleaver_depth(void)
Get the length of the interleaver sequence presently used.
void deinterleave(const Vec< T > &input, Vec< T > &output, short keepzeros=0)
Function for sequence deinterleaving. Removes additional zeros if keepzeros = 0.
ivec get_interleaver_sequence()
Returns the interleaver sequence presently used.
void set_interleaver_sequence(ivec in_interleaver_sequence)
Set the interleaver sequence to be used.
void interleave(const Vec< T > &input, Vec< T > &output)
Function for sequence interleaving. May add some zeros.
void randomize_interleaver_sequence()
Generate a new random sequence for interleaving.
double randu(void)
Generates a random uniform (0,1) number.
Matrix Class Definitions.
ITPP_EXPORT int round_i(double x)
Round to nearest integer.
Definition of classes for random number generators.
Templated Vector Class Definitions.