⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fftw.h.in

📁 FFTW, a collection of fast C routines to compute the Discrete Fourier Transform in one or more dime
💻 IN
字号:
/* -*- C -*- *//* * Copyright (c) 1997-1999, 2003 Massachusetts Institute of Technology * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA * *//* fftw.h -- system-wide definitions *//* $Id: fftw.h.in,v 1.57 2003/03/16 23:43:46 stevenj Exp $ */#ifndef FFTW_H#define FFTW_H#include <stdlib.h>#include <stdio.h>#ifdef __cplusplusextern "C" {#endif				/* __cplusplus *//* Define for using single precision *//* * If you can, use configure --enable-float instead of changing this * flag directly  */#undef FFTW_ENABLE_FLOAT/* our real numbers */#ifdef FFTW_ENABLE_FLOATtypedef float fftw_real;#elsetypedef double fftw_real;#endif/********************************************* * Complex numbers and operations  *********************************************/typedef struct {     fftw_real re, im;} fftw_complex;#define c_re(c)  ((c).re)#define c_im(c)  ((c).im)typedef enum {     FFTW_FORWARD = -1, FFTW_BACKWARD = 1} fftw_direction;/* backward compatibility with FFTW-1.3 */typedef fftw_complex FFTW_COMPLEX;typedef fftw_real FFTW_REAL;#ifndef FFTW_1_0_COMPATIBILITY#define FFTW_1_0_COMPATIBILITY 0#endif#if FFTW_1_0_COMPATIBILITY/* backward compatibility with FFTW-1.0 */#define REAL fftw_real#define COMPLEX fftw_complex#endif/********************************************* * Success or failure status *********************************************/typedef enum {     FFTW_SUCCESS = 0, FFTW_FAILURE = -1} fftw_status;/********************************************* *              Codelets *********************************************/typedef void (fftw_notw_codelet)      (const fftw_complex *, fftw_complex *, int, int);typedef void (fftw_twiddle_codelet)     (fftw_complex *, const fftw_complex *, int,      int, int);typedef void (fftw_generic_codelet)      (fftw_complex *, const fftw_complex *, int,      int, int, int);typedef void (fftw_real2hc_codelet)     (const fftw_real *, fftw_real *, fftw_real *,      int, int, int);typedef void (fftw_hc2real_codelet)     (const fftw_real *, const fftw_real *,      fftw_real *, int, int, int);typedef void (fftw_hc2hc_codelet)     (fftw_real *, const fftw_complex *,      int, int, int);typedef void (fftw_rgeneric_codelet)     (fftw_real *, const fftw_complex *, int,      int, int, int);/********************************************* *     Configurations *********************************************//* * A configuration is a database of all known codelets */enum fftw_node_type {     FFTW_NOTW, FFTW_TWIDDLE, FFTW_GENERIC, FFTW_RADER,     FFTW_REAL2HC, FFTW_HC2REAL, FFTW_HC2HC, FFTW_RGENERIC};/* description of a codelet */typedef struct {     const char *name;		/* name of the codelet */     void (*codelet) ();	/* pointer to the codelet itself */     int size;			/* size of the codelet */     fftw_direction dir;	/* direction */     enum fftw_node_type type;	/* TWIDDLE or NO_TWIDDLE */     int signature;		/* unique id */     int ntwiddle;		/* number of twiddle factors */     const int *twiddle_order;	/* 				 * array that determines the order 				 * in which the codelet expects				 * the twiddle factors				 */} fftw_codelet_desc;/* On Win32, you need to do funny things to access global variables   in shared libraries.  Thanks to Andrew Sterian for this hack. */#ifdef HAVE_WIN32#  if defined(BUILD_FFTW_DLL)#    define DL_IMPORT(type) __declspec(dllexport) type#  elif defined(USE_FFTW_DLL)#    define DL_IMPORT(type) __declspec(dllimport) type#  else#    define DL_IMPORT(type) type#  endif#else#  define DL_IMPORT(type) type#endifextern DL_IMPORT(const char *) fftw_version;/***************************** *        Plans *****************************//* * A plan is a sequence of reductions to compute a FFT of * a given size.  At each step, the FFT algorithm can: * * 1) apply a notw codelet, or * 2) recurse and apply a twiddle codelet, or * 3) apply the generic codelet. *//* structure that contains twiddle factors */typedef struct fftw_twiddle_struct {     int n;     const fftw_codelet_desc *cdesc;     fftw_complex *twarray;     struct fftw_twiddle_struct *next;     int refcnt;} fftw_twiddle;typedef struct fftw_rader_data_struct {     struct fftw_plan_struct *plan;     fftw_complex *omega;     int g, ginv;     int p, flags, refcount;     struct fftw_rader_data_struct *next;     fftw_codelet_desc *cdesc;} fftw_rader_data;typedef void (fftw_rader_codelet)      (fftw_complex *, const fftw_complex *, int,      int, int, fftw_rader_data *);/* structure that holds all the data needed for a given step */typedef struct fftw_plan_node_struct {     enum fftw_node_type type;     union {	  /* nodes of type FFTW_NOTW */	  struct {	       int size;	       fftw_notw_codelet *codelet;	       const fftw_codelet_desc *codelet_desc;	  } notw;	  /* nodes of type FFTW_TWIDDLE */	  struct {	       int size;	       fftw_twiddle_codelet *codelet;	       fftw_twiddle *tw;	       struct fftw_plan_node_struct *recurse;	       const fftw_codelet_desc *codelet_desc;	  } twiddle;	  /* nodes of type FFTW_GENERIC */	  struct {	       int size;	       fftw_generic_codelet *codelet;	       fftw_twiddle *tw;	       struct fftw_plan_node_struct *recurse;	  } generic;	  /* nodes of type FFTW_RADER */	  struct {	       int size;	       fftw_rader_codelet *codelet;	       fftw_rader_data *rader_data;	       fftw_twiddle *tw;	       struct fftw_plan_node_struct *recurse;	  } rader;	  /* nodes of type FFTW_REAL2HC */	  struct {	       int size;	       fftw_real2hc_codelet *codelet;	       const fftw_codelet_desc *codelet_desc;	  } real2hc;	  /* nodes of type FFTW_HC2REAL */	  struct {	       int size;	       fftw_hc2real_codelet *codelet;	       const fftw_codelet_desc *codelet_desc;	  } hc2real;	  /* nodes of type FFTW_HC2HC */	  struct {	       int size;	       fftw_direction dir;	       fftw_hc2hc_codelet *codelet;	       fftw_twiddle *tw;	       struct fftw_plan_node_struct *recurse;	       const fftw_codelet_desc *codelet_desc;	  } hc2hc;	  /* nodes of type FFTW_RGENERIC */	  struct {	       int size;	       fftw_direction dir;	       fftw_rgeneric_codelet *codelet;	       fftw_twiddle *tw;	       struct fftw_plan_node_struct *recurse;	  } rgeneric;     } nodeu;     int refcnt;} fftw_plan_node;typedef enum {     FFTW_NORMAL_RECURSE = 0,     FFTW_VECTOR_RECURSE = 1} fftw_recurse_kind;struct fftw_plan_struct {     int n;     int refcnt;     fftw_direction dir;     int flags;     int wisdom_signature;     enum fftw_node_type wisdom_type;     struct fftw_plan_struct *next;     fftw_plan_node *root;     double cost;     fftw_recurse_kind recurse_kind;     int vector_size;};typedef struct fftw_plan_struct *fftw_plan;/* flags for the planner */#define  FFTW_ESTIMATE (0)#define  FFTW_MEASURE  (1)#define FFTW_OUT_OF_PLACE (0)#define FFTW_IN_PLACE (8)#define FFTW_USE_WISDOM (16)#define FFTW_THREADSAFE (128)  /* guarantee plan is read-only so that the				  same plan can be used in parallel by				  multiple threads */#define FFTWND_FORCE_BUFFERED (256)     /* internal flag, forces buffering                                           in fftwnd transforms */#define FFTW_NO_VECTOR_RECURSE (512)    /* internal flag, prevents use                                           of vector recursion */extern fftw_plan fftw_create_plan_specific(int n, fftw_direction dir,					   int flags,					   fftw_complex *in, int istride,					 fftw_complex *out, int ostride);#define FFTW_HAS_PLAN_SPECIFICextern fftw_plan fftw_create_plan(int n, fftw_direction dir, int flags);extern void fftw_print_plan(fftw_plan plan);extern void fftw_destroy_plan(fftw_plan plan);extern void fftw(fftw_plan plan, int howmany, fftw_complex *in, int istride,		 int idist, fftw_complex *out, int ostride, int odist);extern void fftw_one(fftw_plan plan, fftw_complex *in, fftw_complex *out);extern void fftw_die(const char *s);extern void *fftw_malloc(size_t n);extern void fftw_free(void *p);extern void fftw_check_memory_leaks(void);extern void fftw_print_max_memory_usage(void);typedef void *(*fftw_malloc_type_function) (size_t n);typedef void  (*fftw_free_type_function) (void *p);typedef void  (*fftw_die_type_function) (const char *errString);extern DL_IMPORT(fftw_malloc_type_function) fftw_malloc_hook;extern DL_IMPORT(fftw_free_type_function) fftw_free_hook;extern DL_IMPORT(fftw_die_type_function) fftw_die_hook;extern size_t fftw_sizeof_fftw_real(void);/* Wisdom: *//* * define this symbol so that users know we are using a version of FFTW * with wisdom */#define FFTW_HAS_WISDOMextern void fftw_forget_wisdom(void);extern void fftw_export_wisdom(void (*emitter) (char c, void *), void *data);extern fftw_status fftw_import_wisdom(int (*g) (void *), void *data);extern void fftw_export_wisdom_to_file(FILE *output_file);extern fftw_status fftw_import_wisdom_from_file(FILE *input_file);extern char *fftw_export_wisdom_to_string(void);extern fftw_status fftw_import_wisdom_from_string(const char *input_string);/* * define symbol so we know this function is available (it is not in * older FFTWs) */#define FFTW_HAS_FPRINT_PLANextern void fftw_fprint_plan(FILE *f, fftw_plan plan);/***************************** *    N-dimensional code *****************************/typedef struct {     int is_in_place;		/* 1 if for in-place FFTs, 0 otherwise */     int rank;			/* 				 * the rank (number of dimensions) of the				 * array to be FFTed 				 */     int *n;			/*				 * the dimensions of the array to the				 * FFTed 				 */     fftw_direction dir;     int *n_before;		/*				 * n_before[i] = product of n[j] for j < i 				 */     int *n_after;		/* n_after[i] = product of n[j] for j > i */     fftw_plan *plans;		/* 1d fftw plans for each dimension */     int nbuffers, nwork;     fftw_complex *work;	/* 				 * work array big enough to hold				 * nbuffers+1 of the largest dimension 				 * (has nwork elements)				 */} fftwnd_data;typedef fftwnd_data *fftwnd_plan;/* Initializing the FFTWND plan: */extern fftwnd_plan fftw2d_create_plan(int nx, int ny, fftw_direction dir,				      int flags);extern fftwnd_plan fftw3d_create_plan(int nx, int ny, int nz,				      fftw_direction dir, int flags);extern fftwnd_plan fftwnd_create_plan(int rank, const int *n,				      fftw_direction dir,				      int flags);extern fftwnd_plan fftw2d_create_plan_specific(int nx, int ny,					       fftw_direction dir,					       int flags,					   fftw_complex *in, int istride,					 fftw_complex *out, int ostride);extern fftwnd_plan fftw3d_create_plan_specific(int nx, int ny, int nz,					   fftw_direction dir, int flags,					   fftw_complex *in, int istride,					 fftw_complex *out, int ostride);extern fftwnd_plan fftwnd_create_plan_specific(int rank, const int *n,					       fftw_direction dir,					       int flags,					   fftw_complex *in, int istride,					 fftw_complex *out, int ostride);/* Freeing the FFTWND plan: */extern void fftwnd_destroy_plan(fftwnd_plan plan);/* Printing the plan: */extern void fftwnd_fprint_plan(FILE *f, fftwnd_plan p);extern void fftwnd_print_plan(fftwnd_plan p);#define FFTWND_HAS_PRINT_PLAN/* Computing the N-Dimensional FFT */extern void fftwnd(fftwnd_plan plan, int howmany,		   fftw_complex *in, int istride, int idist,		   fftw_complex *out, int ostride, int odist);extern void fftwnd_one(fftwnd_plan p, fftw_complex *in, fftw_complex *out);#ifdef __cplusplus}                               /* extern "C" */#endif				/* __cplusplus */#endif				/* FFTW_H */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -