-
Notifications
You must be signed in to change notification settings - Fork 17
/
Copy pathlogAPP1.c
129 lines (110 loc) · 3.24 KB
/
logAPP1.c
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
#include "mex.h"
#include "malloc.h"
#include "math.h"
#define PI 3.1415926
#define MAX(a,b) ((a>b)?a:b)
#define ABS(x) (x>=0?x:-x)
//double maxStar(double x,double y); //max*
//double logAPP(double y[],int u_hat[],int ui,int N,int i,double var);//logAPP
double W(double y,int x,double var)
{
return(sqrt(1/(2*PI*var))*exp((y+1-2*x)*(y+1-2*x)/(-2*var)));
}
double maxStar(double x,double y)
{
double z;
z=MAX(x,y)+log(1+exp(-ABS((x-y))));
return(z);
}
double logAPPbase(double y,int x,double var)
{
return(log(W(y,x,var)/(W(y,0,var)+W(y,1,var))));
}
double logAPP(double y[],int u_hat[],int ui,int N,int i,double var)
{
double M=0,M0=0,M1=0;//M is the output, M0 and M1 are middle parameters
int *uoe;
int *ue;
int ii;//
if(N!=2)
{
if(i%2==1)
{
if(i==1)
{
M0=logAPP(y,u_hat,ui,N/2,i,var)+logAPP(y+N/2,u_hat,0,N/2,i,var);
M1=logAPP(y,u_hat,ui^1,N/2,i,var)+logAPP(y+N/2,u_hat,1,N/2,i,var);
M=maxStar(M0,M1);
}
else
{
uoe=(int *)mxCalloc((i-1)/2,sizeof(int));
ue=(int *)mxCalloc((i-1)/2,sizeof(int));
for(ii=0;ii<=(i-1)/2-1;ii++)
{
uoe[ii]=u_hat[2*ii]^u_hat[2*ii+1];
ue[ii]=u_hat[2*ii+1];
}
M0=logAPP(y,uoe,ui,N/2,(i+1)/2,var)+logAPP(y+N/2,ue,0,N/2,(i+1)/2,var);
M1=logAPP(y,uoe,ui^1,N/2,(i+1)/2,var)+logAPP(y+N/2,ue,1,N/2,(i+1)/2,var);
M=maxStar(M0,M1);
mxFree(uoe);
mxFree(ue);
}
}
else
{
uoe=(int *)mxCalloc((i-2)/2,sizeof(int));
ue=(int *)mxCalloc((i-2)/2,sizeof(int));
for(ii=0;ii<=((i-2)/2-1);ii++)
{
uoe[ii]=u_hat[2*ii]^u_hat[2*ii+1];
ue[ii]=u_hat[2*ii+1];
}
M=logAPP(y,uoe,u_hat[i-2]^ui,N/2,i/2,var)+logAPP(y+N/2,ue,ui,N/2,i/2,var);
mxFree(uoe);
mxFree(ue);
}
}
else
{
if(i==1)
{
M0=logAPPbase(y[0],ui,var)+logAPPbase(y[1],0,var);
M1=logAPPbase(y[0],ui^1,var)+logAPPbase(y[1],1,var);
M=maxStar(M0,M1);
}
else
{
M=logAPPbase(y[0],u_hat[0]^ui,var)+logAPPbase(y[1],ui,var);
}
}
return(M);
}
void mexFunction(int nlhs,mxArray *plhs[], int nrhs, const mxArray * prhs[])
{
double *y; //received vector of the channel, pointer
double *u_hat; //last (i-1) decoded bits, pointer
int ui; //assumed value of i th decoded bites, value
int N; //length of the code, value
int i; //the number of the current bit, value
double var; //the variance of the gaussian noise, value
double *M; //the output
int *u_hat_int; //the interger of the u_hat, because u_hat is double
int ii; //u_hat transfer counter
y=mxGetPr(prhs[0]); //
u_hat=mxGetPr(prhs[1]); //
ui=mxGetScalar(prhs[2]); //
N=mxGetScalar(prhs[3]); //
i=mxGetScalar(prhs[4]); //
var=mxGetScalar(prhs[5]); //
plhs[0]=mxCreateDoubleMatrix(1,1,mxREAL);
M=mxGetPr(plhs[0]);
u_hat_int=mxCalloc(i-1,sizeof(int));
for(ii=0;ii<=i-1;ii++)
{
u_hat_int[ii]=(int)u_hat[ii];
}
*M=logAPP(y,u_hat_int,ui,N,i,var); //
//mxFree(u_hat_int);
}