⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 decode.c

📁 c语言编写的一个turbo码的程序。采用了高斯信道QPSK调制
💻 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 + -