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


/*****************************************************************************/
/*   FIle Name : mask_sc.c                                                   */
/*   Description : WiMax OFDM Subcarrier Mask                                */
/*   author : miffie                                                         */
/*   Date   : Nov/01/05                                                      */
/*   Copyright (c) 2005 miffie   All rights reserved.                        */
/*****************************************************************************/
void mask_set ( char *mask ,  char *group ) { //mask_set
//set mask[group] =1 ;
char ii ;
  for(ii=0;ii<12;ii++)  mask[128+(group[ii])] = 1 ; 
} //mask_set


void mask_sc ( char *mask, char index ) { //mask_sc
//0: No energy on the subcarrier
//1: send data on the subcarrier
int 	ii , pp ;
char  sc_group[16][12] = {{-100,-99,-98,-37,-36,-35, 1, 2, 3,64,65,66},
                          {-97,-96,-95,-34,-33,-32, 4, 5, 6,67,68,69},
                          {-94,-93,-92,-31,-30,-29, 7, 8, 9,70,71,72},
                          {-91,-90,-89,-28,-27,-26,10,11,12,73,74,75},
                          {-87,-86,-85,-50,-49,-48,14,15,16,51,52,53},
                          {-84,-83,-82,-47,-46,-45,17,18,19,54,55,56},
                          {-81,-80,-79,-44,-43,-42,20,21,22,57,58,59},
                          {-78,-77,-76,-41,-40,-39,23,24,25,60,61,62},
                          {-75,-74,-73,-12,-11,-10,26,27,28,89,90,91},
                          {-72,-71,-70, -9, -8, -7,29,30,31,92,93,94},
                          {-69,-68,-67, -6, -5, -4,32,33,34,95,96,97},
                          {-66,-65,-64, -3, -2, -1,35,36,37,98,99,100},
                          {-62,-61,-60,-25,-24,-23,39,40,41,76,77,78},
                          {-59,-58,-57,-22,-21,-20,42,43,44,79,80,81},
                          {-56,-55,-54,-19,-18,-17,45,46,47,82,83,84},
                          {-53,-52,-51,-16,-15,-14,48,49,50,85,86,87} } ;
char  sc_pilot[] = { -38, 13, -88, 63, -13, 38, -63, 88 } ;

  //Guard band
  for(ii=-128;ii<-100;ii++) mask[ii+128] = 0 ;
  for(ii=101;ii<128;ii++) mask[ii+128] = 0 ;
  //DC
  mask[0+128] = 0 ;
  //available carriers
  printf("mask_sc %d\n",  index) ;
  if (index &0x1 ) { //single subchannel
     mask_set( &mask[0], &sc_group[ ((index>>1)&0xf) ][0] ) ; 
  } //single subchannel
  else if (index&0x2) { //two subchannels
     mask_set( &mask[0], &sc_group[ ((index>>1)&0xe)+0 ][0] ) ; 
     mask_set( &mask[0], &sc_group[ ((index>>1)&0xe)+1 ][0] ) ; 
     mask[ sc_pilot[ ((index>>2)&0x7) ] +128 ] = 1 ; 
  } //two subchannels
  else if (index&0x4) { //four subchannels
     mask_set( &mask[0], &sc_group[ ((index>>1)&0xc)+0 ][0] ) ; 
     mask_set( &mask[0], &sc_group[ ((index>>1)&0xc)+1 ][0] ) ; 
     mask[ sc_pilot[ ((index>>2)&0x6) ] +128 ] = 1 ; 
     mask_set( &mask[0], &sc_group[ ((index>>1)&0xc)+2 ][0] ) ; 
     mask_set( &mask[0], &sc_group[ ((index>>1)&0xc)+3 ][0] ) ; 
     mask[ sc_pilot[ ((index>>2)&0x6)+1 ] +128 ] = 1 ; 
  } //four subchannels
  else if (index&0x8) { //eight subchannels
     mask_set( &mask[0], &sc_group[ ((index>>1)&0x8)+0 ][0] ) ; 
     mask_set( &mask[0], &sc_group[ ((index>>1)&0x8)+1 ][0] ) ; 
     mask[ sc_pilot[ ((index>>2)&0x4) ] +128 ] = 1 ; 
     mask_set( &mask[0], &sc_group[ ((index>>1)&0x8)+2 ][0] ) ; 
     mask_set( &mask[0], &sc_group[ ((index>>1)&0x8)+3 ][0] ) ; 
     mask[ sc_pilot[ ((index>>2)&0x4)+1 ] +128 ] = 1 ; 

     mask_set( &mask[0], &sc_group[ ((index>>1)&0x8)+4 ][0] ) ; 
     mask_set( &mask[0], &sc_group[ ((index>>1)&0x8)+5 ][0] ) ; 
     mask[ sc_pilot[ ((index>>2)&0x4)+2 ] +128 ] = 1 ; 
     mask_set( &mask[0], &sc_group[ ((index>>1)&0x8)+6 ][0] ) ; 
     mask_set( &mask[0], &sc_group[ ((index>>1)&0x8)+7 ][0] ) ; 
     mask[ sc_pilot[ ((index>>2)&0x4)+3 ] +128 ] = 1 ; 
  } //eight subchannels
  else if (index==0x10) { //16 sub channels
    for(ii=-100;ii<0;ii++)  mask[ii+128] = 1 ;
    mask[0+128] = 0 ;
    for(ii=1;ii<=100;ii++)  mask[ii+128] = 1 ;
  } //16 subchannels
  else { // no channels assigned
    for(ii=-100;ii<=100;ii++) mask[ii+128] = 0 ;
  } // no channels assigned
  
} //mask_sc