IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Jan 17, 2008, 8:41:08 AM (19 years ago)
Author:
eugene
Message:

converting fft and fftn to code from Jones, with Magnier version of multi-dim

File:
1 edited

Legend:

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

    r16099 r16107  
    22
    33// fft based on code by Douglas L. Jones (see note at EOF). modified for Ohana C style
    4 void fftN (float *data, int *nn, int ndim, int isign) {
    5  
    6   fprintf (stderr, "broken\n");
    7   return;
    8 }
    9 
    10 void fft (float *x, float *y, int n, int Nbit, int forward) {
     4void fft1D (float *x, float *y, int n, int Nbit, int forward) {
    115
    126  int i,j,k,n1,n2;
     
    7569}                         
    7670
     71// This implementation uses the 1-D fft above for each of the vectors in each dimension.
     72// This requires 2(Nx*Ny*...) mem copies, but the fft operations are likely to happen in
     73// cache.
     74int fftND (float *x, float *y, int Ndim, int *Nsize, int forward) {
     75
     76  int i, nIndex, minor, major, iDim;
     77  int step, Nmajor, Nminor, Nmax, Ntotal;
     78  int *Nbit;
     79  float *tmpX, *tmpY;
     80
     81  ALLOCATE (Nbit, int, Ndim);
     82
     83  // find the longest axis and allocate storage for that length
     84  Nmax = 0;
     85  Ntotal = 1;
     86  for (i = 0; i < Ndim; i++) {
     87    Nmax = MAX(Nmax, Nsize[i]);
     88    Ntotal *= Nsize[i];
     89    if (!IsBinary (Nsize[i], &Nbit[i])) {
     90      free (Nbit);
     91      return (FALSE);
     92    }
     93  }
     94  ALLOCATE (tmpX, float, Nmax);
     95  ALLOCATE (tmpY, float, Nmax);
     96 
     97  step = 1;
     98  Nminor = 1;
     99  Nmajor = Ntotal;
     100  for (iDim = 0; iDim < Ndim; iDim++) {
     101    step *= Nsize[iDim];
     102    Nmajor /= Nsize[iDim];
     103
     104    // we perform the FFT along all other dimensions
     105    for (major = 0; major < Nmajor; major++) {
     106      for (minor = 0; minor < Nminor; minor++) {
     107        // nIndex = minor + i*Nminor + major*step;
     108        // extract the data values to the temp vector
     109        nIndex = minor + major*step;
     110        for (i = 0; i < Nsize[iDim]; i++) {
     111          tmpX[i] = x[nIndex];
     112          tmpY[i] = y[nIndex];
     113          nIndex += Nminor;
     114        }
     115
     116        fft1D (tmpX, tmpY, Nsize[iDim], Nbit[iDim], forward);
     117
     118        // replace the result vectors
     119        nIndex = minor + major*step;
     120        for (i = 0; i < Nsize[iDim]; i++) {
     121          x[nIndex] = tmpX[i];
     122          y[nIndex] = tmpY[i];
     123          nIndex += Nminor;
     124        }
     125      }
     126    }
     127    Nminor *= Nsize[iDim];
     128  }
     129  free (tmpX);
     130  free (tmpY);
     131  return (TRUE);
     132}
     133
    77134// check that a number is binary (2^Nbit).  returns int(log_2(N)) in Nbit
    78135int IsBinary (int N, int *Nbit) {
     
    80137  int i, Nset;
    81138
    82   *Nbit = 0;
     139  if (Nbit != NULL) *Nbit = 0;
    83140  Nset = 0;
    84141  for (i = 0; i < 8*sizeof(int); i++) {
    85142    if (N & 0x01) {
    86143      Nset ++;
    87       *Nbit = i;
     144      if (Nbit != NULL) *Nbit = i;
    88145    }
    89146    N >>= 1;
    90147  }
    91148  if (Nset > 1) return (FALSE);
     149  return (TRUE); 
    92150}
    93151
Note: See TracChangeset for help on using the changeset viewer.