Changeset 16107 for trunk/Ohana/src/opihi/cmd.data/fft2d.c
- Timestamp:
- Jan 17, 2008, 8:41:08 AM (19 years ago)
- File:
-
- 1 edited
-
trunk/Ohana/src/opihi/cmd.data/fft2d.c (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Ohana/src/opihi/cmd.data/fft2d.c
r16099 r16107 3 3 int fft2d (int argc, char **argv) { 4 4 5 int i, N, Nx, Ny, Naxis[2]; 6 int Npix, ZeroImaginary, isign; 7 float *t1, *t2, *out, *temp; 5 int ZeroImaginary, forward; 6 int N, Nx, Ny; 8 7 Buffer *Ire, *Iim, *Ore, *Oim;; 9 8 10 isign = 1;9 forward = TRUE; 11 10 if ((N = get_argument (argc, argv, "-inverse"))) { 12 11 remove_argument (N, &argc, argv); 13 isign = -1;12 forward = FALSE; 14 13 } 15 14 … … 28 27 } 29 28 if ((Ire = SelectBuffer (argv[1], OLDBUFFER, TRUE)) == NULL) return (FALSE); 29 30 Nx = Ire[0].header.Naxis[0]; 31 Ny = Ire[0].header.Naxis[1]; 32 33 // check input image dimensions (match lengths? binary lengths?) 34 if (!ZeroImaginary) { 35 if ((Nx != Iim[0].header.Naxis[0]) || 36 (Ny != Iim[0].header.Naxis[1])) { 37 gprint (GP_ERR, "image size mismatch\n"); 38 return (FALSE); 39 } 40 } 41 if (!IsBinary (Nx, NULL)) { 42 gprint (GP_ERR, "Nx is not a binary number!\n"); 43 return (FALSE); 44 } 45 if (!IsBinary (Ny, NULL)) { 46 gprint (GP_ERR, "Ny is not a binary number!\n"); 47 return (FALSE); 48 } 49 30 50 if ((Ore = SelectBuffer (argv[4], ANYBUFFER, TRUE)) == NULL) return (FALSE); 31 51 if ((Oim = SelectBuffer (argv[5], ANYBUFFER, TRUE)) == NULL) return (FALSE); … … 36 56 gfits_free_matrix (&Oim[0].matrix); 37 57 gfits_free_header (&Oim[0].header); 58 59 /* fix up output headers (real) & allocate data buffer */ 60 CreateBuffer (Ore, Nx, Ny, -32, 0.0, 1.0); 61 CreateBuffer (Oim, Nx, Ny, -32, 0.0, 1.0); 38 62 39 /* get image dimensions, check value */ 40 Npix = Ire[0].header.Naxis[0]*Ire[0].header.Naxis[1]; 41 Nx = Ire[0].header.Naxis[0]; 42 Ny = Ire[0].header.Naxis[1]; 43 Naxis[0] = Ny; Naxis[1] = Nx; 44 if (!IsBinaryOld (Npix)) { 45 gprint (GP_ERR, "dimensions are not binary!\n"); 46 return (FALSE); 63 gfits_copy_header (&Ire[0].header, &Ore[0].header); 64 gfits_copy_header (&Ire[0].header, &Oim[0].header); 65 66 // copy data to output buffers (fft is done in place) 67 memcpy (Ore[0].matrix.buffer, Ire[0].matrix.buffer, Nx*Ny*sizeof(float)); 68 69 if (ZeroImaginary) { 70 memset (Oim[0].matrix.buffer, 0, Nx*Ny*sizeof(float)); 71 } else { 72 memcpy (Oim[0].matrix.buffer, Iim[0].matrix.buffer, Nx*Ny*sizeof(float)); 47 73 } 48 49 /* create working space */50 t1 = (float *) Ire[0].matrix.buffer;51 ALLOCATE (temp, float, 2*Npix);52 out = temp;53 74 54 /* copy input to working space */55 if (ZeroImaginary) {56 for (i = 0; i < Npix; i++, t1++) {57 *out = *t1;58 out++;59 *out = 0;60 out++;61 }62 } else {63 t2 = (float *) Iim[0].matrix.buffer;64 for (i = 0; i < Npix; i++, t1++, t2++) {65 *out = *t1;66 out++;67 *out = *t2;68 out++;69 }70 }71 72 75 /* run the fft */ 73 fftN (temp, Naxis, 2, isign); 74 75 /* fix up output headers (real) */ 76 gfits_copy_header (&Ire[0].header, &Ore[0].header); 77 gfits_modify (&Ore[0].header, "NAXIS1", "%d", 1, Nx); 78 gfits_modify (&Ore[0].header, "NAXIS2", "%d", 1, Ny); 79 Ore[0].header.Naxis[0] = Nx; 80 Ore[0].header.Naxis[1] = Ny; 81 Ore[0].bitpix = Ire[0].bitpix; 82 Ore[0].unsign = Ire[0].unsign; 83 Ore[0].bscale = Ire[0].bscale; 84 Ore[0].bzero = Ire[0].bzero; 85 gfits_create_matrix (&Ore[0].header, &Ore[0].matrix); 86 87 /* fix up output headers (imaginary) */ 88 gfits_copy_header (&Ire[0].header, &Oim[0].header); 89 gfits_modify (&Oim[0].header, "NAXIS1", "%d", 1, Nx); 90 gfits_modify (&Oim[0].header, "NAXIS2", "%d", 1, Ny); 91 Oim[0].header.Naxis[0] = Nx; 92 Oim[0].header.Naxis[1] = Ny; 93 Oim[0].bitpix = Ire[0].bitpix; 94 Oim[0].unsign = Ire[0].unsign; 95 Oim[0].bscale = Ire[0].bscale; 96 Oim[0].bzero = Ire[0].bzero; 97 gfits_create_matrix (&Oim[0].header, &Oim[0].matrix); 98 99 /* move data from working space to output buffers */ 100 out = temp; 101 t1 = (float *) Ore[0].matrix.buffer; 102 t2 = (float *) Oim[0].matrix.buffer; 103 for (i = 0; i < Npix; i++, t1++, t2++) { 104 *t1 = *out / Npix; 105 out ++; 106 *t2 = *out / Npix; 107 out ++; 108 } 109 110 free (temp); 76 fftND ((float *)Ore[0].matrix.buffer, (float *)Oim[0].matrix.buffer, 2, Ire[0].header.Naxis, forward); 111 77 112 78 return (TRUE);
Note:
See TracChangeset
for help on using the changeset viewer.
