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

📄 log_map.c

📁 c语言编写的一个turbo码的程序。采用了高斯信道QPSK调制
💻 C
字号:
////////////////////////////////////////////
#include "stdio.h"                        //
#include "math.h"                         //
#include "malloc.h"                       //
#include "stdlib.h"                       //
#include "time.h"                         //

#include "parameter.h"                    //
////////////////////////////////////////////

void interlize_a();
void interlize_b();
void update_a();
void update_b();
void get_LLR();
void get_LL();

void interlize_a()
{short i;
 alpha_a[0]=0;
 for(i=1;i<num_state;i++)
	 alpha_a[i*(fra_long+1)]=-infty;}

void interlize_b()
{short i;
 for(i=0;i<num_state;i++)
   beta_b[i*fra_long+fra_long-1]=0;}

void update_a()
{ short i,j,k;
double sum;
double h;
for(i=1;i<fra_long+1;i++)
{  
	for(j=0;j<num_state;j++)
	{for(k=0;k<num_state;k++)
	gamma[k]=-infty;
	gamma[last_state[j*2]]=-rec_s[(i-1)*2]+rec_s[(i-1)*2+1]*last_out[j*2]
		                             -log(1+exp(l_ex[i-1]));
	gamma[last_state[j*2+1]]=rec_s[(i-1)*2]+rec_s[(i-1)*2+1]*last_out[j*2+1]
	                               	 +l_ex[i-1]-log(1+exp(l_ex[i-1]));
	sum=0.0;
 for(k=0;k<num_state;k++)
 {
   h=alpha_a[k*(fra_long+1)+i-1]+gamma[k];
   sum=sum+exp(h);}
// printf("%f   ",sum);
if(sum<pow(10,-300))
 alpha_a[j*(fra_long+1)+i]=-infty;
else 
    alpha_a[j*(fra_long+1)+i]=log(sum);
}
	temp_max[i]=alpha_a[i];
for(k=1;k<num_state;k++)
  if(alpha_a[k*(fra_long+1)+i]>temp_max[i])
	  temp_max[i]=alpha_a[k*(fra_long+1)+i];
  for(k=0;k<num_state;k++)
  alpha_a[k*(fra_long+1)+i]=alpha_a[k*(fra_long+1)+i]-temp_max[i];
//	printf("\n");
//for(k=0;k<num_state;k++)
//printf("%f    ",alpha_a[k*(fra_long+1)+i]);
//	printf("\n");
//k=0;
}
}


void update_b()
{short i,j,k;
 double sum;
 double h;
for(i=fra_long-2;i>=0;i--)
{
 for(j=0;j<num_state;j++)
 {for(k=0;k<num_state;k++)
	gamma[k]=-infty;
	gamma[next_state[j*2]]=-rec_s[(i+1)*2]+rec_s[(i+1)*2+1]*next_out[j*2]
	                        	-log(1+exp(l_ex[i+1]));
	gamma[next_state[j*2+1]]=rec_s[(i+1)*2]+rec_s[(i+1)*2+1]*next_out[j*2+1]
	                          	+l_ex[i+1]-log(1+exp(l_ex[i+1]));
	sum=0.0;
	for(k=0;k<num_state;k++)
	{
		h=beta_b[k*fra_long+i+1]+gamma[k];
		sum=sum+exp(h);}
	if(sum<pow(10,-300))
		beta_b[j*fra_long+i]=-infty;
	else 
		beta_b[j*fra_long+i]=log(sum);

 }
for(k=0;k<num_state;k++)
beta_b[k*fra_long+i]=beta_b[k*fra_long+i]-temp_max[i+1];
//for(k=0;k<num_state;k++)
//printf("%f    ",beta_b[k*fra_long+i]);
//printf("\n");
//k=0;
 }
}

void get_LLR()
{short i,j;
 double gamma0,gamma1;
 double sum0,sum1;
for (i=0;i<fra_long;i++)
{
  for(j=0;j<num_state;j++)
  {gamma0=-rec_s[i*2]+rec_s[i*2+1]*last_out[j*2]-log(1+exp(l_ex[i]));
   gamma1=rec_s[i*2]+rec_s[i*2+1]*last_out[j*2+1]+l_ex[i]-log(1+exp(l_ex[i]));
//     if((1+exp(l_ex[i]))==0)
 //    printf("%f  ,,",(1+exp(l_ex[i])));
   
//   if(gamma1>pow(10,10) || gamma1<-pow(10,10) || gamma0>pow(10,10) || gamma0<-pow(10,10))
 //  printf("%f..%f,,",gamma0,gamma1);

   temp_zero[j]=exp(gamma0+alpha_a[last_state[j*2]*(fra_long+1)+i]+beta_b[j*fra_long+i]);                                   
   temp_one[j]=exp(gamma1+alpha_a[last_state[j*2+1]*(fra_long+1)+i]+beta_b[j*fra_long+i]); 
//    if(gamma1>pow(10,10) || gamma1<-pow(10,10))
  //   printf("%f  %f,,",temp_zero[j],temp_one[j]);
  }
  sum0=0.0;sum1=0.0;
for(j=0;j<num_state;j++)
{
	sum0=sum0+temp_zero[j];
sum1=sum1+temp_one[j];}

//if (sum0==0 || sum1==0)
//for(j=0;j<num_state;j++)
//printf("%f,%f,%f",gamma0,alpha_a[last_state[j*2]*(fra_long+1)+i],beta_b[j*fra_long+i]);
LLR[i]=log(sum1)-log(sum0);
}
//for(j=0;j<fra_long;j++)
//printf("%f,,",LLR[j]);
}

void get_LL()
{
	short i;
	short j;
	for(i=0;i<fra_long;i++)
	l_ex[i]=LLR[i]-l_ex[i]-2*rec_s[2*i];
//	for(j=0;j<fra_long;j++)
//printf("%f,,",l_ex[j]);
}


void logmap()
{
  interlize_a();
  interlize_b();
  update_a();
  update_b();
  get_LLR();
  get_LL();
  
}





















⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -