📄 decode.c
字号:
////////////////////////////////////////////
#include "stdio.h" //
#include "math.h" //
#include "malloc.h" //
#include "stdlib.h" //
#include "time.h" //
//
#include "parameter.h" //
//#include "interleave.h" //
////////////////////////////////////////////
void logmap();
char decision_m(int);
short getnext_state(short,char);
char getnext_out(short,char);
float get_noise_variance(float *);
void interleaver_float(float *,float *,char);
short getnext_state(short a,char b)
{
char k,lm,h;
short m,state;
m=G1/100*8*8+(G1/10-G1/100*10)*8+G1-G1/10*10;
lm=decision_m(m);
h=b;
for(k=lm-2;k>=0;k--)
if((m>>k&0x01)!=0)
h=h^a>>k;
h=h&0x01;
state=(a>>1)|h<<(lm-2);
return state;
}
char getnext_out(short a,char b)
{ short m,n;
char ln,j;
char k,lm,h;
m=G1/100*8*8+(G1/10-G1/100*10)*8+G1-G1/10*10;
lm=decision_m(m);
h=b;
for(k=lm-2;k>=0;k--)
if((m>>k&0x01)!=0)
h=h^a>>k;
h=h&0x01;
n=G2/100*8*8+(G2/10-G2/100*10)*8+G2-G2/10*10;
ln=decision_m(n);
if((n>>(ln-1)&0x01)==0)
h=0;
for(j=ln-2;j>=0;j--)
if((n>>j&0x01)!=0)
h=h^(a>>j);
h=h&0x01;
h=2*h-1;
return h;
}
void initialize_turbo_decode()
{
char l,j;
short i;
// short num_state;
l=restrict_l-1;
num_state=pow(2,l);
(short *)next_state=(short *) malloc (num_state*2*sizeof(short));
(short *)last_state=(short *) malloc (num_state*2*sizeof(short));
(char *)next_out=(char *) malloc (num_state*2*sizeof(char));
(char *)last_out=(char *) malloc (num_state*2*sizeof(char));
(float *)alpha_a=(float *) malloc ((fra_long+1) * num_state * sizeof(float));
(float *)beta_b=(float *) malloc (fra_long * num_state * sizeof(float));
(float *)gamma=(float *) malloc (num_state * sizeof(float));
(float *)LLR=(float *) malloc (fra_long * sizeof(float));
(float *)LL_inter=(float *) malloc (fra_long * sizeof(float));
(double *)temp_zero=(double *) malloc (num_state * sizeof(double));
(double *)temp_one=(double *) malloc (num_state * sizeof(double));
for(i=0;i<num_state;i++)
for(j=0;j<2;j++)
{
next_state[i*2+j]=getnext_state(i,j);
last_state[getnext_state(i,j)*2+j]=i;
next_out[i*2+j]=getnext_out(i,j);
last_out[getnext_state(i,j)*2+j]=getnext_out(i,j); }
//先验信息初始化
for(i=0;i<fra_long;i++)
l_ex[i]=0.0;
////////定义负无穷的值
infty=pow(10,10);
/*for(i=0;i<num_state*2;i++)
printf("%d,",next_out[i]);
printf("\n");
for(i=0;i<num_state*2;i++)
printf("%f,",infty);*/
}
//////////////////////////////////////////////////////////////
float get_noise_variance(float *a)
{
short i;
float avarage,variance=0.0;
avarage=0.00;
for(i=0;i<fra_long*3;i++)
avarage=avarage+a[i];
avarage=avarage/(fra_long*3);
for(i=0;i<fra_long*3;i++)
variance=variance+pow(a[i]-avarage,2);
variance=variance/(fra_long*3)-1;
if(variance<=0)
printf("信噪比太高,出现问题");
return variance;}
void turbo_decode(float *a,char *b)
{
short i,num;
float variance,temp;
variance=get_noise_variance(a);
for(num=0;num<2;num++)
{
i=0;
for(i=0;i<fra_long*2;i=i+2)
{
rec_s[i]=a[3*i/2]/variance;
rec_s[i+1]=a[3*i/2+1]/variance;}
interleaver_float(l_ex,interleavefloat_out,1);
for(i=0;i<fra_long;i++)
l_ex[i]=interleavefloat_out[i];
/* for(i=0;i<fra_long;i++)
printf("%f..",rec_s[i*2]);
printf("\n");*/
logmap();
/*//temp=l_ex[0];
for(i=0;i<fra_long;i++)
printf("%f,,",l_ex[i]);
printf("\n");
//if(l_ex[i]>pow(10,20) || l_ex[i]<-pow(10,20))
if(l_ex[i]>temp)
temp=l_ex[i];
printf("%f,,",temp);
for(i=0;i<fra_long;i++)
LL_inter[i]=a[3*i]/variance;
interleaver_float(LL_inter,interleavefloat_out,0);
for(i=0;i<fra_long;i++)
rec_s[i*2]=interleavefloat_out[i];
for(i=0;i<fra_long;i++)
LL_inter[i]=rec_s[i*2+1];
interleaver_float(LL_inter,interleavefloat_out,0);
for(i=0;i<fra_long;i++)
rec_s[i*2+1]=interleavefloat_out[i];*/
/*
for(i=0;i<fra_long;i++)
printf("%f..",rec_s[2*i]);
printf("\n");*/
interleaver_float(l_ex,interleavefloat_out,0);
for(i=0;i<fra_long;i++)
l_ex[i]=interleavefloat_out[i];
for(i=0;i<fra_long;i++)
LL_inter[i]=a[3*i]/variance;
interleaver_float(LL_inter,interleavefloat_out,0);
for(i=0;i<fra_long;i++)
{
rec_s[i*2]=interleavefloat_out[i];
rec_s[i*2+1]=a[3*i+2]/variance; }
// interleaver_float(l_ex,interleavefloat_out,0);
// for(i=0;i<fra_long;i++)
// l_ex[i]=interleavefloat_out[i];
logmap();
/* for(i=0;i<fra_long;i++)
printf("%f,,",l_ex[i]);
printf("\n");
for(i=0;i<fra_long;i++)
printf("%f,,",l_ex[i]);
printf("\n");
for(i=0;i<fra_long;i++)
// if(l_ex[i]>pow(10,20) || l_ex[i]<-pow(10,20))
printf("%f,.",l_ex[i]);
printf("\n");
i=0;*/
}
/*
for(i=0;i<fra_long;i++)
printf("%f,.",LLR[i]);
printf("\n");
interleaver_float(LLR,interleavefloat_out,1);
interleaver_float(interleavefloat_out,LLR,0);
for(i=0;i<fra_long;i++)
printf("%f,.",LLR[i]);
printf("\n");*/
for(i=0;i<fra_long;i++)
l_ex[i]=0.0;
interleaver_float(LLR,interleavefloat_out,1);
for (i=0;i<fra_long;i++)
if(interleavefloat_out[i]>0)
b[i]=1;
else
b[i]=0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -