Professional Documents
Culture Documents
/* date: 8/22/98 */
/* Characteristics: */
/* Encoder: rate=1/2 CC, g1=5, g2=7, dmin=5 (optimal 1/2 CC) */
/* Interleaver: Pseudo-Random interleaver, size 1024 */
/* Decoding: 1. Maximize the a posteriori probability */
/* 2. No tail bits... */
/* 3. Exp-MAP: computational complexity is high */
/* */
/* Author: chi-hsiao Yih */
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
double uniform(void)
{
return(random()/range);
}
int bernoulli(void)
{
if (uniform() > 0.5)
return(1);
else
return(0);
}
double gauss(void)
{
static int t=0;
static double set;
double r,x,y,v1,v2;
if (t==0)
{
do{
v1 = 2.0*uniform() - 1.0;
v2 = 2.0*uniform() - 1.0;
r = v1*v1 + v2*v2;
} while (r >= 1.0);
y = sqrt(-2.0*log(r)/r);
set = v1 * y;
t = 1;
return(v2*y);
} else {
t=0;
return(set);
}
}
void interleaver(void)
{
int i, j, k, tmp[block_length];
char tt;
k = tmp[i];
tmp[i] = tmp[j];
tmp[j] = k;
}
}
void turbo_encoder(void)
{
int i, j, tmp[block_length];
/* encoder 1 output */
st=0;
for(i=0; i<block_length; i++)
{
d[i] = bernoulli();
x1[i] = (2.0*d[i] - 1.0) + dev*gauss();
ya[i] = (2.0*output[st][d[i]][1] - 1.0) + dev*gauss();
st = states[st][d[i]];
}
/* interleaving */
/* encoder 2 output */
st=0;
for(i=0; i<block_length; i++)
{
yb[i] = (2.0*output[st][tmp[i]][1] - 1.0) + dev*gauss();
st = states[st][tmp[i]];
}
}
void reverse_state(void)
{
int m, i, j;
void initialize(void)
{
int i, j;
if ((m==0)&&(i==0))
normal = alpha[k][i][m];
else if (normal < alpha[k][i][m])
normal = alpha[k][i][m];
}
if ((m==0)&&(i==0))
normal = beta[k][i][m];
else if (normal < beta[k][i][m])
normal = beta[k][i][m];
}
void main(void)
{
int dc, i, it, k, m, iter_no, tmp[block_length];
double tmp1, tmp2;
char filename[30];
FILE *fp;
reverse_state();
interleaver();
do{
turbo_encoder();
initialize();
/* interleaving */
/* deinterleaving */
for(i=0; i<block_length; i++)
tmp[index[i]] = La[i];
for(i=0; i<block_length; i++)
La[i] = tmp[i];
}