IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Traitement du signal Discussion :

Algo FFT problème!


Sujet :

Traitement du signal

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 11
    Points : 2
    Points
    2
    Par défaut Algo FFT problème!
    Bonjour à tous!

    Voilà cela fait 15 jours ue je tourne en rond...
    Je tente de réaliser un algo de FFT (par Cooley et Tukey) mais je rencontre certaines difficultés...

    L'algo est itératif.

    La partie de mise en ordre des données par inversion des bits est normalement sûre (mais bon en info on ne sait jamais...)

    Lorsque je compare par produit de matrice direct sous Mathematica mon algo fonctionne pour des liste de taille 2 et 4, pour 8 je trouve ne trouve qu'une valeur sur deux de correct!!

    Je préfère dire tout de suite que je dois réaliser cet algo dans les cadre d'un devoir (magistère de physique première année, rattrapage d'oral d'info), car je sais que c'est assez mal vu...enfin bref je demande à de bonnes âmes de me porter secours...


    Merci d'avance!!!!

    NB:je m'excuse par avance de la lourdeur éventuele de l'écriture de mon programme....et des fautes d'orthographes de mon message...

    Je joint la source en c et un scan de la methode utilisée.
    Images attachées Images attachées  
    Fichiers attachés Fichiers attachés

  2. #2
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Je veux bien tenter de t'aider mais j'avoue ne rien connaitre au transfert de fourrier alors si tu me donnes l'algo je veux bien essayer de t'aider. En attendant j'ai commencé à regarder le code c'est pas si mal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    #include <stdio.h>
     
    #include <stdlib.h>
     
    #include <math.h>
     
    #include <complex.h>
     
    void FFT(double complex *,double complex *,int );
     
     
     
     
     
    void FFT(double complex *l,double complex *r,int p)
     
     { 
     
        int N = pow( (double)2 , (double)p );
     
        double complex *w = malloc( N * sizeof *w );
     
        w[0] = 1 + 0 * I;
     
         /*mise en place de la liste des puissances de w*/
     
        double complex c= cos( 2. * M_PI / N ) - sin( 2. * M_PI / N ) * I;
     
        for(int i1 = 0 ; i1 <= N-2 ; i1++ )
     
            w[i1+1] = w[i1] * c;
     
     
     
     
     
       /*inversions des bits*/ 
        int w1, z, s, d;  
     
        for( int k = 0 ; k <= N-1 ; k++ )
     
        {
            w1 = 0;
            z = k;
            s = 0;
            d = N/2;
     
     
     
            for( int k1 = 0; k1 <= p-1 ; k1++ )
     
            {      
     
               if ( z == 0 )
                break;
     
               if(z!=0)
     
               {
                    w1 = z % 2;
                    s += w1 * d;
     
                    d /= 2;
     
               }
     
               z = (z-w1) / 2;
     
            }
     
     
     
            r[k] = l[s];
     
     
     
     
     
        }
     
     
     
     
     
         /*la partie calcul proprement dite*/
     
        {    
     
            int d1 = N/2; 
            int d2 = 1;
     
            for (int j = 1; j <= p; j++)
     
            {
     
                for(int i = 0; i <= d1-1; i++)
     
                {
     
                    for(int b = 0; b <= d2-1; b++)  
     
                    {                         
     
                        double complex r1inter = r[ i * 2 * d2 + b ];
     
                        double complex r2inter = r[ i * 2 * d2 + b + d2 ];       
     
                        r[ i * 2 * d2 + b ] = ( r1inter + r2inter * w[b] ) * 0.5; 
     
                        r[ i * 2 * d2 + b + d2 ] = ( r1inter - r2inter * w[b] ) * 0.5;                   
     
                    }                 
     
                }
     
                d1 /= 2; 
                d2 *= 2; 
     
            }                   
     
        }            
     
        free(w);           
     
    }           
     
     
     
     
     
    int main(void)
     
    {            
     
        double complex *testprime = malloc( 8 * sizeof *testprime );
     
        double complex *result1prime = malloc( 8 * sizeof *result1prime );
     
     
     
        testprime[0]=40.;
     
        testprime[1]=23.;
     
        testprime[2]=1.;
     
        testprime[3]=54.;
     
        testprime[4]=1.;
     
        testprime[5]=8.;   
     
        testprime[6]=1.;
     
        testprime[7]=4.;
     
     
     
        FFT( testprime, result1prime, 3);
     
     
     
        for( int lambda = 0; lambda <= 7; lambda++)
     
            (void) printf("%lg + %lg*i \n", creal( result1prime[lambda] ), cimag( result1prime[lambda] ));
     
     
     
        free(testprime);
     
        free(result1prime);                    
     
        return EXIT_SUCCESS;            
     
    }
    Cordialement.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 79
    Points : 77
    Points
    77
    Par défaut Bon voila
    JE regarde ton probleme
    Comme tout le monde ... J'y comprends pas tout

    - Vire le pow qui est une fonction reelle " e^(ln(x)*y) "
    Elle connait une incertitude
    Si pow(2,3)=7.99999999235 et non 8.00000000023 ... ton prog est mort
    car le plongement dans N te donnera 7 et pas 8

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    N=1;
    for (i=0;i<p;i++)
      N*=2;
    Ca c'est sur !

    Ensuite , vire le break ... C'est un conseil !
    Soit il n'admet pas de sens (dans un calcul iteratif ... en general y'a pas d'exceptions )
    Soit remplace le par des if.

    Enfin, tu utilises %2 dans les permutations ... soit 0 ou 1
    Le papier lui fait etat plutot de 1 ou -1 ?

    La partie permuttation ne sent pas bon en tout cas


    Si tu veux une version de ton prog ( a l'identique ... seulement des modifs syntaxiques et des commentaires expliquant ou je m'interroge )
    Demande

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 79
    Points : 77
    Points
    77
    Par défaut
    Quand on regarde le dessin...
    Le monsieur te dit permutte un ensemble de n=2^p elements
    Autrement dit pour tout i<=n ... calcule pos(i)



    Convention,ici je parle de 1 a n ... pas de 0 a n-1...

    Applique successivement ... l'ordre 1
    l'ordre 2
    ...
    l'ordre P

    L'ordre 1 ca ressemble a ca
    permutte 2 a 2 les pairs et impaires ( 1 et 2; 2 et 3; ...;n-1 et n)
    (soit des blocs de 2 ... on permutte i et i+1)

    Applique les permuttations d'ordre 2
    permutte ( 1 et 3, 2 et 4; 5 et 7, 6 et 8)
    (soit des blocs de 4 ... on permutte i et i+2)

    A l'ordre 3
    permutte ( 1 et 5, 2 et 6, 3 et 7, 4 et 8 )
    (soit des blocs de 8 ... on permutte i et i+4)


    Si c'est cela ... Y'a plus limpide pour faire les permutations
    Et c'est sur ... pas de break!!


    Enfin ... plus un algorithme de calcul est court ... Plus il a de chances de coincider avec la realité


    Peux tu me confirmer que la notion de permuttation que je te donne est correcte ?

  5. #5
    Membre éclairé Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Points : 858
    Points
    858
    Par défaut
    Citation Envoyé par e_gaillard37 Voir le message
    JE regarde ton probleme
    Comme tout le monde ... J'y comprends pas tout
    [...]
    Eh bien moi j'ai lu tout tes posts, et comme beaucoup de monde, on n'y comprends absolument rien.
    C'est tellement brouillon que je ne sais même pas si ce que tu racontes est vrai ou faux.....

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 79
    Points : 77
    Points
    77
    Par défaut je sais ...que j'ai pas forcement raison mais ...
    Bien sur ... je dis peut etre des salades
    Mais le dessin est pas clair ...
    Pourquoi des fleches descendent elle en ligne droite ?????

    Mais si j'ai raison...
    la personne fait
    - for( int k = 0 ; k <= N-1 ; k++ ) //traitement de chaques y
    ...
    - for( int k1 = 0; k1 <= p-1 ; k1++ ) // niveau
    ...

    Elle traite point par point ...


    alors qu'il faut appliquer les niveaux successif ( permuttations d'ordre 1, 2 et 3)
    -for( int k1 = 0; k1 <= p-1 ; k1++ )
    ....
    - for( int k = 0 ; k <= N-1 ; k++ ) // on applique la permuttation de niveau k1
    a chaque point

    ...

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 11
    Points : 2
    Points
    2
    Par défaut
    Bon déjà je vous remercie d'avoir prêter attention à mon problème (vraiment merci!!!)

    Pour la permutation des données ne vous prenez pas la tête je fais juste une inversion des bits de donnés pour avoir le bon ordre dans ma liste

    donc je dois faire correspondre chaque indice 0,1,2,3...
    son equivalent en binaire, prendre le mirroir de ce nombre en binaire et le reconvertir en décimal (je vous envoie un autre scan pour cette partie, j'ai été bête de ne pas l'avoir envoyé au début)

    sinon je vais changer la fonction pow...
    Images attachées Images attachées    

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Points : 1 069
    Points
    1 069
    Par défaut
    Pour remplacer ta fonction pow, tu peux utiliser
    Attention ne marche pas pour p=0 mais comme ce serait débile de faire une FFT d'ordre 0, ça passe.

    Toutefois, ton problème ne vient pas d'ici.

    Une idée comme ça mais c'est à toi de voir. Je n'ai plus le courage de regarder.
    Tu dois faire tes calculs avec des wN(-k). Ton tableau w contient toutes les valeurs de wN pour des valeurs positives de k. Il ne te faudrait pas plutôt calculer avec des valeurs négatives. Ton b est aussi positif.

    Autre chose: tu as insisté en disant que ton algo était itératif mais dans l'article il appelle successivement des FFTs d'ordre inférieur. C'est plutôt récursif ? Pourquoi l'as tu rendu itératif ? C'est plus compliqué, non ?

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 11
    Points : 2
    Points
    2
    Par défaut
    @Aoyou

    Mon wN est déjà pris tel qu'il corresponde à un wN[-1] de l'article
    dans l'article wN=exp[2*I*Pi/N], le mien est wN=exp[-2*I*Pi/N]

    w[0] = 1 + 0 * I;

    /*mise en place de la liste des puissances de w*/

    double complex c= cos( 2. * M_PI / N ) - sin( 2. * M_PI / N ) * I;

    for(int i1 = 0 ; i1 <= N-2 ; i1++ )

    w[i1+1] = w[i1] * c;


    Pour la question de l'itérativité, dans le schema envoyer dans mon premier message l'arbre est parcouru de haut en bas en sachant que les données de départ ont étées mises dans un ordre différent (boulversement de l'ordre des données par inversion des bits, ce qui correspond à la première partie de mon programme...)

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Points : 1 069
    Points
    1 069
    Par défaut
    Oui, c'est vrai que j'avais vu que tu calculais un wN(-1) mais ça m'a échappé par la suite.

    Ok pour ton algo itératif encore que... mais je comprends mieux comment tu essaies de parcourir ton arbre.

    Ton inversion des bits est bonne.

    Maintenant, tu m'étonnes que tu ais une erreur. Essayer de reproduire le parcours de l'arbre avec trois boucles for avec des indices de fin de boucle qui n'arrête pas de changer. Ca ne m'étonne pas que tu te sois planté dans un de tes indices.

    Il y a t'il moyen d'écrire quelque chose de plus lisible et qu'il soit possible de faire assez rapidement la liaison entre l'arbre et le code parce que là... ?

    A l'ordre 3, ton r[k] est résultat d'une fonction de p[k] et i[k], qui eux même sont résultats de cette même fonction mais à l'ordre 2 et encore un jusqu'à l'ordre 1. Ca ne serait pas plus simple avec un peu de récursivité ?

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 11
    Points : 2
    Points
    2
    Par défaut
    @Aoyou

    Il est vrai que le parcour de l'arbre est diffcilement lisible avec les trois boucle for (je prend papier crayon à chaque fois pour suivre le programme étape par étape)

    mais le plus bizarre c'est l'algo semble marcher pour des listes de taille 4 mais pas de 8...

  12. #12
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Points : 1 069
    Points
    1 069
    Par défaut
    Oui ça marche à l'ordre 3 pour les valeurs paires. Tu as déjà bien dû te casser la tête.

    Mais pas pour les valeurs impaires... Il doit te manquer un changement d'indice supplémentaire ou je ne sais quoi. Enfin là, c'est d'une difficulté à débugger. Je ne veux même pas essayer. Tu ne pourrais pas faire 3 grandes étapes de calcul successives et écrire une fonction qui permet de calculer un Y(k)...

    Imagine maintenant que je te demande de coder que l'ordre 4 avec des boucles imbriquées et je ne parle pas encore de 5 ni de n...

  13. #13
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 11
    Points : 2
    Points
    2
    Par défaut
    pour l'ordre 3 tu as vérifié ou tu te fies à ce que j'ai indiqué?

    sinon je ne comprend pas le sens de "3 grandes étapes pour aboutir au calcul d'un Y(k)"

  14. #14
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Points : 1 069
    Points
    1 069
    Par défaut
    J'ai vérifié.
    Tu as vu que j'avais changé mon message précédent.

  15. #15
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 11
    Points : 2
    Points
    2
    Par défaut
    avec quoi est-ce que tu as vérifié?

  16. #16
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Points : 1 069
    Points
    1 069
    Par défaut
    Désolé Mathematica, donc si Mathematica se trompe, on est berné tous les deux mais j'ai confiance en lui.

  17. #17
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Points : 1 069
    Points
    1 069
    Par défaut
    Une étape avec les vecteurs de longueur 2.
    Une etape avec les vecteurs de longueur 4.
    Une étape avec le vecteur de longueur 8.

    Je ne sais pas pourquoi j'ai écrit pour le calcul d'un Y(k).

  18. #18
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 11
    Points : 2
    Points
    2
    Par défaut
    C'est vrai que c'est plus simple en recursif mais je dois le faire en itératif...

    Si je dois le faire pour les listes de taille 2 puis 4 puis 8

    je ne vois pas comment (toujours en itératif) ne pas utiliser autres choses que des boucles pour parcourir correctement l'arbre, ou lors cela reviendrait à tout écrire explicitement!!!

  19. #19
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Points : 1 069
    Points
    1 069
    Par défaut
    Ca reste itératif ce que je te dis et tu n'as plus trois boucles for imbriqués.

    La première étape est une boucle à 4 étapes pour calculer r[i] et r[i+1].

    C'est explicite mais c'est compréhensible.

  20. #20
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 11
    Points : 2
    Points
    2
    Par défaut
    désolé je suis un peu long à la détente le "C'est vrai que c'est plus simple en recursif mais je dois le faire en itératif... " correspondait à une remarque générale


    sinon je commence à comprendre ce que tu veux dire...
    tu veux que j'enlève une boucle for...
    pas bête, pour une taille 8 c'est faisable... et je pourrais vérifier plus en détail l'algo

    je m'y remet demain moi va faire dodo

    en tout cas je suis étonné de l'implication des gens de ce forum...
    encore merci...

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Transformée de Fourier (fft) problème
    Par Hadrien_G dans le forum MATLAB
    Réponses: 7
    Dernier message: 04/03/2015, 08h57
  2. Algo A* problème de perfs
    Par bombseb dans le forum Intelligence artificielle
    Réponses: 9
    Dernier message: 06/08/2014, 07h59
  3. Puissance4 - Algo MinMax - problème heuristique
    Par Skydoo dans le forum Intelligence artificielle
    Réponses: 0
    Dernier message: 09/12/2012, 15h38
  4. Réponses: 2
    Dernier message: 05/05/2009, 08h57
  5. Algo de calcul de FFT
    Par djlex03 dans le forum Traitement du signal
    Réponses: 15
    Dernier message: 02/08/2002, 17h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo