programmation de la fft en langage C

programmation de la fft en langage C - C - Programmation

Marsh Posté le 24-05-2013 à 13:51:47    

Bonjour à tous,
 
 Je suis actuellement stagiaire dans une petite start up, et je dois réaliser l'acquisition de spectres d'absorption à partir d'un capteur ;
 
...Mais pour l'instant j'en suis encore à la simulation, et un j'ai un probleme concernant le calcul de la fft de mon tableau de valeurs, qui je précise m'a été donné et que je devais utiliser et réajuster selon mes besoins ;
 
Donc ci-dessous je vous ai mis le code, sur lequel ( sur codeblock ) il ne m'affiche 2 erreurs sur "*in" et sur "*out" en me disant : "error : invalid type argument of unary '*' (have 'int')".
=> J'ai donc remplacé par les tableaux vers lesquels ces pointeurs pointent mais ça ne marche toujours pas.
 
 
 
Est ce que l'un d'entre vous saurait la raison de mon probleme ( en sachant que normalement mon printf dans le main  doit m'afficher le résultat de la fft.
 
Merci d'avance pour votre aide.
 
 
 
 
/* ****** CODE FFT ****** */
 
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
 
fft_(n,pw,in,out);
 
float x[]= {
            0.058239,
            0.05822,
            0.058966,
            0.05928,
            0.061801,
            0.062823,
            0.064514,
            0.065286,
            0.066999,
            0.064993,
            0.069892,
            0.070769,
            0.070767,
            0.073237,
            0.073739,
            0.076339,
            0.074125
            };
 
float y[];
float re[], im[];
 
float *in, *out;
int n=20;
int pw=2;
int i, count;
 
 
int main()
{
    in=x;
    out=y;
    fft_(n,pw,in,out);
 
    for(i=0;i<n;i++)
        printf("%f\n", *out++);
 
    return 0;
}
 
 
fft_(n,pw,in,out)
{
    float a,c,e,s,re_,im_;
    int i,j,k,l,n1,n2;
 
    for(i=1;i<=n;i++)
        { re[i]=*in;
          im[i]=0.0;
          in++;
        }
    n2=n;
    for(k=1;k<=pw;k++)
        { n1=n2;
          n2=n2/2;
          e=6.2831853071795865/n1;
          a=0.0;
          for(j=1;j<=n2;j++)
            { c=cos((float)a);
              s=sin((float)a);
           a=j*e;
              for(i=j;i<=n;i+=n1)
                { l=i+n2;
                  re_  =re[i]-re[l];
                  re[i]=re[i]+re[l];
                  im_  =im[i]-im[l];
                  im[i]=im[i]+im[l];
                  re[l]=c*re_+s*im_;
                  im[l]=c*im_-s*re_;
                }
            }
        }
 
        j=1;
        n1=n-1;
        for(i=1;i<=n1;i++)
            { if(i<j)
                { re_=re[j];
                  re[j]=re[i];
                  re[i]=re_;
                  im_  =im[j];
                  im[j]=im[i];
                  im[i]=im_;
                }
                k=n/2;
                while(k<j)
                    { j=j-k;
                      k=k/2;
                    }
                    j=j+k;
            }
 
            for(i=1;i<=n;i++)
                {
                    *out=sqrt((float)(re[i]*re[i]/((float)n*(float)n)+im[i]*im[i]/((float)n*(float)n)));
                    out++;
                }
}

Reply

Marsh Posté le 24-05-2013 à 13:51:47   

Reply

Marsh Posté le 24-05-2013 à 15:44:29    

Je ne sais pas d'où tu as eu ce code, mais il y a un paquet de trucs qui ne collent pas :

  • Prototype de fonction sans type pour les arguments. L'inférence de type, ça marche pas en C.
  • Tableau sans dimension. Les tableaux dynamiques façon javascript, ça marche pas en C.
  • Tu initialise n à 20. Il n'y a que 17 éléments dans ton tableau d'entré. Pas bon.
  • Les indices d'un tableau de N cases vont de 0 à N-1. Tout ton code itère de 1 à N. Pas bon.
  • J'ai tenté de corrigé le code, mais je me tape une boucle infinie dans while(k<j) { j=j-k; k=k/2; }


Il y a des bibliothèques toute faite pour calculer la FFT... veux-tu vraiment réinventer la roue carrée ?

Reply

Marsh Posté le 24-05-2013 à 15:59:34    

c'est mon tuteur qui a récupéré ces codes apparemment avec d'autres personnes ; il m'en a donné des tonnes afin que j'y puise les ressources nécessaires à mon projet.
Oui je suis justement en train de récupérer ces bibliothèques FFT pour les utiliser, merci beaucoup tpierron !

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed