1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| //voila le code
/* reIn : partie réel de l'image dans l'espace de Fourier
* imIn : partie imaginaire de l'image dans l'espace de Fourier
* out : image de sortie
* largeur : largeur des images d'entrée et de sortie
*/
void fourierBackward(const float* reIn,
const float* imIn,
float* out,
unsigned int largeur,
unsigned int hauteur)
{
fftw_complex* spatial_repr;
fftw_complex* frequency_repr;
unsigned int i;
unsigned int j;
int x,y;
fftw_plan plan;
//le faute est a ce niveau:
spatial_repr= fftw_malloc(sizeof(fftw_complex)*largeur*hauteur);
frequency_repr= fftw_malloc(sizeof(fftw_complex)*largeur*hauteur);
for(j=0;j<hauteur;j++)
for(i=0;i<largeur;i++)
{
/*on décentre*/
x=i;
y=j;
if (i<largeur/2 && j<hauteur/2){ x=i+largeur/2; y=j+hauteur/2; }
if (i>=largeur/2 && j<hauteur/2){ x=i-largeur/2; y=j+hauteur/2; }
if (i<largeur/2 && j>=hauteur/2){ x=i+largeur/2; y=j-hauteur/2; }
if (i>=largeur/2 && j>=hauteur/2){ x=i-largeur/2; y=j-hauteur/2; }
frequency_repr[j*largeur+i][0]=reIn[y*largeur+x];
frequency_repr[j*largeur+i][1]=imIn[y*largeur+x];
}
plan=fftw_plan_dft_2d(hauteur, largeur, frequency_repr, spatial_repr, FFTW_BACKWARD, FFTW_ESTIMATE);
fftw_execute(plan);
/*on retranscrit l'image complexe en image réelle, sans oublier de diviser par largeur*hauteur*/
for(i=0;i<largeur*hauteur;i++)
{
out[i]=spatial_repr[i][0]/(largeur*hauteur);
}
fftw_destroy_plan(plan);
fftw_free(spatial_repr);
fftw_free(frequency_repr);
} |