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

📄 ctc_encoder.c

📁 这个文件包括wimax中所有的编解码源代码
💻 C
字号:
/*****************************************************************************//*   FIle Name : ctc_encoder.c                                               *//*   Description : WiMax OFDM FEC Convolutional Turbo Codes                  *//*   author : miffie                                                         *//*   Date   : Nov/21/05                                                      *//*   Copyright (c) 2005 miffie   All rights reserved.                        *//*****************************************************************************/char  constituent_encoder ( char aa, char bb, char *state ) {char  tmp0, tmp1  ;   tmp0 = (*state &0x1) ^ ((*state>>2)&0x1) ^ aa ^ bb ;   tmp0 += (((*state &0x1) ^ bb) & 0x1) << 1 ;   tmp0 += ((((*state>>1)&0x1) ^ bb) & 0x1) << 2 ;   tmp1 = ((*state>>2)&0x1) ^  ((*state>>1)&0x1)  ^ (tmp0 &0x1) ;   *state = tmp0&0x7 ;   return ( tmp1 ) ;} //constituent_encoderstruct binaryset ctc_interleaver (struct binaryset datain,                               char P0 ) { short  ii,jj ;char   tmp1 ;char   data[864] ; //QAM64:27*16*2 short  P1 = 3*datain.size/8 ;  //Step 1: Swich alternate Couples  for (jj=0;jj<datain.size;jj+=4) { //for    tmp1 = datain.data[jj+2] ;    datain.data[jj+2] =  datain.data[jj+3] ;    datain.data[jj+3] = tmp1 ;  }//for  //Step 2: Pi(j)  for (jj=1;jj<=(datain.size/2);jj++) { //for    ii = ((jj%4)==2) ?  (P0*jj+1+(datain.size/8))%(datain.size/2) :         ((jj%4)==3) ?  (P0*jj+1+(datain.size/4))%(datain.size/2) :                        (P0*jj+1)%(datain.size/2) ;    if (ii==0) ii=(datain.size/2) ;    data[ii*2-2] = datain.data[jj*2-2] ;    data[ii*2-1] = datain.data[jj*2-1] ;    //printf("interleaver (%d=>%d) 0b%x%x\n", jj, ii, data[ii*2-2] , data[ii*2-1]  ) ;  } //for  //copy back to datain  for (ii=0;ii<datain.size;ii++) { //for        datain.data[ii] = data[ii] ;  } //for  return( datain ) ;} //ctc_interleaverstruct binaryset ctc_deinterleaver (struct binaryset datain,                               char P0 ) { short  ii,jj ;char   tmp1 ;char   data[864] ; //QAM64:27*16*2 short  P1 = 3*datain.size/8 ;  //Step 2: Pi(j)  for (jj=1;jj<=(datain.size/2);jj++) { //for        ii = ((jj%4)==2) ?  (P0*jj+1+(datain.size/8))%(datain.size/2) :             ((jj%4)==3) ?  (P0*jj+1+(datain.size/4))%(datain.size/2) :                            (P0*jj+1)%(datain.size/2) ;        if (ii==0) ii=(datain.size/2) ;        data[jj*2-2] = datain.data[ii*2-2] ;        data[jj*2-1] = datain.data[ii*2-1] ;        //printf("deinterleaver (%d=>%d) 0b%x%x\n", jj, ii, data[jj*2-2] , data[jj*2-1]  ) ;  } //for  //Step 1: Swich alternate Couples  for (jj=0;jj<datain.size;jj+=4) { //for    tmp1 = data[jj+2] ;    data[jj+2] =  data[jj+3] ;    data[jj+3] = tmp1 ;  }//for  //copy back to datain  for (ii=0;ii<datain.size;ii++) { //for        datain.data[ii] = data[ii] ;  } //for  return( datain ) ;} //ctc_deinterleaverstruct binaryset ctc_encoder (struct binaryset datain,                               char fec_code_type, char Nsub ) {//input format must be 1 int 	ii , jj , kk , NN ;char 	tmp1 , tmp2 , shifter, parity ;char	*qq;struct  binaryset bset0 , bset1 , bset2 ;char    state ;//                            N/Nsub P0 Puncturechar  ctc_parameters[7][3] = { {  6,  7,  1 },                               {  8, 11,  2 },                               {  9, 17,  3 },                               { 12, 11,  1 },                               { 18, 13,  3 },                               { 24, 17,  2 },                               { 27, 17,  3 } } ;char Npsub[7] = { 24, 24, 24, 48, 48, 72, 72} ;//This table is worked well with the current cmodel.//Nov/22/05 Miffiechar sc[7][8] = { {0, 1, 2, 3, 4, 5, 6, 7},                  {0, 4, 5, 1, 2, 6, 7, 3} ,                  {0, 2, 6, 4, 5, 7, 3, 1} ,                  {0, 5, 7, 2, 6, 3, 1, 4} ,                  {0, 6, 3, 5, 7, 1, 4, 2} ,                  {0, 7, 1, 6, 3, 4, 2, 5} ,                  {0, 3, 4, 7, 1, 2, 5, 6} } ;/***********************************************************//This s a Table 221-Circulation state lookup table,//But somehow this does not match with the current cmodel.char sc[7][8] = { {0, 1, 2, 3, 4, 5, 6, 7},                  {0, 6, 4, 2, 7, 1, 3, 5},                  {0, 3, 7, 4, 5, 6, 2, 1},                  {0, 5, 3, 6, 2, 7, 1, 4},                  {0, 4, 1, 5, 6, 2, 7, 3},                  {0, 2, 5, 7, 1, 3, 4, 6},                  {0, 7, 6, 1, 3, 4, 5, 2} } ;***********************************************************/  //Main     NN = ctc_parameters[fec_code_type-13][0] * Nsub ;        PRINTF( "ctc_encoder.c size=%x\n", datain.size ) ;    datain  = byte2binary_MSB( datain ) ;    bset0 = copy_binaryset( datain ) ;    bset1 = copy_binaryset( datain ) ;    bset1 = ctc_interleaver( bset1 ,  ctc_parameters[fec_code_type-13][1]) ;    print_binaryset( bset1 ) ;    //C1 Constituent Encoder    state = 0 ;    for(ii=0;ii<bset0.size;ii+=2) { //C1          tmp1 = constituent_encoder (                               bset0.data[ii], bset0.data[ii+1], &state ) ;    } //C1    printf("C1 last state=%x\n", state ) ;    state = sc[NN%7][state] ;    for(ii=0;ii<bset0.size;ii+=2) { //C1          bset0.data[ii/2]  = constituent_encoder (                               bset0.data[ii], bset0.data[ii+1], &state ) ;    } //C1    printf("C1 last state=%x\n", state ) ;    bset0.size = bset0.size/2 ;    //C2 Constituent Encoder    state = 0 ;    for(ii=0;ii<bset1.size;ii+=2) { //C2          tmp1 = constituent_encoder (                               bset1.data[ii], bset1.data[ii+1], &state ) ;    } //C2    printf("C2 last state=%x\n", state ) ;    state = sc[NN%7][state] ;    for(ii=0;ii<bset1.size;ii+=2) { //C2          bset1.data[ii/2]  = constituent_encoder (                               bset1.data[ii], bset1.data[ii+1], &state ) ;    } //C2    printf("C2 last state=%x\n", state ) ;    bset1.size = bset1.size/2 ;    //Puncturing    if (ctc_parameters[fec_code_type-13][2]==2) { //2:2/3      for(ii=0;ii<bset1.size;ii+=2) { //2:2/3          bset0.data[ii/2] = bset0.data[ii] ;          bset1.data[ii/2] = bset1.data[ii] ;      } //2:2/3      bset0.size = bset0.size/2 ;      bset1.size = bset1.size/2 ;    } //2:2/3    else if (ctc_parameters[fec_code_type-13][2]==3) { //3:3/4      for(ii=0;ii<bset1.size;ii+=3) { //3:3/4          bset0.data[ii/3] = bset0.data[ii] ;          bset1.data[ii/3] = bset1.data[ii] ;      } //3:3/4      bset0.size = bset0.size/3 ;      bset1.size = bset1.size/3 ;    } //3:3/4    //Concatinate the parities    bset0 = cat_binaryset(datain, bset0) ;    bset0 = cat_binaryset(bset0, bset1) ;    //free ( datain.data ) ;    return ( bset0 ) ;} //ctc_encoder

⌨️ 快捷键说明

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