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