📄 turboencoder.c
字号:
{
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 + -