File: Interleave.cpp

package info (click to toggle)
codec2 1.2.0-4
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 76,376 kB
  • sloc: ansic: 436,819; cpp: 2,091; objc: 1,736; sh: 1,510; python: 1,405; asm: 683; makefile: 605
file content (81 lines) | stat: -rw-r--r-- 2,430 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
/* file: Interleave.c

   Description: Interleave one block of data according to interleaving pattern alpha_code

   The calling syntax is:

      [output] = Interleave(input, alpha_code )

      output = interleaved data 

      input  = uninterleaved data (float or int)
	  alpha_code = interleaver pattern
  
   Copyright (C) 2005-2006, Matthew C. Valenti

   Last updated on Jan. 11, 2006

   Function Interleave is part of the Iterative Solutions 
   Coded Modulation Library. The Iterative Solutions Coded Modulation 
   Library is free software; you can redistribute it and/or modify it 
   under the terms of the GNU Lesser General Public License as published 
   by the Free Software Foundation; either version 2.1 of the License, 
   or (at your option) any later version.

   This library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Lesser General Public License for more details.
  
   You should have received a copy of the GNU Lesser General Public
   License along with this library; if not, write to the Free Software
   Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
*/
#include <math.h>
#include <mex.h>
#include <Matrix.h>
#include <stdlib.h>

/* Input Arguments */
#define INPUT       prhs[0]
#define ALPHA       prhs[1]

/* Output Arguments */
#define OUTPUT      plhs[0]

/* main function that interfaces with MATLAB */
void mexFunction(
				 int            nlhs,
				 mxArray       *plhs[],
				 int            nrhs,
				 const mxArray *prhs[] )
{
	double	*input, *alpha;
	double	*output_p;
	int      InterleaverLength, i, index;

	/* Check for proper number of arguments */
	if ((nrhs < 2 )||(nlhs  > 1)) {
		mexErrMsgTxt("Usage: [output] = Interleave(input, alpha_code )");
	} else {
		/* first input is the data word */
		input = mxGetPr(INPUT);	
		InterleaverLength = mxGetN(INPUT); /* number of data bits */

		/* second input is the interleaver */
		if ( mxGetN(ALPHA) != InterleaverLength )
			mexErrMsgTxt("Interleave: Error input and alpha_code must be same length");
		alpha = mxGetPr(ALPHA);

		OUTPUT = mxCreateDoubleMatrix(1, InterleaverLength, mxREAL );
		output_p = mxGetPr(OUTPUT);	

		/* Interleave */
		for(i=0;i<InterleaverLength;i++) { 
			index = (int) alpha[i];
			output_p[i] = input[index];
		}
	}

	return;
}