www.pudn.com > wimax_ofdm_implementation_code.rar > preamble.c
/*****************************************************************************/
/* FIle Name : preamble.c */
/* Description : WiMax OFDM Preamble Encoder */
/* author : miffie */
/* Date : oct/31/05 */
/* Copyright (c) 2005 miffie All rights reserved. */
/*****************************************************************************/
///////////////////////////////////////////////////////////////////////////////
struct complexset ofdm_symbol( struct complexset datain, char CP ) { //
struct complexset cset0 , cset1;
//OFDM IFFT
cset0 = idft256 ( datain ) ;
cset1 = extract_complexset(cset0 , 256-CP , CP ) ; //Guard Interval
cset1 = cat_complexset(cset1 , cset0 ) ;
return( cset1 ) ;
} //ofdm_symbol
struct complexset preamble( char CP ) { //
struct complexset cset0, cset1 ;
struct complex *ctmp1, *ctmp2 ;
int ii ;
static char Pall[]={ 1,-1, 1,-1, -1,-1, 1, 1, 1,-1, 1,-1, -1, 1, 1,-1, 1,-1, 1,-1,
1, 1, -1,-1, 1, 1, 1, 1, -1,-1, 1, 1, -1,-1, -1,-1, 1,-1, -1, 1,
1,-1, 1,-1, -1,-1, 1, 1, 1,-1, 1,-1, -1, 1, 1,-1, 1,-1, 1,-1,
1, 1, -1,-1, 1, 1, 1, 1, -1,-1, 1, 1, -1,-1, -1,-1, 1,-1, -1, 1,
1,-1, 1,-1, -1,-1, 1, 1, 1,-1, 1,-1, -1, 1, 1,-1, 1,-1, 1,-1,
1, 1, -1,-1, 1, 1, 1, 1, -1,-1, 1, 1, -1,-1, -1,-1, 1,-1, -1, 1,
1, 1, 1, 1, 1,-1, -1, 1, 1, 1, 1, 1, -1,-1, 1, 1, 1, 1, 1, 1,
-1, 1, 1,-1, -1, 1, -1, 1, 1,-1, -1, 1, 1,-1, 1,-1, 1, 1, -1,-1,
-1,-1, -1,-1, -1, 1, 1,-1, -1,-1, -1,-1, 1, 1, -1,-1, -1,-1, -1,-1,
1,-1, -1, 1, 1,-1, 1,-1, -1, 1, 1,-1, -1, 1, -1, 1, -1,-1, 1, 1,
0,0,
-1,-1, 1, 1, -1, 1, -1, 1, -1,-1, 1, 1, 1, 1, 1, 1, -1,-1, 1, 1,
1,-1, 1,-1, 1,-1, -1, 1, -1, 1, 1, 1, -1, 1, 1,-1, -1,-1, -1,-1,
-1, 1, 1,-1, 1, 1, 1, 1, -1, 1, 1,-1, 1,-1, 1,-1, -1, 1, 1,-1,
-1,-1, -1,-1, -1,-1, 1, 1, 1, 1, 1, 1, 1, 1, -1,-1, -1, 1, -1, 1,
1, 1, -1,-1, 1,-1, 1,-1, 1, 1, -1,-1, -1,-1, -1,-1, 1, 1, -1,-1,
-1, 1, -1, 1, -1, 1, 1,-1, 1,-1, 1,-1, 1,-1, -1, 1, 1, 1, 1, 1,
-1,-1, 1, 1, -1, 1, -1, 1, -1,-1, 1, 1, 1, 1, 1, 1, -1,-1, 1, 1,
1,-1, 1,-1, 1,-1, -1, 1, -1, 1, -1, 1, -1, 1, 1,-1, -1,-1, -1,-1,
1,-1, -1, 1, -1,-1, -1,-1, 1,-1, -1, 1, -1, 1, -1, 1, 1,-1, -1, 1,
1, 1, 1, 1, 1, 1, -1,-1, -1,-1, -1,-1, -1,-1, 1, 1, 1,-1, 1,-1 };
if ((ctmp1 = (struct complex *)malloc(256*sizeof(struct complex))) == NULL) { //fail
PRINTF( " malloc failed in preamble\n") ;
} //fail
else { //allocated
PRINTF("preamble CP=%d\n", CP ) ;
//SHORT Sequence
//P4x64 equation(78)
for (ii=-128;ii<128;ii++) { //shortseq
ctmp1[ ii+128 ].realp = (abs(ii)>100) ? 0 :
((ii%4)==0) ? 2*Pall[(ii+100)*2] : 0 ;
ctmp1[ ii+128 ].image = (abs(ii)>100) ? 0 :
((ii%4)==0) ? -2*Pall[(ii+100)*2+1] : 0 ;
} //shortseq
cset0.size = 256 ;
cset0.data = ctmp1 ;
print_complexset( cset0 ) ;
cset0 = ofdm_symbol ( cset0, CP ) ;
//LONG Sequence
//Peven equation(79)
for (ii=-128;ii<128;ii++) { //longseq
ctmp1[ ii+128 ].realp = (abs(ii)>100) ? 0 :
((ii%2)==0) ? root2*Pall[(ii+100)*2] : 0 ;
ctmp1[ ii+128 ].image = (abs(ii)>100) ? 0 :
((ii%2)==0) ? root2*Pall[(ii+100)*2+1] : 0 ;
} //longseq
cset1.size = 256 ;
cset1.data = ctmp1 ;
cset1 = ofdm_symbol ( cset1, CP ) ;
cset0 = cat_complexset(cset0 , cset1 ) ;
} //allocated
return( cset0 ) ;
} //preamble