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