www.pudn.com > wimax_ofdm_implementation_code.rar > constellation.c


/*****************************************************************************/
/*   FIle Name : constellation.c                                             */
/*   Description : WiMax OFDM Subcarrier constellation Decoder               */
/*   author : miffie                                                         */
/*   Date   : Nov/03/05                                                      */
/*   Copyright (c) 2005 miffie   All rights reserved.                        */
/*****************************************************************************/
struct binaryset constellation (struct complexset datain, 
                          char Nbpsc ) {
int 	ii ;
char 	shifter ;
double 	realp, image ;
char    pilot_polarity ;
struct 	binaryset bset ;
char  	*top ;
char    *pp ;
static  char  bpsk_map[] = {1, -1 } ;
static  char  qpsk_map[] = {1, -1 } ;
static  char  qam16_map[] = {1, 3, -1, 3 } ; //Gray coded
static  char  qam64_map[] = {3, 1, 5, 7, -3, -1, -5, -7 } ; //Gray coded

static  double Kmod_bpsk = 1 ;	
static  double Kmod_qpsk = 0.70710678 ; //1/(sqrt (2)) ;	
static  double Kmod_qam16 = 0.31622777 ;
static  double Kmod_qam64 = 0.15430335 ;

  //Main 
    if ((top = (char *)malloc(datain.size*Nbpsc*sizeof(char)) ) == NULL) {
        PRINTF( " malloc failed in constellation.c\n") ;
    } //fail
    else { //allocated
     PRINTF("constellation size=%d \n", datain.size ) ;

     pp= top ;
     for(ii=0;ii 0xf ) *pp = 0xf ;
                 else if (*pp <0 ) *pp = 0 ;
                 //printf("%d realp=%6.3f  %x\n", ii, realp, *pp );
                 pp++ ;
                 break ;
                } //BPSK
            case 2: { //QPSK
                 *pp = ((Kmod_qpsk-realp) * 16)/(2*Kmod_qpsk) ;
                 if( *pp > 0xf ) *pp = 0xf ;
                 else if (*pp <0 ) *pp = 0 ;
                 pp++ ;
                 *pp = ((Kmod_qpsk-image) * 16)/(2*Kmod_qpsk) ;
                 if( *pp > 0xf ) *pp = 0xf ;
                 else if (*pp <0 ) *pp = 0 ;
                 pp++ ;
                 break ;
                } //QPSK
            case 4: { //16QAM
                 *pp = ((-realp + Kmod_qam16) * 16)/(2*Kmod_qam16) ;
                 if( *pp > 0xf ) *pp = 0xf ;
                 else if (*pp <0 ) *pp = 0 ;
                 pp++ ;
                 *pp = (( fabs(realp)-Kmod_qam16 ) * 16)/(2*Kmod_qam16) ;
                 if( *pp > 0xf ) *pp = 0xf ;
                 else if (*pp <0 ) *pp = 0 ;
                 pp++ ;

                 *pp = ((-image + Kmod_qam16) * 16)/(2*Kmod_qam16) ;
                 if( *pp > 0xf ) *pp = 0xf ;
                 else if (*pp <0 ) *pp = 0 ;
                 pp++ ;
                 *pp = (( fabs(image)-Kmod_qam16 ) * 16)/(2*Kmod_qam16) ;
                 if( *pp > 0xf ) *pp = 0xf ;
                 else if (*pp <0 ) *pp = 0 ;
                 pp++ ;
                 break ;
                } //16QAM
            default: { //64QAM
                 *pp = ((-realp + Kmod_qam64) * 16)/(2*Kmod_qam64) ;
                 if( *pp > 0xf ) *pp = 0xf ;
                 else if (*pp <0 ) *pp = 0 ;
                 pp++ ;
                 *pp = (( fabs(realp)-Kmod_qam64*3 ) * 16)/(2*Kmod_qam64) ;
                 if( *pp > 0xf ) *pp = 0xf ;
                 else if (*pp <0 ) *pp = 0 ;
                 pp++ ;
                 *pp = (( fabs(fabs(realp)-4*Kmod_qam64)-Kmod_qam64) * 16)/
                      (2*Kmod_qam64) ;
                 if( *pp > 0xf ) *pp = 0xf ;
                 else if (*pp <0 ) *pp = 0 ;
                 pp++ ;

                 *pp = ((-image + Kmod_qam64) * 16)/(2*Kmod_qam64) ;
                 if( *pp > 0xf ) *pp = 0xf ;
                 else if (*pp <0 ) *pp = 0 ;
                 pp++ ;
                 *pp = (( fabs(image)-Kmod_qam64*3 ) * 16)/(2*Kmod_qam64) ;
                 if( *pp > 0xf ) *pp = 0xf ;
                 else if (*pp <0 ) *pp = 0 ;
                 pp++ ;
                 *pp = (( fabs(fabs(image)-4*Kmod_qam64)-Kmod_qam64) * 16)/
                      (2*Kmod_qam64) ;
                 if( *pp > 0xf ) *pp = 0xf ;
                 else if (*pp <0 ) *pp = 0 ;
                 pp++ ;
                 break ;
                } //64QAM
          }//switch
     } //each subcarrier

     bset.size = datain.size*Nbpsc ;
     bset.format = 1 ;
     bset.data = top ;
    }//allocated
    free ( datain.data ) ;
    return ( bset ) ;
} //constellation