Changeset 16107 for trunk/Ohana/src/opihi/lib.data/fft.c
- Timestamp:
- Jan 17, 2008, 8:41:08 AM (19 years ago)
- File:
-
- 1 edited
-
trunk/Ohana/src/opihi/lib.data/fft.c (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Ohana/src/opihi/lib.data/fft.c
r16099 r16107 2 2 3 3 // 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) { 4 void fft1D (float *x, float *y, int n, int Nbit, int forward) { 11 5 12 6 int i,j,k,n1,n2; … … 75 69 } 76 70 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. 74 int 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 77 134 // check that a number is binary (2^Nbit). returns int(log_2(N)) in Nbit 78 135 int IsBinary (int N, int *Nbit) { … … 80 137 int i, Nset; 81 138 82 *Nbit = 0;139 if (Nbit != NULL) *Nbit = 0; 83 140 Nset = 0; 84 141 for (i = 0; i < 8*sizeof(int); i++) { 85 142 if (N & 0x01) { 86 143 Nset ++; 87 *Nbit = i;144 if (Nbit != NULL) *Nbit = i; 88 145 } 89 146 N >>= 1; 90 147 } 91 148 if (Nset > 1) return (FALSE); 149 return (TRUE); 92 150 } 93 151
Note:
See TracChangeset
for help on using the changeset viewer.
