*
*/
+//#define USE_FFTW3
+
#include "dft.h"
int main(int argc,char **argv) {
+#ifdef USE_FFTW3
+ fftw_plan plan;
+ fftw_complex *in,*out;
+#else
t_fourier fourier;
+#endif
t_bmp src;
t_bmp dst;
t_bmp cut;
int x,y;
int offy,offt;
- int scale;
+ double scale;
+ int size;
double max;
double *mag;
strcpy(src.file,argv[1]);
strcpy(dst.file,argv[2]);
+#ifndef USE_FFTW3
fourier_init(&fourier,1);
fourier.type=DFT|FWD;
fourier.dim=2;
+#endif
bmp_read_file(&src);
dst.height=cut.height;
bmp_alloc_map(&dst);
+ size=cut.width*cut.height;
+
+#ifndef USE_FFTW3
fourier.data_len[0]=cut.width;
fourier.data_len[1]=cut.height;
fourier_alloc_data(&fourier);
+#else
+ in=fftw_malloc(sizeof(fftw_complex)*size);
+ memset(in,0,size*sizeof(fftw_complex));
+ out=fftw_malloc(sizeof(fftw_complex)*size);
+ memset(out,0,size*sizeof(fftw_complex));
+ if(in==NULL||out==NULL) {
+ printf("fftw alloc error!\n");
+ return -23;
+ }
+ plan=fftw_plan_dft_2d(cut.width,cut.height,in,out,FFTW_FORWARD,FFTW_ESTIMATE);
+#endif
- mag=(double *)malloc(fourier.data_len[0]*fourier.data_len[1]*sizeof(double));
+ mag=(double *)malloc(size*sizeof(double));
if(mag==NULL) {
printf("unable to alloc mag memory\n");
return -1;
}
// copy the data
- offy=0;
- for(y=0;y<fourier.data_len[1];y++) {
- for(x=0;x<fourier.data_len[0];x++) {
- offt=offy+x;
- fourier.data[offt].r=(src.map[offt].r+src.map[offt].g+src.map[offt].b)/3;
- }
- offy+=fourier.data_len[0];
+ for(x=0;x<size;x++) {
+#ifdef USE_FFTW3
+ in[x][0]=(src.map[x].r+src.map[x].g+src.map[x].b)/3;
+ in[x][1]=0;
+#else
+ fourier.data[x].r=(src.map[x].r+src.map[x].g+src.map[x].b)/3;
+#endif
}
// do the fourier trafo
+#ifdef USE_FFTW3
+ fftw_execute(plan);
+#else
fourier_dft_2d(&fourier);
+#endif
+
printf("fourier done!\n");
// copy back the data, intensity = sqrt(r^2+i^2)
max=0;
offt=0;
- for(y=0;y<fourier.data_len[1];y++) {
- for(x=0;x<fourier.data_len[0];x++) {
+ for(y=0;y<cut.height;y++) {
+ for(x=0;x<cut.width;x++) {
+#ifdef USE_FFTW3
+ mag[offt]=sqrt(out[offt][0]*out[offt][0]+out[offt][1]*out[offt][1]);
+#else
mag[offt]=sqrt(fourier.ftdata[offt].r*fourier.ftdata[offt].r+fourier.ftdata[offt].i*fourier.ftdata[offt].i);
+#endif
if(mag[offt]>max) max=mag[offt];
offt+=1;
}
printf("found max: %f\n",max);
- if(max!=0) scale=(int)255/max;
+ if(max!=0) scale=255.0/max;
else scale=0;
if(scale!=0) {
- printf("scaling image intensity: %d\n",scale);
+ printf("scaling image intensity: %f\n",scale);
offt=0;
for(y=0;y<dst.height;y++) {
for(x=0;x<dst.width;x++) {
bmp_write_file(&dst);
+#ifdef USE_FFTW3
+ fftw_destroy_plan(plan);
+ fftw_free(in); fftw_free(out);
+#else
fourier_shutdown(&fourier);
+#endif
bmp_shutdown(&src);
bmp_shutdown(&dst);