Esempio n. 1
0
  /* double precision */
int tcdTransformD(
		 tcdTRANSFORM  tType,  /* i: which transform to compute     */
		 double        *params, /* i: transform parameters(direction)*/
		 tcdDComplex   *data,   /* i/o: data to transform- in place  */
		 long          nAxes,  /* i: number of axes                 */
		 long         *lAxes,  /* i: length of axes                 */
		 long         *dOrigin /* i: origin of axes                 */
		 )
{
  long nTotal, ii;
  int status;
  int *axe_len;
  fftw_plan plan;


  /* error checking */
  status = tcdCheckData( data, nAxes, lAxes );
  if ( status != tcdSUCCESS ) return( status );

  if ( params == NULL ) return( tcdERROR_NULLPTR);

  /* do transforms */
  switch ( tType )
    {
    case tcdFFT:
      axe_len = (int*)calloc(nAxes,sizeof(int));
      for (ii=0;ii<nAxes;ii++) axe_len[ii] = lAxes[nAxes-ii-1];

      if (params[0] == tcdFORWARD)
	plan=fftw_plan_dft(nAxes, axe_len, (void *)data, (void *)data,       
			       FFTW_FORWARD, FFTW_ESTIMATE);
      else
	plan=fftw_plan_dft(nAxes, axe_len,(void *)data, (void *)data,       
				FFTW_BACKWARD, FFTW_ESTIMATE);

      free(axe_len);

      if (plan == NULL)
	{
	  return(tcdERROR);
	}
      fftw_execute( plan); 

            
      /* Normalize */
      if ( params[0] == (float )tcdFORWARD )
	{
	  nTotal=1;
	  for (ii=0;ii<nAxes  ; ii++) nTotal *= lAxes[ii];
	  for (ii=0; ii<nTotal; ii++) 
	    {
	      data[ii].r /= nTotal ; 
	      data[ii].i /= nTotal; 
	    }
	}

      /* destroy plan */
      fftw_destroy_plan(plan);
      break;

    default:
      return( tcdERROR_NOTIMPLEMENTED );
    }

  return( tcdSUCCESS );

}
Esempio n. 2
0
/*
  +-----------------------------------------------------
  +
  + Cast an array from 1 type to another.
  +
  +-----------------------------------------------------
  */
int tcdCastArray( tcdDATATYPE inType,  /* i: input data type           */
		  void *inData,        /* i: input data                */
		  long  nAxes,         /* i: number of axes            */
		  long *lAxes,         /* i: length of axes            */
		  tcdDATATYPE outType, /* i: output data type          */
		  void *outData        /* o: output data array         */
		  )
{

  long nTotal;  /* total length of array */
  long ii;      /* loop variable */
  int status;


  char        **outData_b, *inData_b;
  short       **outData_s, *inData_s;  /* pointers to alloced data types */
  long        **outData_l, *inData_l;
  float       **outData_f, *inData_f;
  double      **outData_d, *inData_d;
  tcdComplex  **outData_c, *inData_c;
  tcdDComplex **outData_D, *inData_D;

  outData_b = NULL;
  inData_b = NULL;
  outData_s = NULL;
  inData_s = NULL;
  outData_l = NULL;
  inData_l = NULL;
  outData_f = NULL;
  inData_f = NULL;
  outData_d = NULL;
  inData_d = NULL;
  outData_c = NULL;
  inData_c = NULL;
  outData_D = NULL;
  inData_D = NULL;



  status = tcdCheckData( inData, nAxes, lAxes );
  if ( status != tcdSUCCESS ) return( status );

  nTotal = 1;
  for (ii=0; ii<nAxes; ii++) nTotal *= lAxes[ii];


  /* allocate memory */

  switch ( outType )
    {
    case tcdSHORT:
      outData_s = outData;
      *outData_s = (short *)calloc( nTotal , sizeof( short ));
      if (*outData_s == NULL) return( tcdERROR_ALLOC );
      break;

    case tcdBYTE:
      outData_b = outData;
      *outData_b = (char *)calloc( nTotal , sizeof( char ));
      if (*outData_b == NULL) return( tcdERROR_ALLOC );
      break;

    case tcdLONG:
      outData_l = outData;
      *outData_l = (long *)calloc( nTotal , sizeof( long ));
      if (*outData_l == NULL) return( tcdERROR_ALLOC );
      break;

    case tcdFLOAT:
      outData_f = outData;
      *outData_f = (float *)calloc( nTotal , sizeof( float ));
      if (*outData_f == NULL) return( tcdERROR_ALLOC );
      break;

    case tcdDOUBLE:
      outData_d = outData;
      *outData_d = (double *)calloc( nTotal , sizeof( double ));
      if (*outData_d == NULL) return( tcdERROR_ALLOC );
      break;

    case tcdCOMPLEX:
      outData_c = outData;
      *outData_c = (tcdComplex *)calloc( nTotal , sizeof( tcdComplex ));
      if (*outData_c == NULL) return( tcdERROR_ALLOC );
      break;

    case tcdDCOMPLEX:
      outData_D = outData;
      *outData_D = (tcdDComplex *)calloc( nTotal , sizeof( tcdDComplex ));
      if (*outData_D == NULL) return( tcdERROR_ALLOC );
      break;

    default:
      return( tcdERROR_UNSUPORTTYPE );

    } /* end switch outType */



  /* determine input */

  switch ( inType )
    {
    case tcdBYTE:
      inData_b = inData; break;
    case tcdSHORT:
      inData_s = inData; break;
    case tcdLONG:
      inData_l = inData; break;
    case tcdFLOAT:
      inData_f = inData; break;
    case tcdDOUBLE:
      inData_d = inData; break;
    case tcdCOMPLEX:
      inData_c = inData; break;
    case tcdDCOMPLEX:
      inData_D = inData; break;
    default:
      return( tcdERROR_UNSUPORTTYPE );
    }


  /* now cast data */


  for ( ii=0; ii<nTotal; ii++ )
    {

      switch ( outType )
	{

	case tcdSHORT:
	  switch( inType )
	    {
	    case tcdBYTE:
	      (*outData_s)[ii] = (short )inData_b[ii]; break;
	    case tcdSHORT:
	      (*outData_s)[ii] = (short )inData_s[ii]; break;
	    case tcdLONG:
	      (*outData_s)[ii] = (short )inData_l[ii]; break;
	    case tcdFLOAT:
	      (*outData_s)[ii] = (short )inData_f[ii]; break;
	    case tcdDOUBLE:
	      (*outData_s)[ii] = (short )inData_d[ii]; break;
	    case tcdCOMPLEX:
	      (*outData_s)[ii] = (short )inData_c[ii].r; break;
	    case tcdDCOMPLEX:
	      (*outData_s)[ii] = (short )inData_D[ii].r; break;
	    default:
	      return(tcdERROR_UNSUPORTTYPE);
	    } /* end output SHORT */
	  break;

	case tcdBYTE:
	  switch( inType )
	    {
	    case tcdBYTE:
	      (*outData_b)[ii] = (char )inData_b[ii]; break;
	    case tcdSHORT:
	      (*outData_b)[ii] = (char )inData_s[ii]; break;
	    case tcdLONG:
	      (*outData_b)[ii] = (char )inData_l[ii]; break;
	    case tcdFLOAT:
	      (*outData_b)[ii] = (char )inData_f[ii]; break;
	    case tcdDOUBLE:
	      (*outData_b)[ii] = (char )inData_d[ii]; break;
	    case tcdCOMPLEX:
	      (*outData_b)[ii] = (char )inData_c[ii].r; break;
	    case tcdDCOMPLEX:
	      (*outData_b)[ii] = (char )inData_D[ii].r; break;
	    default:
	      return(tcdERROR_UNSUPORTTYPE);
	    } /* end output SHORT */
	  break;

	case tcdLONG:
	  switch( inType )
	    {
	    case tcdBYTE:
	      (*outData_l)[ii] = (long )inData_b[ii]; break;
	    case tcdSHORT:
	      (*outData_l)[ii] = (long )inData_s[ii]; break;
	    case tcdLONG:
	      (*outData_l)[ii] = (long )inData_l[ii]; break;
	    case tcdFLOAT:
	      (*outData_l)[ii] = (long )inData_f[ii]; break;
	    case tcdDOUBLE:
	      (*outData_l)[ii] = (long )inData_d[ii]; break;
	    case tcdCOMPLEX:
	      (*outData_l)[ii] = (long )inData_c[ii].r; break;
	    case tcdDCOMPLEX:
	      (*outData_l)[ii] = (long )inData_D[ii].r; break;
	    default:
	      return(tcdERROR_UNSUPORTTYPE);
	    } /* end output LONG */
	  break;


	case tcdFLOAT:
	  switch( inType )
	    {
	    case tcdBYTE:
	      (*outData_f)[ii] = (float )inData_b[ii]; break;
	    case tcdSHORT:
	      (*outData_f)[ii] = (float )inData_s[ii]; break;
	    case tcdLONG:
	      (*outData_f)[ii] = (float )inData_l[ii]; break;
	    case tcdFLOAT:
	      (*outData_f)[ii] = (float )inData_f[ii]; break;
	    case tcdDOUBLE:
	      (*outData_f)[ii] = (float )inData_d[ii]; break;
	    case tcdCOMPLEX:
	      (*outData_f)[ii] = (float )inData_c[ii].r; break;
	    case tcdDCOMPLEX:
	      (*outData_f)[ii] = (float )inData_D[ii].r; break;
	    default:
	      return(tcdERROR_UNSUPORTTYPE);
	    } /* end output FLOAT */
	  break;


	case tcdDOUBLE:
	  switch( inType )
	    {
	    case tcdBYTE:
	      (*outData_d)[ii] = (double )inData_b[ii]; break;
	    case tcdSHORT:
	      (*outData_d)[ii] = (double )inData_s[ii]; break;
	    case tcdLONG:
	      (*outData_d)[ii] = (double )inData_l[ii]; break;
	    case tcdFLOAT:
	      (*outData_d)[ii] = (double )inData_f[ii]; break;
	    case tcdDOUBLE:
	      (*outData_d)[ii] = (double )inData_d[ii]; break;
	    case tcdCOMPLEX:
	      (*outData_d)[ii] = (double )inData_c[ii].r; break;
	    case tcdDCOMPLEX:
	      (*outData_d)[ii] = (double )inData_D[ii].r; break;
	    default:
	      return(tcdERROR_UNSUPORTTYPE);
	    } /* end output DOUBLE */
	  break;


	case tcdCOMPLEX:
	  switch( inType )
	    {
	    case tcdBYTE:
	      (*outData_c)[ii].r = (float )inData_b[ii]; break;
	    case tcdSHORT:
	      (*outData_c)[ii].r = (float )inData_s[ii]; break;
	    case tcdLONG:
	      (*outData_c)[ii].r = (float )inData_l[ii]; break;
	    case tcdFLOAT:
	      (*outData_c)[ii].r = (float )inData_f[ii]; break;
	    case tcdDOUBLE:
	      (*outData_c)[ii].r = (float )inData_d[ii]; break;
	    case tcdCOMPLEX:
	      (*outData_c)[ii].r = (float )inData_c[ii].r;
	      (*outData_c)[ii].i = (float )inData_c[ii].i; break;
	    case tcdDCOMPLEX:
	      (*outData_c)[ii].r = (float )inData_D[ii].r;
	      (*outData_c)[ii].i = (float )inData_D[ii].i; break;
	    default:
	      return(tcdERROR_UNSUPORTTYPE);
	    } /* end output COMPLEX*/
	  break;



	case tcdDCOMPLEX:
	  switch( inType )
	    {
	    case tcdBYTE:
	      (*outData_D)[ii].r = (double )inData_b[ii]; break;
	    case tcdSHORT:
	      (*outData_D)[ii].r = (double )inData_s[ii]; break;
	    case tcdLONG:
	      (*outData_D)[ii].r = (double )inData_l[ii]; break;
	    case tcdFLOAT:
	      (*outData_D)[ii].r = (double )inData_f[ii]; break;
	    case tcdDOUBLE:
	      (*outData_D)[ii].r = (double )inData_d[ii]; break;
	    case tcdCOMPLEX:
	      (*outData_D)[ii].r = (double )inData_c[ii].r;
	      (*outData_D)[ii].i = (double )inData_c[ii].i; break;
	    case tcdDCOMPLEX:
	      (*outData_D)[ii].r = (double )inData_D[ii].r;
	      (*outData_D)[ii].i = (double )inData_D[ii].i; break;
	    default:
	      return(tcdERROR_UNSUPORTTYPE);
	    } /* end output DOUBLE*/
	  break;
	  
	default:
	  return(tcdERROR_UNSUPORTTYPE);
	} /* end switch outType */


    } /* end for ii */


  return(tcdSUCCESS);


}