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

📄 turbo_encode.c

📁 Turbo码编码的C语言实现。 Turbo码是如今通信技术中非常重要也非常普遍的编码
💻 C
字号:
#include <std.h>
#include <log.h>
#include <mem.h>
#include <math.h>

#include "TURBO_dspokcfg.h"


#define L_total 200  /*决定交织器长度*/
#define NumOfParity 2                              /*成员码*/  
#define constraint 3                               /*约束度*/
#define NumOfIter 3                              /*迭代次数*/
#define puncture 0                                 /*是否删余*/
#define AWGN 1                                     /*AWGN信道*/
#define EbN0 2.0                                   /*信噪比*/
#define FadeAmp 1                                  /*设AWGN信道的衰落常数为1,即无衰减*/
#define RAND_MAX 32767                             
#define PI 3.14159                                 /*定义pi*/
int g[5][5]={{1,1,1,0,0},{1,0,1,0,0},{0,0,0,0,0}};
int LenOfInfo,memory,NumOfState;
float rate,sigma,L_c;
int SEG0,SEG1,SEG2,SEG3,SEG4,SEGofEstiSeq,SEG5,SEG6,SEG7,SEG8;         /*定义数据堆*/
short *interleaver;
float *Y;

void display();                                          /*申明要调用的显示函数*/
void initial();                                          /*申明要调用的初始化函数*/
void ProduceInfoSeq(char *InfoSeq,int LenOfInfo);        /*申明要调用的产生随机数的函数*/
void encode(char *InfoSeq, char *X);                     /*编码*/

Void main()                                              /*===主函数===*/
{ int i;                                                      

  char *InfoSeq,*X;
  char *U;
  
  char *EstiSeq;
  float ber;
  display();
  initial();/*调用初始化成员函数*/
  interleaver=(short *)MEM_alloc(SEG0,L_total*2,0);
  LOG_printf(&log_SEG, "seg %d: ptr = %p", (Arg)SEG0, (Arg)interleaver);/*====检验===*/
  InfoSeq=(char *)MEM_alloc(SEG1,LenOfInfo,0);
  LOG_printf(&log_SEG, "seg %d: ptr = %p", (Arg)SEG1, (Arg)InfoSeq);
  X=(char *)MEM_alloc(SEG2,L_total*(2+puncture),0);
  LOG_printf(&log_SEG, "seg %d: ptr = %p", (Arg)SEG2, (Arg)X);
  U=(char *)MEM_alloc(SEG3,L_total*(2+puncture),0); 
  LOG_printf(&log_SEG, "seg %d: ptr = %p", (Arg)SEG3, (Arg)U);
  Y=(float *)MEM_alloc(SEG4,L_total*(2+puncture)*sizeof(float),0);
  LOG_printf(&log_SEG, "seg %d: ptr = %p", (Arg)SEG4, (Arg)Y);
  EstiSeq=(char *)MEM_alloc(SEGofEstiSeq,LenOfInfo,0);
  LOG_printf(&log_SEG, "seg %d: ptr = %p", (Arg)SEGofEstiSeq, (Arg)EstiSeq);
  ber=0.0; 
  srand((unsigned)time(NULL));
  ProduceInfoSeq(InfoSeq,LenOfInfo);
   
   for(i=0;i<LenOfInfo;i++)
   {
   LOG_printf(&log_Info, "InfoSeq[i]=%d\n", InfoSeq[i]);/*==打印产生的随机序列==*/
   }
  encode(InfoSeq,X); 
   for(i=0;i<L_total*(2+puncture);i++)
   {
   LOG_printf(&log_encode, "X[i]=%d\n", X[i]);        /*===打印编码输出===*/
      /*===打印调制输出===*/
   }                                         
  
  
   return;
}  

void display()                                            /*显示函数*/
{
 int i,j;
 LOG_printf(&trace,"---------------------------------------\n");
 LOG_printf(&trace,"====modified-log-map====\n");
 LOG_printf(&trace,"framesize=%d\n",L_total);
 LOG_printf(&trace,"code generator:\n");
  for(i=0;i<NumOfParity;i++)
    {for(j=0;j<constraint;j++)
      LOG_printf(&trace," %d\n",(unsigned int)(g[i][j]));
    }
  
 if(puncture==0)
	    LOG_printf(&trace,"punctured,code rate=1/2\n");
 else
	    LOG_printf(&trace,"unpunctured,code rate=1/3");
 LOG_printf(&trace,"iteration number=%d\n",NumOfIter);
 /*LOG_printf(&trace,"terminate errors=%d\n",Ferrlim);*/
 
 if(AWGN==1)
  LOG_printf(&trace,"AWGN channel\n");
 else
  LOG_printf(&trace,"Rayleign channel\n");
 LOG_printf(&trace,"EbN0(dB)=%f\n",EbN0);
   	    	    
 LOG_printf(&trace,"---------------------------------------");
 return;
 
}

void initial()                                                 /*初始化函数*/
{	
    
	LenOfInfo=L_total-constraint+1;//信息位长度=序列总长度-约束度+1
	rate=1/(2.0+puncture);//码率为1/2
	memory=constraint-1;//编码存贮=约束度-1
	NumOfState=pow(2,memory);
    sigma =  (float) sqrt (1 / ( 2 * rate*pow(10,(EbN0/10))));
	L_c=2*FadeAmp*pow(10,(EbN0/10))*rate;
	/*trellis();*/
}

void ProduceInfoSeq(char *InfoSeq,int LenOfInfo)             /*随机序列的产生*/
{ 
    int i;
    srand( (unsigned)time( NULL ) );
	for (i=0;i<LenOfInfo;i++)
    InfoSeq[i]=(rand()>=(RAND_MAX+1)>>1);
}



void PreRSC(char *InfoSeq, char *TermSeq);                    /*预编码*/
void MakeInterleaver(short *interleaver);                     /*构造交织索引函数*/
void permute(char *normal, char *scramble,short *interleaver);   /*交织*/
char RSC(char *Xs,char *Xp,char InState,short length);           /*编码*/
void multiplex(char *Xs, char *Xp1, char *Xp2, char *X);        /*复接*/
void PreRSC(char *InfoSeq, char *TermSeq)          /*预编码子函数*/
{char state[5],temp;
 short i,j;
 for(i=0;i<memory;i++)
	state[i]=0;
 for(i=0;i<LenOfInfo;i++)
 { 
	temp=InfoSeq[i];
	TermSeq[i]=temp;
	for(j=1;j<constraint;j++)
	  temp=temp^(state[j-1]&g[0][j]);
	for(j=memory-1;j>0;j--)
	state[j]=state[j-1];
	state[0]=temp;
 };
 for(i=LenOfInfo;i<L_total;i++)
 {
	 temp=0;
	for(j=1;j<constraint;j++)
	  temp=temp^(state[j-1]&g[0][j]);
	TermSeq[i]=temp;
	for(j=memory-1;j>0;j--)
	state[j]=state[j-1];
	state[0]=0;
 };
}

void MakeInterleaver(short *interleaver)         /*构造交织索引子函数*/
{short i,index;
 short temp;
 //srand( (unsigned)time( NULL ) );
 for(i=0;i<L_total;i++)
	 interleaver[i]=i;
 for (i=0;i<L_total-1;i++)
 {
	 index=abs((L_total-i)*rand()/(RAND_MAX+1)+i);
	 index=index%L_total;
	 temp=interleaver[index];
	 interleaver[index]=interleaver[i];
	 interleaver[i]=temp;
 }
}

void permute(char *normal, char *scramble,short *interleaver)   /*交织子函数*/
{
  short i;
  for(i=0;i<L_total;i++)
	scramble[i]=normal[interleaver[i]];

}

char RSC(char *Xs,char *Xp,char InState,short length)           /*编码(RSC码)*/
{char state[5],temp;
 short i,j;
 for(i=0;i<memory;i++)
	{
	 state[i]=InState&1;
	 InState=InState>>1;
	}
 for(i=0;i<length;i++)
	{
	temp=Xs[i];
	for(j=1;j<constraint;j++)
	  temp=temp^(state[j-1]&g[0][j]);
	Xp[i]=temp&g[1][0];
	for(j=1;j<constraint;j++)
	  Xp[i]=Xp[i]^(state[j-1]&g[1][j]);
	for(j=memory-1;j>0;j--)
	state[j]=state[j-1];
	state[0]=temp;
	}
	temp=state[0];
 for(i=1;i<memory;i++)
	  temp=temp|state[i]<<i;
 return temp;
}

void multiplex(char *Xs, char *Xp1, char *Xp2, char *X)               /*复接*/
{
	int i,j;
	if (puncture)
	{
		for(i=0,j=0;i<L_total;i++,j=j+3)
		{
			X[j]=Xs[i];
			X[j+1]=Xp1[i];
			X[j+2]=Xp2[i];
		}
	}
	else
	{
		for(i=0,j=0;i<L_total;i++,j=j+2)
		{
			X[j]=Xs[i];
			if (i%2==0) 
				X[j+1]=Xp1[i];
			else
				X[j+1]=Xp2[i];
		}
	}

}

⌨️ 快捷键说明

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