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

📄 ctc_enc.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>>2) &0x1) ^ (*state&0x1) ^ aa ^ bb)<<2 ;   tmp0 += ((((*state>>2) &0x1) ^ bb) & 0x1) << 1 ;   tmp0 += ((((*state>>1)&0x1) ^ bb) & 0x1) ;   tmp1 = (*state&0x1) ^  ((*state>>1)&0x1)  ^ ((tmp0>>2) &0x1) ;   *state = tmp0&0x7 ;   return ( tmp1 ) ;} //constituent_encoder*/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) ;    data[ii*2-2] = datain.data[jj*2-2] ;    data[ii*2-1] = datain.data[jj*2-1] ;    //printf("data(%d)=%x %x\n", ii, data[ii*2-2] , data[ii*2-1] ) ;  } //for  //copy back to datain  for (jj=0;jj<datain.size;jj++) { //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 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) ;        data[jj*2-2] = datain.data[ii*2-2] ;        data[jj*2-1] = datain.data[ii*2-1] ;  } //for  //copy back to datain  for (jj=0;jj<datain.size;jj++) { //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 ;char 	tmp1 , tmp2 , shifter, parity ;short    NN ;char	*qq;struct  binaryset bset0 , bset1 , bset2 ;char    sc1, sc2, state , last_state;char    row, column ;//rowtype, columntype//                            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} ;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 = datain.size *4 ; //ctc_parameters[fec_code_type-13][0] * Nsub ;        PRINTF( "ctc.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]) ;    //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 %d last state=%x", (NN%7) , state ) ;for(jj=0;jj<8;jj++) { //jj    state = jj ;    for(ii=0;ii<bset0.size;ii+=2) { //C1          tmp1  = constituent_encoder (                               bset0.data[ii], bset0.data[ii+1], &state ) ;    } //C1    if(state==0) printf(" initial state=%x\n", jj ) ;}//jj/*    bset0.size = bset0.size/2 ;    //C2 Constituent Encoder    //sc1 &sc2 is not clear, so it leaves as 0. Nov/21/05 Miffie    sc2 = 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<bset0.size;ii+=2) { //C1          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 + -