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/cmd.data/fft2d.c

    r16099 r16107  
    33int fft2d (int argc, char **argv) {
    44 
    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;
    87  Buffer *Ire, *Iim, *Ore, *Oim;;
    98
    10   isign = 1;
     9  forward = TRUE;
    1110  if ((N = get_argument (argc, argv, "-inverse"))) {
    1211    remove_argument (N, &argc, argv);
    13     isign = -1;
     12    forward = FALSE;
    1413  }
    1514
     
    2827  }   
    2928  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
    3050  if ((Ore = SelectBuffer (argv[4], ANYBUFFER, TRUE)) == NULL) return (FALSE);
    3151  if ((Oim = SelectBuffer (argv[5], ANYBUFFER, TRUE)) == NULL) return (FALSE);
     
    3656  gfits_free_matrix (&Oim[0].matrix);
    3757  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);
    3862
    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));
    4773  }
    48  
    49   /* create working space */
    50   t1 = (float *) Ire[0].matrix.buffer;
    51   ALLOCATE (temp, float, 2*Npix);
    52   out = temp;
    5374
    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    
    7275  /* 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);
    11177
    11278  return (TRUE);
Note: See TracChangeset for help on using the changeset viewer.