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

Signal Discussion :

FFT inverse


Sujet :

Signal

  1. #1
    Candidat au Club
    Inscrit en
    Mai 2007
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 5
    Points : 2
    Points
    2
    Par défaut FFT inverse
    bonjour!

    j'ai utilisé la FFT de millie en scilab et je l'ai convertit en matlab.

    La FFT direct marche très bien mais l'inverse ne marche pas.

    Voila mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function T = TFDrapideInverse(X)
     
    dimensionX = length(X);
    T = TFDrapide(X);
    for k=0:dimensionX-1
    T(k+1) = conj(T(k+1)) / dimensionX;
    end
    Où est le problème???
    merci d'avance

  2. #2
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Ca veut dire quoi ne marche pas ?

    Pour rappel (vu que j'ai déplacé les messages), mon code scilab était celui ci :
    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
    clear;
     
    ////////////////////////////
    // Partie 1: TFD rapide  ///
    ////////////////////////////
     
     
    //Fonction permettant de realiser le decoupage
    // d'un vecteur X de taille pair en deux vecteurs
    // Le premier aura les valeurs des indices impair
    // Le second aura les valeurs des indices pair
    function [X0, X1] = decouper(X);
     dimensionX = length(X);
     for k=0:dimensionX/2-1;
       X0(k+1) = X(2*k+1);
       X1(k+1) = X(2*k+2);
     end;
    endfunction;
     
    //Tests de la fonction
    [dec1, dec2] = decouper([1,2,4,5]');
     
     
    //Transformee Fourier Discrete Rapide
    // Precondition: X de dimension 2^q 
    function T= TFDrapide(X)
     dimensionX = length(X);
     if (dimensionX==1) then
        //cas d'arret 
        T(1) = X(1);
      else
        //cas general
        [X0, X1] = decouper(X);
        TFDX0 = TFDrapide(X0);
        TFDX1 = TFDrapide(X1);
        for k=0:dimensionX/2-1;
          T(k+1) = TFDX0(k+1) + exp(-2* %i * %pi * k/ dimensionX) * TFDX1(k+1);
          T(k+1+dimensionX/2) = TFDX0(k+1) - exp(-2* %i * %pi * k/ dimensionX) * TFDX1(k+1);
        end;
      end;
    endfunction;
     
     
     
    ///////////////////////////////////
    // Partie 2: TFD rapide inverse  //
    ///////////////////////////////////
     
     
    //Transformee Fourier Discrete Inverse Rapide
    function T = TFDrapideInverse(X)
     dimensionX = length(X);
     T = TFDrapide(X);
     for k=0:dimensionX-1;
       T(k+1) = conj(T(k+1)) / dimensionX;
     end;
    endfunction;
     
     
     
    //////////////////////////////////
    // Partie 3: Module de spectre  //
    //////////////////////////////////
     
     
    //Calcul le module du spectre d'un vecteur X
    //  qui sera allonge a une taille 256
    //Precondition: taille de X inferieur a 256
    function S = modspectre(X)
      dimensionX = length(X);
      for k=1:256;
        S(k) = X(max(int((k /256) * dimensionX),1));
      end;
      S = TFD(S);
      for k=1:256;
        S(k) = abs(S(k));
      end;
    endfunction;
     
     
    /////////////////////////////
    // FONCTION POUR LES TESTS //
    /////////////////////////////
     
    //version moins optimise du calcul de la TFD
    // par simple application de la definition de la TFD
    function T = TFD(X);
      dimensionX = length(X); 
     for k=0:dimensionX-1;
       somme=0;
       for n=0:dimensionX-1;
         somme = somme + X(n+1)* exp(-2*%i*%pi*k*n/dimensionX);
       end;
       T(k+1) = somme;
     end;
    endfunction;
     
     
    //version moins optimise du calcul de la TFD inverse
    // par simple application de la definition de la TFD inverse
    function T = TFDinverse(X);
     dimensionX = length(X);
     for k=0:dimensionX-1;
       somme=0;
       for n=0:dimensionX-1;
         somme = somme + X(n+1)* exp(2*%i*%pi*k*n/dimensionX);
       end;
       T(k+1) = somme / dimensionX;
     end;
    endfunction;
     
     
    //fonction utilise pour tester la fonction modspectre
    function X = creerSin()
     
     for k=1:2048;
       X(k) = sin(k/5);
     end;
     
    endfunction;
     
     
     
    ////////////
    // TESTS ///
    ////////////
     
    //version rapide
    timer();
     s3 =  TFDrapide(creerSin());
    //version peu optimise
    disp(timer());
     
    timer();
    S3 = TFD(creerSin());
    disp(timer());
     
    //version de scilab
     
     sc = fft( [45,14,14,15,14,15,16,17]',-1);
     
    //version rapide
     //s4 = TFDrapideInverse([45,14,14,15,14,15,16,17]');
    //version moins optimise
     //s4 = TFDinverse([45,14,14,15,14,15,16,17]');
     
    //test de modspectre
     spectre = modspectre(creerSin());
    Je ne répondrai à aucune question technique en privé

  3. #3
    Candidat au Club
    Inscrit en
    Mai 2007
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Ca ne marche pas, ça veux dire qu'elle ne me donne pas les mêmes résultats.

    Par exemple,si je fais la fft inverse d'un recte, elle me donne un signal sinc,mais il n'est pas le même que celui implementé sur matlab. Je vois les mêmes resultats, mais inversés, donc mon signal est inversé.

    Comment faire pour y remédier ?
    Est ce que le programme en scilab que vous avez publié fonctionne pour la fft inverse ?

  4. #4
    Membre éclairé
    Avatar de parp1
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    829
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Mai 2005
    Messages : 829
    Points : 872
    Points
    872
    Par défaut
    Ca doit être un problème de phase.... dans ce cas.
    [SIZE="2"]Dis moi qui tu suis, je te dirais qui je Hais!
    Heureux est l'étudiant, qui comme la rivière suit son cours sans sortir de son lit

    Mon premier Tutoriel


    A 80% des cas je résouts mon problème en rédigeant une nouvelle discussion, du coup je ne poste que 20% de mes problèmes...

  5. #5
    Membre éprouvé
    Avatar de rostomus
    Homme Profil pro
    Doctorant électronique et traitement du signal
    Inscrit en
    Décembre 2006
    Messages
    791
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant électronique et traitement du signal

    Informations forums :
    Inscription : Décembre 2006
    Messages : 791
    Points : 1 205
    Points
    1 205
    Par défaut
    Salut,

    j'ai essayé les programmes de millie: ça donne exactement les mêmes resultats que les fft et ifft de matlab.
    MATLAB 7.4 (R2007a) WIN XP SP2
    -------------------------------------

  6. #6
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Citation Envoyé par rostomus
    Salut,

    j'ai essayé les programmes de millie: ça donne exactement les mêmes resultats que les fft et ifft de matlab.

    Donc l'erreur ne vient pas de moi (d'ailleurs, j'étais quasi sûr de mon code, je l'avais pas mal testé). Mais je me demande comment tu utilises ça.


    La fonction modspectre est une fonction qui n'a pas réellement de rapport direct.
    Je ne répondrai à aucune question technique en privé

  7. #7
    Candidat au Club
    Inscrit en
    Mai 2007
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    @ millie :
    si je fais par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    plot(abs(ifft(fft(sinc(t),8))));
    normalement ça me donne la courbe d'un sinus cardinal et c'est le cas. Mais si je fait ça pour le cas de ton tfd rapide :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    plot(abs(TFDrapideInverse(TFDrapide(sinc(t),8))));
    ça me donne toujours un sinc mais inversé

    @ rostomus :
    si ça marche très bien dans ton matlab, peux-tu s'il te plait me donner ton code pour faire la fft inverse. Peut être que je ne l'ai pas bien convertit ou bien j'ai oublié une instruction.

    merci pour votre aide

  8. #8
    Membre éprouvé
    Avatar de rostomus
    Homme Profil pro
    Doctorant électronique et traitement du signal
    Inscrit en
    Décembre 2006
    Messages
    791
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant électronique et traitement du signal

    Informations forums :
    Inscription : Décembre 2006
    Messages : 791
    Points : 1 205
    Points
    1 205
    Par défaut
    Salut,

    Oui, en fait, tu as raison, il y a un problème de phase.

    Normalement (si j'ai compris le problème), dans la fonction "TFDrapideInverse", il faut ajouter un "conj":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function T = TFDrapideInverse(X)
     dimensionX = length(X);
     T = TFDrapide(conj(X));
     for k=0:dimensionX-1;
       T(k+1) = conj(T(k+1)) / dimensionX;
     end;
    car:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    FFTinverse(k)=(1/N)*somme( X(t)*exp(-i*t*k/N))
                    =(1/N)*conj[ somme( conj( X(t) )*exp(i*t*k/N))]
                    =(1/N)*conj( FFT( conj(X) ) )
    MATLAB 7.4 (R2007a) WIN XP SP2
    -------------------------------------

  9. #9
    Candidat au Club
    Inscrit en
    Mai 2007
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Merci rostomus !

    Maintenant les valeurs ne sont plus inversées.

    qui pourait me dire comment visualiser juste une partie du signal sur matlab??
    merci pour votre aide

  10. #10
    Membre éprouvé
    Avatar de rostomus
    Homme Profil pro
    Doctorant électronique et traitement du signal
    Inscrit en
    Décembre 2006
    Messages
    791
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant électronique et traitement du signal

    Informations forums :
    Inscription : Décembre 2006
    Messages : 791
    Points : 1 205
    Points
    1 205
    Par défaut
    Salut,

    par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    x=randn(1,100);
    plot(x(20:70));  % visualise x entre le 20 ième et le 70 ième échantillon
    MATLAB 7.4 (R2007a) WIN XP SP2
    -------------------------------------

Discussions similaires

  1. [FFTW3] - FFT Inverse
    Par bobby4078 dans le forum Bibliothèques
    Réponses: 0
    Dernier message: 25/02/2013, 22h07
  2. fft inverse
    Par rochdidz dans le forum Signal
    Réponses: 4
    Dernier message: 15/06/2012, 13h13
  3. Code source de FFT et FFT inverse pour Delphi
    Par david_chardonnet dans le forum Delphi
    Réponses: 2
    Dernier message: 06/03/2007, 22h46
  4. FFTW : FFT et FFT inverse
    Par Ange44 dans le forum Bibliothèques
    Réponses: 1
    Dernier message: 29/09/2006, 17h32
  5. FFT inverse, algorithme adapté ?
    Par progfou dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 09/04/2006, 18h08

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