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


/*****************************************************************************/
/*   FIle Name : mapper.c                                                    */
/*   Description : WiMax OFDM Subcarrier modulation mapper for Encoder       */
/*   author : miffie                                                         */
/*   Date   : oct/31/05                                                      */
/*   Copyright (c) 2005 miffie   All rights reserved.                        */
/*****************************************************************************/
char pilot_bool( char sc ) { //pilot_bool
//if sc == one of pilots return one,
//otherwise return zero ;
static  pilot_sc[] = { -88, -63, -38, -13, 13, 38, 63, 88 } ;
char ii , bool;
  bool=0 ;
  for(ii=0;ii<8;ii++) {
     if(sc==pilot_sc[ii]) bool = 1 ;
  } 
  return(bool) ;
} //bool

struct complexset mapper (struct binaryset datain, 
                          char Nbpsc,
                          char index,
                          short *pilot_shifter ) {
int 	ii , pp ;
char 	shifter ;
char 	tmp1 ;
char    wk ;
struct 	complexset cset ;
struct  complex    *top ;
char    *p ;
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 ;
char    mask[256] ;

  //Main 
    if ((top = (struct complex *)malloc(256*sizeof(struct complex)) ) == NULL) {
        PRINTF( " malloc failed in mapper.c\n") ;
    } //fail
    else { //allocated
     //OFDM randomizer
     wk = *pilot_shifter & 0x1 ;
     *pilot_shifter = pilot_randomizer( *pilot_shifter ) ;
     PRINTF("mapper size=%d index=%x wk=%d\n", datain.size, index, wk ) ;
     //mask
     mask_sc(&mask[0], index ) ;
     
     p= datain.data ;
     //process each subcarrier
     for(ii=-128;ii<128;ii++) { //each subcarrier
      if ((mask[ii+128])&(pilot_bool(ii))) { //pilot
        //pilot subcarriers
        if ((ii==-63)|(ii==-13)|(ii==13)|(ii==38)) { //DL
        //if ((ii==-63)|(ii==-13)) { //UL
          top[ii+128].realp =  (wk) ? 1 : -1 ;
          top[ii+128].image =  0 ;
        } else { //
          top[ii+128 ].realp =  (wk) ? -1 : 1 ;
          top[ii+128 ].image =  0 ;
        } //
      } //pilot
      else if(mask[ii+128]) { //enabled
        switch ( Nbpsc ) { //switch
          case 1: { //BPSK
            tmp1 = (*p++) ;
            top[ii+128].realp = bpsk_map[ tmp1 ] * Kmod_bpsk;
            top[ii+128].image = 0 ;
            break ;
          } //BPSK
          case 2: { //QPSK
            tmp1 = (*p++) ;
            top[ii+128].realp = qpsk_map[ tmp1 ] * Kmod_qpsk;
            tmp1 = (*p++) ;
            top[ii+128].image = qpsk_map[ tmp1 ] * Kmod_qpsk;
            break ;
          } //QPSK
          case 4: { //16QAM
            tmp1 = (*p++<<1)  ;
            tmp1 += (*p++) ;
            //printf("subcarrier (%d) %d ", ii, tmp1 ) ;
            top[ii+128].realp = qam16_map[ tmp1 ] * Kmod_qam16 ;
            tmp1 = (*p++<<1)  ;
            tmp1 += (*p++) ;
            //printf(" %d\n", tmp1 ) ;
            top[ii+128].image = qam16_map[ tmp1 ] * Kmod_qam16 ;
            break ;
          } //16QAM
          default: { //64QAM
            tmp1 = (*p++<<2)  ;
            tmp1 += (*p++<<1)  ;
            tmp1 += (*p++) ;
            top[ii+128].realp = qam64_map[ tmp1 ] * Kmod_qam64 ;
            tmp1 = (*p++<<2)  ;
            tmp1 += (*p++<<1)  ;
            tmp1 += (*p++) ;
            top[ii+128].image = qam64_map[ tmp1 ] * Kmod_qam64 ;
            break ;
          } //64QAM
        }//switch
      }//enabled
      else { //masked
        top[ii+128].realp = 0 ;
        top[ii+128].image = 0 ;
      } //masked
    } //each subcarrier

    }//allocated
    cset.size = 256 ;
    cset.data = top ;
    free( datain.data ) ;
    return ( cset ) ;
} //mapper