IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Jan 16, 2008, 1:10:16 PM (19 years ago)
Author:
eugene
Message:

working on the fft function

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Ohana/src/opihi/lib.data/fftold.c

    r16094 r16099  
    33#define FSWAP(a,b) tempr=(a);(a)=(b);(b)=tempr
    44
    5 void fft (float *Data, int N, int isign) {
     5void fftold (float *Data, int N, int isign) {
    66
    77  int n,mmax,m,j,istep,i;
     
    5151}
    5252
    53 void fftold (float *Data, int N, int isign) {
    54 
    55   int n,mmax,m,j,istep,i;
     53void fftold_Nindices (float *Data, int N, int isign) {
     54
     55  int n,ifp1,m,j,ipf2,i;
    5656  double wtemp,wr,wpr,wpi,wi,theta;
    5757  float tempr,tempi, *data;
    5858
    59   data = Data - 1;
     59  data = Data;
    6060  n = N << 1;
    61   j = 1;
    62 
    63   for (i = 1; i < n; i+=2) {
    64     if (j > i) {
    65       FSWAP (data[j], data[i]);
    66       FSWAP (data[j+1], data[i+1]);
    67     }
    68     m = n >> 1;
    69     while (m >= 2 && j > m) {
    70       j -= m;
    71       m >>= 1;
    72     }
    73     j += m;
    74   }
    75   mmax = 2;
    76   while (n > mmax) {
    77     istep = 2*mmax;
    78     theta = 6.28318530717959 / (isign*mmax);
     61
     62  ip1 = 2;
     63  ip2 = n;
     64  i2rev = 0;
     65  for (i2 = 0; i2 < ip2; i2 += ip1) {
     66    if (i2 < i2ref) {
     67      FSWAP (data[i2rev], data[i2]);
     68      FSWAP (data[i2rev+1], data[i2+1]);
     69    }
     70    ibit = ip2 >> 1;
     71    while (ibit >= ip1 && i2rev >= ibit) {
     72      i2rev -= ibit;
     73      ibit >>= 1;
     74    }
     75    i2rev += ibit;
     76  }
     77
     78  ifp1 = 2;
     79  while (ifp1 < ip2) {
     80    ifp2 = ifp1 << 1;
     81    theta = isign*6.28318530717959 / (2*ifp1/ip1);
    7982    wtemp = sin(0.5*theta);
    8083    wpr = -2.0*wtemp*wtemp;
     
    8285    wr = 1.0;
    8386    wi = 0.0;
    84     for (m = 1; m < mmax; m+=2) {
    85       for (i = m; i <= n; i+=istep) {
    86         j = i + mmax;
    87         tempr = wr*data[j] - wi*data[j+1];
    88         tempi = wr*data[j+1] + wi*data[j];
    89         data[j] = data[i] - tempr;
    90         data[j+1] = data[i+1] - tempi;
    91         data[i] += tempr;
    92         data[i+1] += tempi;
     87    for (i3 = 0; i3 < ifp1; i3+=ip1) {
     88      // in the N-d version, this loop is broken into two loops
     89      for (i1 = i3; i1 < n; i1+=ipf2) {
     90        k1 = i1;
     91        k2 = k1 + ifp1;
     92        tempr = wr*data[k2] - wi*data[k2+1];
     93        tempi = wr*data[k2+1] + wi*data[k2];
     94        data[k2] = data[k1] - tempr;
     95        data[k2+1] = data[k1+1] - tempi;
     96        data[k1] += tempr;
     97        data[k1+1] += tempi;
    9398      }
    9499      wr = (wtemp = wr)*wpr - wi*wpi+wr;
    95100      wi = wi*wpr + wtemp*wpi + wi;
    96101    }
    97     mmax = istep;
    98   }
     102    ifp1 = ifp2;
     103  }
     104
    99105}
    100106
    101107/* convert indices to zero reference */
    102 void fftN (float *data, int *nn, int ndim, int isign) {
     108void fftNold (float *data, int *nn, int ndim, int isign) {
    103109
    104110  int i1,i2,i3,i2rev,i3rev,ip1,ip2,ip3,ifp1,ifp2;
     
    138144    while (ifp1 < ip2) {
    139145      ifp2 = ifp1 << 1;
    140       theta = isign*6.28318530717959/(ifp2/ip1);
     146      theta = isign*6.28318530717959/(2*ifp1/ip1);
    141147      wtemp = sin(0.5*theta);
    142148      wpr = -2.0*wtemp*wtemp;
     
    182188*/
    183189
    184 int IsBinary (int N) {
     190int IsBinaryOld (int N) {
    185191
    186192  int i, nbit;
     
    199205
    200206
    201 
    202 #define FSWAP(a,b) tempr=(a);(a)=(b);(b)=tempr
    203 
    204 void fourn (float *data, int *nn, int ndim, int isign) {
    205 
    206   int i1,i2,i3,i2rev,i3rev,ip1,ip2,ip3,ifp1,ifp2;
    207   int ibit,idim,k1,k2,n,nprev,nrem,ntot;
    208   float tempi,tempr;
    209   double theta,wi,wpi,wpr,wr,wtemp;
    210 
    211   ntot = 1;
    212   for (idim = 1; idim <= ndim; idim++)
    213     ntot *= nn[idim];
    214   nprev = 1;
    215   for (idim = ndim; idim >= 1; idim--) {
    216     n = nn[idim];
    217     nrem = ntot/(n*nprev);
    218     ip1 = nprev << 1;
    219     ip2 = ip1*n;
    220     ip3 = ip2*nrem;
    221     i2rev = 1;
    222     for (i2 = 1; i2 <= ip2; i2+=ip1) {
    223       if (i2 < i2rev) {
    224         for (i1 = i2; i1 <= i2+ip1-2; i1+=2) {
    225           for (i3 = i1; i3 <= ip3;i3+=ip2) {
    226             i3rev = i2rev+i3-i2;
    227             FSWAP(data[i3],data[i3rev]);
    228             FSWAP(data[i3+1],data[i3rev+1]);
    229           }
    230         }
    231       }
    232       ibit = ip2 >> 1;
    233       while (ibit >= ip1 && i2rev > ibit) {
    234         i2rev -=  ibit;
    235         ibit >>= 1;
    236       }
    237       i2rev += ibit;
    238     }
    239     ifp1 = ip1;
    240     while (ifp1 < ip2) {
    241       ifp2 = ifp1 << 1;
    242       theta = isign*6.28318530717959/(ifp2/ip1);
    243       wtemp = sin(0.5*theta);
    244       wpr  =  -2.0*wtemp*wtemp;
    245       wpi = sin(theta);
    246       wr = 1.0;
    247       wi = 0.0;
    248       for (i3 = 1;i3<=ifp1;i3+=ip1) {
    249         for (i1 = i3;i1<=i3+ip1-2;i1+=2) {
    250           for (i2 = i1;i2<=ip3;i2+=ifp2) {
    251             k1 = i2;
    252             k2 = k1+ifp1;
    253             tempr = wr*data[k2]-wi*data[k2+1];
    254             tempi = wr*data[k2+1]+wi*data[k2];
    255             data[k2] = data[k1]-tempr;
    256             data[k2+1] = data[k1+1]-tempi;
    257             data[k1] += tempr;
    258             data[k1+1] += tempi;
    259           }
    260         }
    261         wr = (wtemp = wr)*wpr-wi*wpi+wr;
    262         wi = wi*wpr+wtemp*wpi+wi;
    263       }
    264       ifp1 = ifp2;
    265     }
    266     nprev *= n;
    267   }
    268 }
    269 
    270 #undef FSWAP
Note: See TracChangeset for help on using the changeset viewer.