Changeset 16099 for trunk/Ohana/src/opihi/lib.data/fftold.c
- Timestamp:
- Jan 16, 2008, 1:10:16 PM (19 years ago)
- File:
-
- 1 edited
-
trunk/Ohana/src/opihi/lib.data/fftold.c (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Ohana/src/opihi/lib.data/fftold.c
r16094 r16099 3 3 #define FSWAP(a,b) tempr=(a);(a)=(b);(b)=tempr 4 4 5 void fft (float *Data, int N, int isign) {5 void fftold (float *Data, int N, int isign) { 6 6 7 7 int n,mmax,m,j,istep,i; … … 51 51 } 52 52 53 void fftold (float *Data, int N, int isign) {54 55 int n, mmax,m,j,istep,i;53 void fftold_Nindices (float *Data, int N, int isign) { 54 55 int n,ifp1,m,j,ipf2,i; 56 56 double wtemp,wr,wpr,wpi,wi,theta; 57 57 float tempr,tempi, *data; 58 58 59 data = Data - 1;59 data = Data; 60 60 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); 79 82 wtemp = sin(0.5*theta); 80 83 wpr = -2.0*wtemp*wtemp; … … 82 85 wr = 1.0; 83 86 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; 93 98 } 94 99 wr = (wtemp = wr)*wpr - wi*wpi+wr; 95 100 wi = wi*wpr + wtemp*wpi + wi; 96 101 } 97 mmax = istep; 98 } 102 ifp1 = ifp2; 103 } 104 99 105 } 100 106 101 107 /* convert indices to zero reference */ 102 void fftN (float *data, int *nn, int ndim, int isign) {108 void fftNold (float *data, int *nn, int ndim, int isign) { 103 109 104 110 int i1,i2,i3,i2rev,i3rev,ip1,ip2,ip3,ifp1,ifp2; … … 138 144 while (ifp1 < ip2) { 139 145 ifp2 = ifp1 << 1; 140 theta = isign*6.28318530717959/( ifp2/ip1);146 theta = isign*6.28318530717959/(2*ifp1/ip1); 141 147 wtemp = sin(0.5*theta); 142 148 wpr = -2.0*wtemp*wtemp; … … 182 188 */ 183 189 184 int IsBinary (int N) {190 int IsBinaryOld (int N) { 185 191 186 192 int i, nbit; … … 199 205 200 206 } 201 202 #define FSWAP(a,b) tempr=(a);(a)=(b);(b)=tempr203 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.
