bonjour
j'ai réalisé un programme en langage C pour calculé la transformée de fourier rapide à partir d'un échantillon de points.
je précise tout de suite que je programme avec Dev-C++ sous Windows Vista (je sais , niveau compatibilité c'est pas top!)
Seulement j'ai un problème: quand je prend un échantillon de 2^n valeurs avec n=1, 2 ou 3 (c'est a dire jusqu'a 8 valeurs) ça marche nickel (ça me renvoi les valeurs des coefficients de fourier en complexe) mais a partir de n=4 je rentre toutes mes valeurs et puis ça quitte ("fourier.exe a cessé de fonctionné"... erreur de segmentation je suppose)
j'aimerais savoir à quoi ça peut-etre dû (mauvaise allocation mémoire?) et comment je pourrait réglé ça.
merci d'avance
- include <stdio.h>
- include <math.h>
- include <complex.h>
void valeur(float complex *X, float *n);
int Kapa(int m, int j2, int k);
void tfr(float complex *X, float n);
int main()
{
float n;
int h;
float complex *X ;
X= malloc(((int)pow(2,n)) * sizeof(float complex));
valeur(X,&n); /* recuperation des X[j] */
tfr(X,n);
for (h=0;h<((int)pow(2,n));h++)
printf ("resultat re : %f , im : %f \n",creal(X[h]), cimag(X[h]));
free (X);
free (n);
system("pause");
}
void tfr(float complex *X, float n)
{
float Nm,Mm,Rm;
float complex e,a,b,cvar;
int p,var, taille_X,m,k,j;
float complex *Y ;
Y= (float complex *) malloc(((int)pow(2,n)) * sizeof(float complex));
taille_X=(int) pow(2,n);
m=1;var=0;
while (m<n+1)
{
Nm=pow(2,m);
Mm=Nm/2;
Rm=pow(2,n-m);
k=0;
while(k<Mm)
{
cvar = I*3.141592654*(-2)*k/Nm;
e = cexp(cvar);
j=0;
while (j<Rm)
{
var=Kapa(m-1,j,k);
a = X[var];
var=Kapa(m-1,Rm+j,k);
//calcul de kapa
b = X[var] * e;
Y [Kapa(m, j, k)] = (a + b)/2 ;
Y [Kapa(m, j,Mm + k)] = (a-b)/2;
j++;
}
k++;
}
taille_X=(int)(pow(2.0,n));
p=0;
while (p< taille_X)
{
X[p]=Y[p];
p++;
}
m++;
}
free(Y);
}
void valeur(float complex *X, float *n)
{
int i, taille_X;
float *r;
printf("préciser n tel que le nombre de points fasse 2 exposant n : ");
scanf("%f", n);
printf("\n");
taille_X=pow(2,*n); // elevation à la puissance avec pow de la librairie math
i=0;
while (i<((int)taille_X))
{
printf("\n valeur num %d :" ,i);
scanf("%f",X+i);
printf("%d , %f \n",X+i,creal(X[i]));
i++;
}
}
int Kapa(int m, int j2, int k)
{
float Kapa1;
int Kapa2;
Kapa1=j2*pow(2,m)+k;
Kapa2=(int)(Kapa1);
return Kapa2;
}