1 /* dft.c - discrete fourier transformation program */
4 * author: frank.zirkelbach@physik.uni-augsburg.de
10 int main(int argc,char **argv) {
28 strcpy(src.file,argv[1]);
29 strcpy(dst.file,argv[2]);
30 strcpy(cut.file,argv[3]);
32 fourier_init(&fourier,1);
37 bmp_cut_bottom(&cut,&src,150);
40 dst.width=src.info.width;
41 dst.height=src.info.height;
44 fourier.data_len[0]=src.info.width;
45 fourier.data_len[1]=src.info.height;
46 fourier_alloc_data(&fourier);
48 mag=(double *)malloc(fourier.data_len[0]*fourier.data_len[1]*sizeof(double));
50 printf("unable to alloc mag memory\n");
56 for(y=0;y<fourier.data_len[1];y++) {
57 for(x=0;x<fourier.data_len[0];x++) {
59 fourier.data[offt].r=(src.map[offt].r+src.map[offt].g+src.map[offt].b)/3;
61 offy+=fourier.data_len[0];
64 // do the fourier trafo
65 fourier_dft_2d(&fourier);
67 printf("fourier done!\n");
69 // copy back the data, intensity = sqrt(r^2+i^2)
72 for(y=0;y<fourier.data_len[1];y++) {
73 for(x=0;x<fourier.data_len[0];x++) {
74 mag[offt]=sqrt(fourier.ftdata[offt].r*fourier.ftdata[offt].r+fourier.ftdata[offt].i*fourier.ftdata[offt].i);
75 if(mag[offt]>max) max=mag[offt];
80 printf("found max: %f\n",max);
82 if(max!=0) scale=(int)255/max;
86 printf("scaling image intensity: %d\n",scale);
88 for(y=0;y<dst.height;y++) {
89 for(x=0;x<dst.width;x++) {
90 offy=((y<dst.height/2)?y+dst.height/2:y-dst.height/2);
92 offy+=((x<dst.width/2)?x+dst.width/2:x-dst.width/2);
93 dst.map[offy].r=scale*mag[offt];
94 dst.map[offy].g=dst.map[offy].r;
95 dst.map[offy].b=dst.map[offy].r;
103 bmp_write_file(&dst);
105 fourier_shutdown(&fourier);
110 printf("done ...\n");