📄 ctc_enc.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 + -