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