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

📄 turboencoder.c

📁 turbo码simulink编码程序
💻 C
📖 第 1 页 / 共 3 页
字号:
		  {
		   for(i2=0;i2<matrix_column;i2++)
   		   p_inter_perm2[i2*matrix_row+i]=p_inter_perm1[i*matrix_column+i2];
		  
	       }



/*******************************************************************************************
**************删除填补的那些比特所占的位置,得到最终的交织模式******************************
********************************************************************************************/
  
   i3=0;
   for (i2=0;i2<matrix_size;i2++)
     {
	    if(p_inter_perm2[i2]<data_len)
		 {
		    p_inter_perm[i3]=p_inter_perm2[i2];
	        i3++;
	     }
      }

/******************test区*******************************************************************
    for (i2=0;i2<data_len;i2++) 
    cout<<p_inter_perm[i2]<<endl;

/*******************************************************************************************
**************计算进行行间交换后的交换模式**************************************************
********************************************************************************************/



/*******************************************************************************************
**************释放开辟的空间****************************************************************
********************************************************************************************/
    
	free(p_inter_s);p_inter_s=NULL;
	free(p_inter_q);p_inter_q=NULL;
	free(p_inter_r);p_inter_r=NULL;
	free(p_inter_perm1);p_inter_perm1=NULL;
	free(p_inter_perm2);p_inter_perm2=NULL;
	free(p_inter_ui);p_inter_ui=NULL;

/*******************************************************************************************
**************释放开辟的空间结束************************************************************
********************************************************************************************/


/***********************************程序结束************************************************/
}

/*****************************************************************************************************
***************function name TD_SCDMA_RSC_encoder
***************功能说明:RSC卷积码编码器
***************主要参数、变量说明:*p_data,*p_parity分别为指向数据以及编码后校验位的指阵
***************主要参数、变量说明:data_len为编码数据的长度 
***************Copyright 2004-2008  
***************$Revision: 1.0 $ $Date: 2004/11/04 13:37:18 $  函数版
*******************************************************************************************************/
void TD_SCDMA_RSC_encoder(inputdata_type *p_data,inputdata_type *p_parity, int data_len)

{ 
/*******************************************************************************************
***********************数据定义区***********************************************************
********************************************************************************************/	
  int i,temp;
  int i1;
  int index;
  int state;// the state of encoder
  outputdata_type *p_parity1;
  inputdata_type *p_data1;
 
  //int M=3;//编码级数
   int trelli_state_f[8][2]={{0,4},{4,0},{5,1},{1,5},{2,6},{6,2},{7,3},{3,7}}; 
  //int trelli_state_b[][]={{0,1},{3,2},{4,5},{7,6},{1,0},{2 ,3},{5,4},{6,7}};
  int trelli_output_f[8][2]={{0,1},{0,1},{1,0},{1,0},{1,0},{1,0},{0,1},{0,1}};
  //int trelli_output_b[][]={{0,1},{1,0},{1,0},{0,1},{0,1},{1,0},{1,0},{0,1}};
  p_parity1=p_parity;
  p_data1=p_data;
/*******************************************************************************************
***********************数据定义区结束*******************************************************
********************************************************************************************/

  
/*******************************************************************************************
***********************编码区***********************************************************
********************************************************************************************/
  
  state=0;//initialized encoder's state is 0 
  for (i=0;i<data_len;i++)
  {
   index=*(p_data1);
  *(p_parity1++)=trelli_output_f[state][index];
    state=trelli_state_f[state][index];
    p_data1++;
    //cout<<p_data[i]<<p_parity[i]<<temp<<state<<endl;
  }

/*******************************************************************************************
***********************编码结束区**********************************************************
********************************************************************************************/


/*******************************************************************************************
***********************收尾的数据计算***********************************************************
********************************************************************************************/
  
  for (i1=i;i1<i+M;i1++)
  {
	  if (trelli_state_f[state][0]<trelli_state_f[state][1])
	  {
		  p_data[i1]=0;
		  p_parity[i1]=trelli_output_f[state][0];
		  state=trelli_state_f[state][0];
		  temp=state;
	   }
	  else 
	  {
		  p_data[i1]=1;
          p_parity[i1]=trelli_output_f[state][1];
		  state=trelli_state_f[state][1];
	      temp=state;
	   }
     
      //cout<<p_data[i1]<<p_parity[i1]<<temp<<state<<endl;
   }
  
/*******************************************************************************************
***********************收尾结束***********************************************************
********************************************************************************************/
}
/*******************************************************************************************
***********************RSC编码器结束*******************************************************
********************************************************************************************/

/*****************************************************************************************************
***************function name turbo_encoder
***************功能说明:TDSCDMA 标准中的turbo码的的编码
***************主要参数:trellis 格形描述
***************主要参数:data_len 数据长度 长整形
***************主要参数:p_inter_perm 交换模式指针
***************主要参数:p_data待要编码的数据指针
***************主要参数:p_code编码后的码子指针
***************Copyright 2004-2008  
***************$Revision: 1.0 $ $Date: 2004/11/04 13:37:18 $  函数版
*******************************************************************************************************/


void TD_SCDMA_turbo_encoder( int data_len,  int *p_inter_perm,inputdata_type *p_data,outputdata_type *p_code)
{
/*******************************************************************************************
***********************数据定义区***********************************************************
********************************************************************************************/	
 int i;
 //int M=3;
 outputdata_type *p_parity_1,*p_parity_11;
 outputdata_type *p_parity_2,*p_parity_21;
 outputdata_type *p_code1;//p_code1=p_code 这是为了不改变p_code,但是又能使用指针加快速度,所以只对p_code1操作 其他情况类似
 int *p_inter_perm1;
 inputdata_type *p_interweav_data,*p_interweav_data1;
 inputdata_type *p_data1;


 p_inter_perm1=p_inter_perm;
 p_code1=p_code;
 p_data1=p_data;



 p_parity_1=(outputdata_type*)calloc(data_len+M,sizeof(outputdata_type));//the first sub code
 p_parity_11=p_parity_1;
 p_parity_2=(outputdata_type*)calloc(data_len+M,sizeof(outputdata_type));//the second sub code
 p_parity_21=p_parity_2;



 p_interweav_data=(inputdata_type*)calloc(data_len+M,sizeof(inputdata_type));//the data after interweave
 p_interweav_data1=p_interweav_data;
 /*******************************************************************************************
***********************数据定义区结束********************************************************
********************************************************************************************/
 

/*******************************************************************************************
***********************数据交织*************************************************************
********************************************************************************************/

 /* for(i=0;i<data_len;i++)
    p_interweav_data[i]=p_data[p_inter_perm[i]];//interweave */

    for(i=0;i<data_len;i++)
       *(p_interweav_data1++)=*(p_data1+*(p_inter_perm1++));
 

/*******************************************************************************************
***********************数据交织结束**********************************************************
********************************************************************************************/

/*******************************************************************************************
***********************两个子编码码器编码****************************************************
********************************************************************************************/
 TD_SCDMA_RSC_encoder(p_data,p_parity_1,data_len);;//first RSC encoder and generate M tail bits of data
 TD_SCDMA_RSC_encoder(p_interweav_data,p_parity_2,data_len);;//second RSC encoder and generate M tail bits of interweave_data 


/*******************************************************************************************
***********************两个子编码码器编码结束***********************************************
********************************************************************************************/


/*******************************************************************************************
***********************0到data_lengt比特排列*************************************************
********************************************************************************************/

 /*for(i=0;i<data_len;i++)
     {
	 p_code[3*i]=p_data[i];
     p_code[3*i+1]=p_parity_1[i];
     p_code[3*i+2]=p_parity_2[i];
     }*/
 for(i=0;i<data_len;i++)
     {
	 *(p_code1++)=*(p_data1++);
     *(p_code1++)=*(p_parity_11++);
     *(p_code1++)=*(p_parity_21++);
     }
    
/*******************************************************************************************
***********************0到data_lengt比特排列结束********************************************
********************************************************************************************/



/*******************************************************************************************
***********************尾比特排列***********************************************************
********************************************************************************************/
for (i=0;i<M;i++)
   { 
     p_code[data_len*3+i*2]=p_data[data_len+i];
     p_code[data_len*3+i*2+1]=p_parity_1[data_len+i];
     p_code[data_len*3+2*M+i*2]=p_interweav_data[data_len+i];
     p_code[data_len*3+2*M+i*2+1]=p_parity_2[data_len+i];//ongly adapt to 2 RSC encoder 
    }
/***************************test************************************************************
for(i=0;i<data_len+(*trellis).M;i++)
cout<<p_data[i]<<"   "<<p_parity_1[i]<<"   "<<p_interweav_data[i]<<"   "<<p_parity_2[i]<<endl;

/*******************************************************************************************
***********************尾比特排列结束*******************************************************
********************************************************************************************/

/*******************************************************************************************
***********************释放无用的空间*******************************************************
********************************************************************************************/
free(p_parity_1);//p_parity_1=NULL;
free(p_parity_2);//p_parity_2=NULL;
free(p_interweav_data);//p_interweav_data=NULL;
/*******************************************************************************************
***********************释放无用的空间结束***************************************************
********************************************************************************************/

}
/*******************************************************************************************
***********************TD_SCDMA_turbo_encoder结束*******************************************
********************************************************************************************/	

⌨️ 快捷键说明

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