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


/*****************************************************************************/
/*   FIle Name : longtrack.c                                                 */
/*   Description : WiMax LONGsequence Decoder to initialize track SRAM       */
/*   author : miffie                                                         */
/*   Date   : Nov/04/05                                                      */
/*   Copyright (c) 2005 miffie   All rights reserved.                        */
/*****************************************************************************/
///////////////////////////////////////////////////////////////////////////////

struct complexset long_track( struct complexset datain ) { // 
struct  complexset cset ;
struct  complexset ctop ;
struct  complex  *top  ;
struct  complex  tmp1  ;
double  phase, lpfout ;
int	ii , jj ;
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 };

  //Main 
    if ((top = (struct complex *)malloc(201*sizeof(struct complex)) ) == NULL) {
        PRINTF( " malloc failed in long_track.c\n") ;
    } //fail
    else { //allocated
     PRINTF("long_track size=%d \n", datain.size ) ;
     lpfout = 0 ;
     for(ii=-100;ii<=100;ii+=2) { //each EVEN subcarrier
       if (ii!=0) {//not zero
        tmp1.realp = Pall[ii*2+200]*root2 ; 
        tmp1.image = Pall[ii*2+201]*root2 ; 
        tmp1 = division_complex(tmp1, datain.data[ii+128]) ;
        top[ii+100].realp  = tmp1.realp ; 
        top[ii+100].image  = tmp1.image ; 
        tmp1 = cordic( tmp1 )  ;
        if ((abs(ii)<100)&(abs(ii)>2))  { //not edge
          phase = phase - tmp1.image ;
          phase = (phase<-pi) ? phase+(2*pi) : 
                  (phase>=pi) ?  phase-(2*pi) : phase ;
          lpfout = iir_lpf( phase, lpfout, (double)(1.0/16.0) )   ;
        } //not edge 
        phase = tmp1.image ;
      }//not zero
     } //each EVEN subcarrier
     
     tmp1.realp = cos( lpfout/2 ) ;
     tmp1.image = -sin( lpfout/2 ) ;
     for(ii=-99;ii<=-1;ii+=2) { //each ODD subcarrier
       top[ii+100]  = multiply_complex(top[ii+99], tmp1) ; 
     } //each ODD subcarrier
     tmp1.image = -tmp1.image ;
     for(ii=1;ii<=99;ii+=2) { //each ODD subcarrier
       top[ii+100]  = multiply_complex(top[ii+101], tmp1) ; 
     } //each ODD subcarrier

     cset.size = 201 ;
     cset.data = top ;
    } //allocated
    free ( datain.data ) ;
    return( cset ) ;
} //long_track