File: Demod2D.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 (134 lines) | stat: -rw-r--r-- 3,909 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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
/* File: Demod2D.c

   Description: Transforms received symbols into ML symbol log-likelihoods 

   The calling syntax is:
      [output] = Demod2D( input, S_matrix, EsNo, [fade_coef] )

   Where:
      output    = M by N matrix of symbol log-likelihoods

      input     = 1 by N matrix of (complex) matched filter outputs
	  S_matrix  = Length M complex vector representing the constellation
	  EsNo      = the symbol SNR (in linear, not dB, units)
	  fade_coef = 1 by N matrix of (complex) fading coefficients (defaults to all-ones)

   Copyright (C) 2005-2006, Matthew C. Valenti

   Last updated on May 6, 2006

   Function Demod2D 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
prhs[0] is input
prhs[1] is S_matrix
prhs[2] is EsNo
prhs[3] is fade_coef */

/* Output Arguments
plhs[0] is output */

/* main function that interfaces with MATLAB */
void mexFunction(
				 int            nlhs,
				 mxArray       *plhs[],
				 int            nrhs,
				 const mxArray *prhs[] )
{
  int    M;
  int    number_symbols;
  float  EsNo;
  double *Sr, *Si , *ar, *ai, *yr, *yi, *output;
  int    i,j;
  double tempsr, tempsi, Er, Ei;

  /* make sure there are enough inputs */
  if (nrhs<3)
	  mexErrMsgTxt("Usage: [output] = Demod2D( input, S_matrix, EsNo, [fade_coef] )");

  /* read in the inputs */
  number_symbols = mxGetN(prhs[0]);
  yr = mxGetPr(prhs[0]);
  if(!mxIsComplex(prhs[0]) )
	  yi = (double*)calloc( number_symbols, sizeof(double) );
  else
	  yi = mxGetPi(prhs[0]);  

  if (mxGetN(prhs[1])==1) /* column vector */
	  M = mxGetM( prhs[1] );
  else if (mxGetM(prhs[1])==1) /* row vector */
	  M = mxGetN( prhs[1] );
  else
	  mexErrMsgTxt("S_matrix should only have one column or row");

  Sr = mxGetPr(prhs[1]);
  if (!mxIsComplex(prhs[1]) )
	  Si = (double*)calloc( M, sizeof(double) );
  else
	  Si = mxGetPi(prhs[1]);

  EsNo = (float) *mxGetPr(prhs[2]);

  if(nrhs>3) {
	  if (mxGetN(prhs[3])!=number_symbols)
		  mexErrMsgTxt("Fading process must be same length as received signal");
	  
	  ar = mxGetPr(prhs[3]);
	  if (!mxIsComplex(prhs[3]) ) 
		  ai = (double*)calloc( number_symbols, sizeof(double) );
	  else
		  ai = mxGetPi(prhs[3]);
  } else {
	  ar = (double*)calloc( number_symbols, sizeof(double) );
	  for (i=0;i<number_symbols;i++)
		  ar[i] = 1; /* assume AWGN if no fading process specified */
	  ai = (double*)calloc( number_symbols, sizeof(double) );
  }

  plhs[0]=mxCreateDoubleMatrix(M, number_symbols, mxREAL);
  output = mxGetPr( plhs[0] );

  /* determine output */
  for (i=0;i<number_symbols;i++) { /* go through each received symbol */
	  for (j=0;j<M;j++) { /* each postulated symbol */
		  tempsr = ar[i]*Sr[j]-ai[i]*Si[j];
		  tempsi = ai[i]*Sr[j]+ar[i]*Si[j];
		  Er = yr[i]-tempsr;
		  Ei = yi[i]-tempsi;
		  output[i*M+j] = -EsNo*(Er*Er+Ei*Ei);
	  }
  }

  /* free memory */
  if(!mxIsComplex(prhs[0]) )
     free(yi);
  if(!mxIsComplex(prhs[1]) )
     free(Si);
  if (nrhs>3) {
	  if(!mxIsComplex(prhs[3]) )
		  free(ai);
  } else {
	  free(ar);
	  free(ai);
  }
}