GRASS Programmer's Manual  6.4.2(2012)
fft.c
Go to the documentation of this file.
00001 
00026 #include <grass/config.h>
00027 
00028 #if defined(HAVE_FFTW_H) || defined(HAVE_DFFTW_H) || defined(HAVE_FFTW3_H)
00029 
00030 #ifdef HAVE_FFTW_H
00031 #include <fftw.h>
00032 #endif
00033 
00034 #ifdef HAVE_DFFTW_H
00035 #include <dfftw.h>
00036 #endif
00037 
00038 #ifdef HAVE_FFTW3_H
00039 #include <fftw3.h>
00040 #define c_re(c) ((c)[0])
00041 #define c_im(c) ((c)[1])
00042 #endif
00043 
00044 #include <stdlib.h>
00045 #include <stdio.h>
00046 #include <math.h>
00047 #include <grass/gmath.h>
00048 #include <grass/gis.h>
00049 
00050 
00070 int fft2(int i_sign, double (*data)[2], int NN, int dimc, int dimr)
00071 {
00072 #ifdef HAVE_FFTW3_H
00073     fftw_plan plan;
00074 #else
00075     fftwnd_plan plan;
00076 #endif
00077     double norm;
00078     int i;
00079 
00080     norm = 1.0 / sqrt(NN);
00081 
00082 #ifdef HAVE_FFTW3_H
00083     plan = fftw_plan_dft_2d(dimr, dimc, data, data,
00084                             (i_sign < 0) ? FFTW_FORWARD : FFTW_BACKWARD,
00085                             FFTW_ESTIMATE);
00086 
00087     fftw_execute(plan);
00088 
00089     fftw_destroy_plan(plan);
00090 #else
00091     plan = fftw2d_create_plan(dimc, dimr,
00092                               (i_sign < 0) ? FFTW_FORWARD : FFTW_BACKWARD,
00093                               FFTW_ESTIMATE | FFTW_IN_PLACE);
00094 
00095     fftwnd_one(plan, data, data);
00096 
00097     fftwnd_destroy_plan(plan);
00098 #endif
00099 
00100     for (i = 0; i < NN; i++) {
00101         data[i][0] *= norm;
00102         data[i][1] *= norm;
00103     }
00104 
00105     return 0;
00106 }
00107 
00127 int fft(int i_sign, double *DATA[2], int NN, int dimc, int dimr)
00128 {
00129     fftw_complex *data;
00130     int i;
00131 
00132     data = (fftw_complex *) G_malloc(NN * sizeof(fftw_complex));
00133 
00134     for (i = 0; i < NN; i++) {
00135         c_re(data[i]) = DATA[0][i];
00136         c_im(data[i]) = DATA[1][i];
00137     }
00138 
00139     fft2(i_sign, data, NN, dimc, dimr);
00140 
00141     for (i = 0; i < NN; i++) {
00142         DATA[0][i] = c_re(data[i]);
00143         DATA[1][i] = c_im(data[i]);
00144     }
00145 
00146     G_free(data);
00147 
00148     return 0;
00149 }
00150 
00151 #endif /* HAVE_FFT */
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines