00001
00002
00003 #ifndef _FOURIER_TRANSFORM_H_
00004 #define _FOURIER_TRANSFORM_H_
00005
00006 #include "FloatImage.h"
00007
00008 #define HALF_SHIFT(A,size_x,size_y) \
00009 { float temp; \
00010 int i,j; \
00011 for (j=0; j<(size_y)/2; j++) \
00012 for (i=0; i<(size_x)/2; i++) \
00013 { temp = A[(size_x)*j+i]; \
00014 A[(size_x)*j+i] = A[(size_x)*(j+((size_y)/2))+i+(size_x)/2]; \
00015 A[(size_x)*(j+((size_y)/2))+i+(size_x)/2] = temp;} \
00016 for (j=(size_y)/2; j<(size_y); j++) \
00017 for (i=0; i<(size_x)/2; i++) \
00018 { temp = A[(size_x)*j+i]; \
00019 A[(size_x)*j+i] = A[(size_x)*(j-((size_y)/2))+i+(size_x)/2]; \
00020 A[(size_x)*(j-((size_y)/2))+i+(size_x)/2] = temp;} \
00021 }
00022
00028 class FourierTransform
00029 {
00030 private:
00031 FloatImage real_part;
00032 FloatImage imag_part;
00033 int pid_magnitude;
00034 int pid_phase;
00035 void _fft(float *data, int nn, int isign);
00036
00037 public:
00039 FourierTransform(FloatImage &input);
00040
00042 FourierTransform(FloatImage &input_real, FloatImage &input_imag);
00043
00045 void fft();
00046
00048 void ifft();
00049
00053 void showMagnitude(int log_values);
00054
00059 void showPhase(int log_values);
00060
00062 void closeWindows();
00063
00065 FloatImage getReal() { return real_part;}
00066
00068 FloatImage getImag() { return imag_part;}
00069 };
00070
00071 void fft(FloatImage &input, FloatImage &output_real, FloatImage &output_imag);
00076
00077
00078 void ifft(FloatImage &input_real, FloatImage &input_imag, FloatImage &output);
00087 #endif