GRASS Programmer's Manual
6.4.2(2012)
|
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 */