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

C++ Discussion :

Problème avec transformée de Fourier


Sujet :

C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 29
    Points : 15
    Points
    15
    Par défaut Problème avec transformée de Fourier
    Bonjour,

    Je fais mes débuts en C++ et j'essaie de programmer la transformée de Fourier Discrète. Je veux en gros que ma classe TFD dispose de deux méthodes, reel et imaginaire, qui m'affiche la partie réelle et imaginaire de la transformée de Fourier de mon échantillon de départ. Quand je compile mon programme, il m'affiche 'double' is not a template et invalid types 'double[int]' for array subscript. Que dois-je faire svp pour régler ce problème, ça me prend la tête depuis quelques heures?

    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
     
     
    #include "TFD.hh"
    #include <cmath>
    #include <vector>
     
    using namespace std;
     
     
     TFD::TFD(const int& _dir, const int& _taille, const double<vector>& _x1, const double<vector>& _y1)
                                              :dir(_dir),taille(_taille),x1(_x1),y1(_y1){};
     
     double<vector> TFD::reel() const{
     
           double<vector> x2;
           double arg;
           double cosarg,sinarg;
           int i,k;
     
           for (int i=0;i<taille;i++) {
               x2[i] = 0;
               arg = - dir * 2.0 * 3.141592654 * (double)i / (double)taille;
               for (int k=0;k<taille;k++) {
                   cosarg = cos(k * arg);
                   sinarg = sin(k * arg);
                   x2[i] += (x1[k] * cosarg - y1[k] * sinarg);
                   }
           }
     
           if (dir == -1) {
              for (int i=0;i<taille;i++) {
                  x2[i] = x2[i] / (double)taille;
                  }
              }
     
           return x2;
     }
     
     double<vector> TFD::imaginaire() const{
     
           double<vector> y2;
           double arg;
           double cosarg,sinarg;
           int i,k;
     
     
           for (int i=0;i<taille;i++) {
               y2[i] = 0;
               arg = - dir * 2.0 * 3.141592654 * (double)i / (double)taille;
               for (int k=0;k<taille;k++) {
                   cosarg = cos(k * arg);
                   sinarg = sin(k * arg);
                   y2[i] += (x1[k] * sinarg + y1[k] * cosarg);
                   }
           }
     
           if (dir == -1) {
              for (int i=0;i<taille;i++) {
                  y2[i] = y2[i] / (double)taille;
                  }
              }
     
     
           return y2;
     }
     
     TFD::~TFD(){}
    Merci d'avance pour votre aide

  2. #2
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut

    c'est pas plutôt :

    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 29
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par Goten Voir le message

    c'est pas plutôt :

    Oui effectivement, merci beaucoup, je n'avais pas vu cette erreur bête. Mais maintenant pas d'erreurs quand je compile mais je n'arrive pas à faire des tests avec mon main.

    Voici le fichier .hh

    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
     
    #ifndef _aze_H_
    #define _aze_H_
    #include <vector>
    using std::vector;
     
    class TFD {
     
    private:
            int dir;      // prend comme valeur 1 ou -1 qui nous permet de spécifier si on veut une TF directe ou inverse
            int taille;   // Taille de l'échantillon
            vector<double> x1;  // Vecteur représentant la partie réelle de la série de points (xi) dont on cherche la TF
            vector<double> y1;  // Vecteur représentant la partie imaginaire de la série de points (xi) dont on cherche la TF
     
     
     
    public:
           TFD(const int& _dir, const int& _taille, const vector<double>& _x1, const vector<double>& _y1); //constructeur par défaut
           vector<double> reel() const; //Méthode renvoyant la partie réelle du résultat de la TF
           vector<double> imaginaire() const; //Méthode renvoyant la partie imaginaire du résultat de la TF
           virtual ~TFD();
    };
    #endif
    Le fichier .cpp

    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
     
    #include "TFD.hh"
    #include <cmath>
    #include <vector>
     
    using namespace std;
    using std::vector;
     
     
     TFD::TFD(const int& _dir, const int& _taille, const vector<double>& _x1, const vector<double>& _y1):dir(_dir),taille(_taille),x1(_x1),y1(_y1){};
     
     vector<double> TFD::reel() const{
     
           vector<double> x2;
           double arg;
           double cosarg,sinarg;
           int i,k;
     
           for (int i=0;i<taille;i++) {
               x2[i] = 0;
               arg = - dir * 2.0 * 3.141592654 * (double)i / (double)taille;
               for (int k=0;k<taille;k++) {
                   cosarg = cos(k * arg);
                   sinarg = sin(k * arg);
                   x2[i] += (x1[k] * cosarg - y1[k] * sinarg);
                   }
           }
     
           if (dir == -1) {
              for (int i=0;i<taille;i++) {
                  x2[i] = x2[i] / (double)taille;
                  }
              }
     
           return x2;
     }
     
     vector<double> TFD::imaginaire() const{
     
           vector<double> y2;
           double arg;
           double cosarg,sinarg;
           int i,k;
     
     
           for (int i=0;i<taille;i++) {
               y2[i] = 0;
               arg = - dir * 2.0 * 3.141592654 * (double)i / (double)taille;
               for (int k=0;k<taille;k++) {
                   cosarg = cos(k * arg);
                   sinarg = sin(k * arg);
                   y2[i] += (x1[k] * sinarg + y1[k] * cosarg);
                   }
           }
     
           if (dir == -1) {
              for (int i=0;i<taille;i++) {
                  y2[i] = y2[i] / (double)taille;
                  }
              }
     
     
           return y2;
     }
     
     TFD::~TFD(){}
    Et mon main:

    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
     
    #include <iostream>
    #include <cmath>
    #include <vector>
    #include "TFD.hh"
     
    using namespace std;
     
    int main(){
        vector<double> v1(4);
        vector<double> v2(4);
        vector<double> Res(4);
        double test;
     
        v1[0]=1.0;
        v1[1]=7.0;
        v1[2]=5.0;
        v1[3]=8.0;
     
        v2[0]=3.0;
        v2[1]=3.0;
        v2[2]=4.0;
        v2[3]=9.0;
     
    TFD* voir=new TFD(1, 4, v1, v2);
    Res= (voir->reel());
    test=Res[0]+Res[1]+Res[2]+Res[3];
     
     
            cout << "La partie réelle de la TFD est R=" << test << endl;
     
     
            system("PAUSE");
    delete voir;
    voir=0;
    }

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    57
    Détails du profil
    Informations personnelles :
    Âge : 16
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 57
    Points : 65
    Points
    65
    Par défaut
    Salut,

    Avec un débugger,

    on voit que l'erreur est à la ligne:

    Puis dans la fonction reel():

    Parce que tu n'as pas initialisé x2!

    utilise le débugger

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 29
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par Dreambeliever Voir le message
    Salut,

    Avec un débugger,


    Parce que tu n'as pas initialisé x2!

    utilise le débugger
    J'ai utilisé le debugger et je savais que c'était de la méthode réel que venait le problème et effectivement il fallait initialiser le vecteur. Il y aussi un truc qui marche, c'est de mettre la taille du vecteur quand on le déclare, ça résout le problème:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    vector<double> x2(n);

    En tout cas là ça marche bien, merci pour votre aide!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Transformée de fourier avec un signal audio
    Par Emilie83 dans le forum Signal
    Réponses: 1
    Dernier message: 20/11/2007, 10h37
  2. [XSLT] Problème de transformation XSLT avec JAVA
    Par ploxien dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 28/09/2007, 16h47
  3. Réponses: 7
    Dernier message: 29/06/2006, 12h33
  4. [XSLT] Problème de transformation XML avec un fichier xslt
    Par seb35 dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 24/04/2006, 22h02
  5. Petit problèmes avec display list et transformations
    Par Baptiste Wicht dans le forum OpenGL
    Réponses: 5
    Dernier message: 10/02/2006, 17h00

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