Changeset 16099
- Timestamp:
- Jan 16, 2008, 1:10:16 PM (18 years ago)
- Location:
- trunk/Ohana/src/opihi
- Files:
-
- 2 added
- 8 edited
-
cmd.data/Makefile (modified) (1 diff)
-
cmd.data/fft1d.c (modified) (1 diff)
-
cmd.data/fft1d.old.c (added)
-
cmd.data/fft2d.c (modified) (1 diff)
-
cmd.data/init.c (modified) (2 diffs)
-
cmd.data/test/fft1d.sh (added)
-
include/data.h (modified) (1 diff)
-
lib.data/Makefile (modified) (1 diff)
-
lib.data/fft.c (modified) (5 diffs)
-
lib.data/fftold.c (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Ohana/src/opihi/cmd.data/Makefile
r16013 r16099 42 42 $(SRC)/erase.$(ARCH).o \ 43 43 $(SRC)/extract.$(ARCH).o \ 44 $(SRC)/fft1d.old.$(ARCH).o \ 44 45 $(SRC)/fft1d.$(ARCH).o \ 45 46 $(SRC)/fft2d.$(ARCH).o \ -
trunk/Ohana/src/opihi/cmd.data/fft1d.c
r16094 r16099 50 50 } 51 51 52 fft (Ore[0].elements, Oim[0].elements, Npix, Nbit );52 fft (Ore[0].elements, Oim[0].elements, Npix, Nbit, TRUE); 53 53 54 54 return (TRUE); -
trunk/Ohana/src/opihi/cmd.data/fft2d.c
r7917 r16099 42 42 Ny = Ire[0].header.Naxis[1]; 43 43 Naxis[0] = Ny; Naxis[1] = Nx; 44 if (!IsBinary (Npix)) {44 if (!IsBinaryOld (Npix)) { 45 45 gprint (GP_ERR, "dimensions are not binary!\n"); 46 46 return (FALSE); -
trunk/Ohana/src/opihi/cmd.data/init.c
r16013 r16099 26 26 int erase PROTO((int, char **)); 27 27 int extract PROTO((int, char **)); 28 int fft1dold PROTO((int, char **)); 28 29 int fft1d PROTO((int, char **)); 29 30 int fft2d PROTO((int, char **)); … … 145 146 {"erase", erase, "erase objects on an overlay"}, 146 147 {"extract", extract, "extract a portion of a buffer into another buffer"}, 148 {"fft1dold", fft1dold, "fft on the pixel-stream in an image"}, 147 149 {"fft1d", fft1d, "fft on the pixel-stream in an image"}, 148 150 {"fft2d", fft2d, "fft on an image"}, -
trunk/Ohana/src/opihi/include/data.h
r16094 r16099 84 84 85 85 /* in fft.c */ 86 void fft (float *dataRe, float *dataIm, int N, int Nbit );86 void fft (float *dataRe, float *dataIm, int N, int Nbit, int forward); 87 87 void fftN (float *data, int *nn, int ndim, int isign); 88 int IsBinary (int N); 89 void fourn (float *data, int *nn, int ndim, int isign); 88 int IsBinary (int N, int *Nbit); 89 90 // fftold.c 91 void fftold (float *Data, int N, int isign); 92 void fftNold (float *data, int *nn, int ndim, int isign); 93 int IsBinaryOld (int N); 90 94 91 95 /* in gaussj.c */ -
trunk/Ohana/src/opihi/lib.data/Makefile
r16040 r16099 19 19 $(SDIR)/page.$(ARCH).o \ 20 20 $(SDIR)/fft.$(ARCH).o \ 21 $(SDIR)/fftold.$(ARCH).o \ 21 22 $(SDIR)/svdcmp.$(ARCH).o \ 22 23 $(SDIR)/convert.$(ARCH).o \ -
trunk/Ohana/src/opihi/lib.data/fft.c
r16094 r16099 8 8 } 9 9 10 void fft ( double *x, double *y, int n, int Nbit) {10 void fft (float *x, float *y, int n, int Nbit, int forward) { 11 11 12 12 int i,j,k,n1,n2; 13 double c,s,e,a,t1,t2; 13 float c,s,e,a,t1,t2; 14 double factor; 14 15 15 16 // bit-reverse … … 19 20 n1 = n2; 20 21 while ( j >= n1 ) { 21 j = j -n1;22 n1 = n1/2;22 j -= n1; 23 n1 /= 2; 23 24 } 24 j = j +n1;25 j += n1; 25 26 26 27 if (i < j) { … … 33 34 } 34 35 } 35 36 36 37 37 n1 = 0; /* FFT */ 38 38 n2 = 1; 39 39 40 if (forward) { 41 factor = +2.0*M_PI; 42 } else { 43 factor = -2.0*M_PI; 44 } 45 40 46 for (i=0; i < Nbit; i++) { 41 47 n1 = n2; 42 48 n2 = n2 + n2; 43 e = -6.283185307179586/n2;49 e = factor/n2; 44 50 a = 0.0; 45 51 … … 60 66 } 61 67 68 // re-normalize 69 for (i = 0; i < n; i++) { 70 x[i] /= n; 71 y[i] /= n; 72 } 73 62 74 return; 63 75 } 64 76 65 int IsBinary (int N, int *nbin) { 77 // check that a number is binary (2^Nbit). returns int(log_2(N)) in Nbit 78 int IsBinary (int N, int *Nbit) { 66 79 67 // check that a number is binary (2^nbit)80 int i, Nset; 68 81 69 Nbit = 0;82 *Nbit = 0; 70 83 Nset = 0; 71 84 for (i = 0; i < 8*sizeof(int); i++) { 72 85 if (N & 0x01) { 73 86 Nset ++; 74 Nbin= i;87 *Nbit = i; 75 88 } 76 89 N >>= 1; 77 90 } 78 *nbin = Nbit;79 91 if (Nset > 1) return (FALSE); 80 92 } … … 92 104 /* m: n = 2**m */ 93 105 /* input/output */ 94 /* x: doublearray of length n with real part of data */95 /* y: doublearray of length n with imag part of data */106 /* x: float array of length n with real part of data */ 107 /* y: float array of length n with imag part of data */ 96 108 /* */ 97 109 /* Permission to copy and use this program is granted */ -
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.
