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