Transformée de Fourier discrète en C++
Répondre à la discussion
Affichage des résultats 1 à 15 sur 15

Transformée de Fourier discrète en C++



  1. #1
    invitef563f708

    Transformée de Fourier discrète en C++


    ------

    Voila j'ai un léger souci avec un programme pour faire la tranformée de fourier d'une fonction constante et égale à 1 entre -a/2 et a/2 ( ou a=0.0018 par exemple).

    J'essaye d'utiliser l'algorithme standard, en faisant une somme sur cos et sin. Mais je touve des résultats abérants du genre -1557800 .

    Si des personnes pourraient avoir une idée d'un programme simple pour la transformée de fourier, toute aide serait le bienvenu.

    Merci à vous.

    P.S: je suis vraiment nul en C++, je n'ai jamais eu de cours dessus et je dois faire un programme.
    Et bon la je commence à péter un cable

    -----

  2. #2
    invite24357dd0

    Re : Transformée de Fourier discrète en C++

    Tu es sûr que tu as bien typé tes variables ? Le résultat aberrant pourrait provenir de cela.

    Et pourquoi tu dois faire un programme en C++ alors que tu n'as jamais eu de cours là-dessus ? Tu sais programmer en C, au-moins ? Et tu as eu le choix du langage ou le prof t'a imposé (bêtement puisque tu n'as jamais eu de cours) le C++ ?

  3. #3
    deep_turtle

    Re : Transformée de Fourier discrète en C++

    Tu peux peut-être indiquer le bout de code qui fait le calcul de la TF discrète, on paurra regarder en détail ce qui cloche ? l'hypothèse du mauvais typage (un entier passé en paramètre là où un float est attendu, par exemple) semble en effet la piste la plus probable...

  4. #4
    acx01b

    Re : Transformée de Fourier discrète en C++

    essaye juste avant ton for {var_cos = var_cos + ..... et var_sin = var_sin + ....}
    d'initialiser var_cos et var_sin à 0, parfois ils prennent une valeur -2^16 par défaut

    double fou_cos[500], fou_sin[500], signal[100000], t_fourier[500];
    double constante = 2M_PI/N; // N = taille de la porte (taille de l'échantillon)
    //après: (signal[f2] c'est bien sur le signal de départ, à transformer)
    for (f1 = 0; f1 < 500; f1++) { //ici on s'arrete à 500 en fréquence
    fou_cos[f1] = 0;
    fou_sin[f1] = 0;
    for (f2 = 0; f2 < N; f2++) {
    fou_cos[f1] = fou_cos[f1] + signal[f2] * cos(constante * f2 * f1);
    fou_sin[f1] = fou_sin[f1] + signal[f2] * sin(constante * f2 * f1);
    }
    t_fourier[f1] = pow(pow(fou_sin[f1],2)+pow(fou_cos[f1],2),0.5);
    //t_fourier[f1] contient le spectre (module du complexe fou_cos + i*fou_sin)
    }

  5. A voir en vidéo sur Futura
  6. #5
    invitef563f708

    Re : Transformée de Fourier discrète en C++

    Je n'ai pas eu le choix pour le choix de c++
    en fait mon programme c'est une boucle while imbriquée dans une boucle for. Je vous enverrai les détails demain

  7. #6
    invitef563f708

    Re : Transformée de Fourier discrète en C++

    Voila en gros mon programme. En fait je me suis basé sur le fait que
    Soit f une fonction continue sur [-a/2,a/2].
    F(mr)=h*sum(f(kh)*(cos(2*Pi*k* m/(2*N))+j*h*sum(f(kh)*(sin(2*Pi *k*m/(2*N)).
    Ou N est le nombre de division de l intervalle
    h le pas dans le domaine temporelle ( a/(N))
    r le pas dans le domaine fréquentiel (r=1/a)

    alors mon prog qui est très simpliste et surement faux. Je mets ici le calcul du cos simplement ( ou je prends f=1 sur l intervalle )
    ensuite il faudra que je calcule le sin et apres en fait il faut que j'effectue la somme au carré des résultas obtenus (c'est pas gagné quoi ):

    #include <stdio.h>
    #include >math.h>
    #define P 3.14156
    #define N 16
    #define a 0.0018

    main void();
    {int n;
    for(n=-N;n<=N;n=n+1)
    {int k=-N;
    float somme=a/N*cos(2*P*n*-16/(2*16));
    while (k<=N-1);
    {k=k+1;
    somme+=a/N*cos(2*P*k*n/(2*N);
    }
    printf("fft %d/n",somme);
    }
    }

    Voila mon programme, ne vous moquez mais comme je l'ai dit j'ai jamais fait de c++, donc j'utilise les "moyens du bord".

    En espérant de l'aide de votre part.

    De plus je suis filiale physique et bon l'informatique n'est pas mon fort.

    P.S: il est fort possible que le programme ci dessus comporte des erreurs de recopie.
    Merci pour vos réponses.

  8. #7
    invitedebe236f

    Re : Transformée de Fourier discrète en C++

    suis pas tres douer en "fourier"
    mais pour une fonction continu a 1 tous les terme valant 1 la tranforme est premier terme = le nombre d echantillon*1 ?

    j ai un pgm qui fait des tranforme rapide c est equivalent ?

  9. #8
    invitef563f708

    Re : Transformée de Fourier discrète en C++

    Oui, c'est équivalent.

  10. #9
    deep_turtle

    Re : Transformée de Fourier discrète en C++

    OK... J'imagine que le n du code, c'est le m de la formule ?

    Un conseil : quand tu indiques un code comme ça, fait un copier/coller de ce que tu as utilisé et pas une recopie retéapée, parce que là il y a pas mal de fautes de frappe, et du coup le code que tu as envoyé n'a aucune chance de compiler... Difficile de dire dans ces conditions ce qui peut causer ton problème !

    Alors je vois déjà un problème de typage dans ce bout de code : dans la ligne
    Code:
    float somme=a/N*cos(2*P*n*-16/(2*16));
    l'argument du cosinus me semble bizarre (le 16 est redondant avec le n) mais peu importe pour le moment. L'expression 16/(2*16) vaut 0 en C++, non ? C'est une division entière, alors que ce que tu veux écrire c'est 16./(2.*16.).

    Sinon plusieurs remarques :

    - Je ne comprends pas bien pourquoi tu a fait une boucle "while" sur k au lieu d'une boucle "for".
    - Il faut éviter d'écrire le 16 en dur dans le code si tu as défini N=16 plus haut, autant utiliser N, ça te permettra de changer plus facilement quand tu en auras besoin.
    - Ton code est écrit en C, il n'utilise pas spécialement les fonctionnalités du C++ (ce n'est pas une critique, c'est très bien aussi le C).
    - les multiplications par a/n devraient être factorisées pour gagner du temps de calcul...

    Moi j'aurais plutôt écrit ça comme ça :

    Code:
    void main();
    {
      for(int n=-N; n<=N; ++n)
      {
        float somme = 0.;
        for(int k=-N; k<=N; ++k)
        {
          somme+=cos(2.*P*k*n/(2.*N));
        }
        cout << "fft, element  " << n << " : " << a/N*somme << endl;
      }
    }
    Dernière modification par deep_turtle ; 11/01/2005 à 09h20.

  11. #10
    acx01b

    Re : Transformée de Fourier discrète en C++

    discussion close!
    computer un algo de transformée de fourier discrète est très simple, regarde mon code!

    ps: la transformée d'un signal, est un signal complexe, ou autrement dit la trasnformée d'un vecteur complexe à partie imaginaire nulle est un vecteur complexe de même dimension, et le spectre, ou plutot une approximation du spectre, est calculé en faisant le module de chaque complexe... (module de a + ib = racine de (a² + b²))

  12. #11
    deep_turtle

    Re : Transformée de Fourier discrète en C++

    discussion close!
    computer un algo de transformée de fourier discrète est très simple, regarde mon code!
    Ben elle est peut-être pas "closed" pour tout le monde, la discussion ! strombald veut savoir où il s'est trompé, ce qui est au moins aussi important que de disposer d'un code fourni par quelqu'un d'autre, même s'il marche très bien, non ?

  13. #12
    invitef563f708

    Re : Transformée de Fourier discrète en C++

    Deep_turtle qd je tape ton code. Lorsque je compile il me dit :" parse error before {" . { étant le premier que tu utilises avant le for.
    Pourrais m'indiquer ce qui cloche ?

    Merci

  14. #13
    deep_turtle

    Re : Transformée de Fourier discrète en C++

    oui, au temps pour moi, il n'y a pas de point-virgule après void main() !!

  15. #14
    invitef563f708

    Re : Transformée de Fourier discrète en C++

    Bon, malgré tous mes efforts ça marche pas. Je comprends pas lorsque je multiplie cos par a =0.0018, j'ai des valeurs énormes.
    ça doit être mon programme qui est faux et je ne vois pas où.
    ça me saoule un peu.

    Merci pour votre aide.

  16. #15
    zoup1

    Re : Transformée de Fourier discrète en C++

    Es-tu sur que ton compilateur fonctionne comme il faut en particulier que la librairie mathématique est correctement lié dans ton executable.
    Par exemple as-tu vérifié que cos(1) donne un résultat raisonnable.
    Je te donne une idée, tu me donnes une idée, nous avons chacun deux idées.

Discussions similaires

  1. Transformee de Fourier Discrete reelle
    Par invite4190916a dans le forum Mathématiques du supérieur
    Réponses: 0
    Dernier message: 23/04/2007, 22h44
  2. Table de transformee de fourier discrete
    Par invite8eb08b4f dans le forum Mathématiques du supérieur
    Réponses: 2
    Dernier message: 25/09/2006, 02h42
  3. Transformée de Fourier
    Par juudku dans le forum Mathématiques du supérieur
    Réponses: 4
    Dernier message: 30/05/2005, 04h59
  4. transformee de fourier
    Par invite77e86f54 dans le forum Mathématiques du supérieur
    Réponses: 2
    Dernier message: 17/04/2005, 14h38
  5. transoformation (discrète)de fourier: spectre de phase
    Par acx01b dans le forum Mathématiques du supérieur
    Réponses: 1
    Dernier message: 18/01/2005, 08h11
Découvrez nos comparatifs produits sur l'informatique et les technologies.