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

Fortran Discussion :

Transformée de Fourier discrète


Sujet :

Fortran

  1. #1
    Débutant
    Inscrit en
    Juillet 2007
    Messages
    386
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 386
    Points : 119
    Points
    119
    Par défaut Transformée de Fourier discrète
    Rebonjour,
    merci pour vos aide et excusez-moi pour mes questions.
    J'ai fait un programme pour la transformée de Fourier discrète bidimensionnelle; j'ai eu les mêmes réponses qu'un autre logiciel (Scilab) mais bouleversées, ce qui m'étonne malgré que je sois sur de mon programme. Alors pouvez-vous me dire si le truc vient du format ou d'autre chose ?

    Voilà mon code
    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
              program m
          integer i,j,N
          parameter(N=3)
          complex A(0:N-1,0:N-1),B(0:N-1,0:N-1),ii
          parameter(ii=(0.,1.))
          A(0,0)=ii
          A(1,0)=ii
          A(2,0)=ii
          A(0,1)=ii
          A(1,1)=-1.
          A(2,1)=ii
          A(0,2)=0.
          A(1,2)=1.
          A(2,2)=ii
          Call idft2d(N,A,B)
          print 10,((A(i,j),i=0,N-1),j=0,N-1)
    10    format('A=',6(/,1X,6(F12.8,1X)))
          print 20,((B(i,j),i=0,N-1),j=0,N-1)
    20    format('A=',6(/,1X,6(F12.8,1X)))
          end
     
     
     
     
     
          subroutine idft2d(N,C,D)
          integer i,j,p,q,N
          complex C(0:N-1,0:N-1),D(0:N-1,0:N-1),b
          real pi 
          parameter(pi=3.1415926535)
          parameter(b=(0.,1.))
    c     b est le nombre complex i usuel
          do i=0,N-1
            do j=0,N-1
               D(i,j)=0.
                 do p=0,N-1
                    do q=0,N-1
                       D(i,j)=D(i,j)+C(p,q)*exp(-b*(2.*pi/real(N))
    &                            *(real(p)*real(i)+real(q)*real(j)))
                     enddo
                  enddo
             enddo
          enddo
          do i=0,n-1
             do j=0,n-1
                 D(i,j)=(1./(real(N)**2))*D(i,j)
             enddo
          enddo
          return
          end
    et voila ce que j ai eu comme matrice reponse en fortran :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    B=
       0.00000000   0.66666669  -0.19245011   0.00000004   0.19245005  -0.00000005
       0.09622505   0.35911676   0.35911673  -0.09622510  -0.16666666  -0.09622505
      -0.09622510  -0.02578341  -0.16666669   0.09622505  -0.02578341   0.09622505
    Et voilà ce que j'ai eu sur Scilab :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
                column 1 to 2
     
        0.6666667i                0.1924501               
      - 0.0962250 - 0.0257834i  - 0.0257834 + 0.0962250i  
        0.0962250 + 0.3591168i  - 0.1666667 - 0.0962250i  
     
             column 3
     
      - 0.1924501               
      - 0.1666667 + 0.0962250i  
        0.3591168 - 0.0962250i
    ce qui est étonnant
    Merci

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 99
    Points : 77
    Points
    77
    Par défaut
    Salut,

    suggestion rapide. Ne laisse tu pas trainer dans ton code un facteur "i" (i étant l'imaginaire) ?

    Je te suggère de reprendre calmement ligne à ligne ton programme. Il n'est pas très long, je suis sur que l'erreur va te sauter aux yeux.

    Bon courage,
    Yann.

  3. #3
    Débutant
    Inscrit en
    Juillet 2007
    Messages
    386
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 386
    Points : 119
    Points
    119
    Par défaut
    Citation Envoyé par yann_m Voir le message
    Salut,

    suggestion rapide. Ne laisse tu pas trainer dans ton code un facteur "i" (i étant l'imaginaire) ?

    Je te suggère de reprendre calmement ligne à ligne ton programme. Il n'est pas très long, je suis sur que l'erreur va te sauter aux yeux.

    Bon courage,
    Yann.
    le ""i" qui est dans le programme est le compteur du boucle, c est un entier, tandisque b c est l 'mmaginaire 'i' qu on le connait
    j ai relit mon programme 20 foix et j arrive pas a trouvé l erreur!

  4. #4
    Rédacteur

    Homme Profil pro
    Comme retraité, des masses
    Inscrit en
    Avril 2007
    Messages
    2 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : Suisse

    Informations professionnelles :
    Activité : Comme retraité, des masses
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 2 978
    Points : 5 179
    Points
    5 179
    Par défaut
    Même en relisant 200 fois ton programme, tu ne trouveras pas ton erreur. Ce qu'il te faut faire, c'est prendre une feuille de papier et suivre pas à pas le comportement de ton programme.

    Jean-Marc Blanc
    Calcul numérique de processus industriels
    Formation, conseil, développement

    Point n'est besoin d'espérer pour entreprendre, ni de réussir pour persévérer. (Guillaume le Taiseux)

  5. #5
    Débutant
    Inscrit en
    Juillet 2007
    Messages
    386
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 386
    Points : 119
    Points
    119
    Par défaut
    voila ma subroutine j explique chque ligne par ligne:


    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
    
          subroutine idft2d(N,C,D)
    
    intiation des données , N taille de la matrice, i et j sont des entiers compteurs dans les boucles , de meme pour p et q, b est le complexe i qu on connait         
          integer i,j,p,q,N
          complex C(0:N-1,0:N-1),D(0:N-1,0:N-1),b
          real pi 
          parameter(pi=3.1415926535)
          parameter(b=(0.,1.))
      boucle sur i et sur j pour parcourir la matrice         
          do i=0,N-1
            do j=0,N-1
        intiation des elements de la matrice a 0         
               D(i,j)=0.
         boucle sur p et q pour calculer la TFD2d donnée par la formule D(i,j)=(1/N^2)\sum_{p=0}^{N-1}\sum_{q=0,N-1} exp((-2\pi b/N)( ip+jq))          
                 do p=0,N-1
                    do q=0,N-1
                       D(i,j)=D(i,j)+C(p,q)*exp(-b*(2.*pi/real(N))
    &                            *(real(p)*real(i)+real(q)*real(j)))
                     enddo
                  enddo
      fin de la boucle p et q      
             enddo
          enddo
      fin de la boucle i et j            
    
      une autre boucle sur i et j pour diviser la somme sur N^2            
          do i=0,n-1
             do j=0,n-1
                 D(i,j)=(1./(real(N)**2))*D(i,j)
             enddo
          enddo
      fin de la boucle i et j          
          return
          end
     fin subroutine              

  6. #6
    Rédacteur

    Homme Profil pro
    Comme retraité, des masses
    Inscrit en
    Avril 2007
    Messages
    2 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : Suisse

    Informations professionnelles :
    Activité : Comme retraité, des masses
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 2 978
    Points : 5 179
    Points
    5 179
    Par défaut
    Salut !

    Tu as mis des lignes de commentaires et c'est très bien. Mais ce n'est pas ça que je te demandais:
    suivre pas à pas le comportement de ton programme
    Je te donne un bout d'exemple:
    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
     
    N := 3
    i := 0
      j := 0
        D(0,0) := 0.
        p := 0
          q := 0
            D(0,0)=D(0,0)+C(0,0)*exp(-b*(2.*pi/real(3))
    &                            *(real(0)*real(0)+real(0)*real(0)))
          q := 1
            D(0,0)=D(0,0)+C(0,1)*exp(-b*(2.*pi/real(3))
    &                            *(real(0)*real(0)+real(1)*real(0)))
          q := 2
            D(0,0)=D(0,0)+C(0,2)*exp(-b*(2.*pi/real(3))
    &                            *(real(0)*real(0)+real(2)*real(0)))
        p := 1
          q := 0
            D(0,0)=D(0,0)+C(1,0)*exp(-b*(2.*pi/real(3))
    &                            *(real(1)*real(0)+real(0)*real(0)))
          q := 1
            D(0,0)=D(0,0)+C(1,1)*exp(-b*(2.*pi/real(3))
    &                            *(real(1)*real(0)+real(1)*real(0)))
          q := 2
            D(0,0)=D(0,0)+C(1,2)*exp(-b*(2.*pi/real(3))
    &                            *(real(1)*real(0)+real(2)*real(0)))
        p := 1
          q := 0
            D(0,0)=D(0,0)+C(2,0)*exp(-b*(2.*pi/real(3))
    &                            *(real(2)*real(0)+real(0)*real(0)))
          q := 1
            D(0,0)=D(0,0)+C(2,1)*exp(-b*(2.*pi/real(3))
    &                            *(real(2)*real(0)+real(1)*real(0)))
          q := 2
            D(0,0)=D(0,0)+C(2,2)*exp(-b*(2.*pi/real(3))
    &                            *(real(2)*real(0)+real(2)*real(0)))
     
         etc ...
    Continue jusqu'au bout, fais de même pour tes instructions d'affichage et vérifie que tout est correct.

    Jean-Marc Blanc
    Calcul numérique de processus industriels
    Formation, conseil, développement

    Point n'est besoin d'espérer pour entreprendre, ni de réussir pour persévérer. (Guillaume le Taiseux)

  7. #7
    Débutant
    Inscrit en
    Juillet 2007
    Messages
    386
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 386
    Points : 119
    Points
    119
    Par défaut
    J ai fait exactement ce que tu m as dit Jean Marc et j ai teste' sur un element qui differt (D(2,2)) et j ai obtenu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      - 0.0257834 + 0.0962250i
    c est comme scilab malgre que j ai suivit mon program!
    Vraiment merde avec ce program qui m enerve

  8. #8
    Rédacteur

    Homme Profil pro
    Comme retraité, des masses
    Inscrit en
    Avril 2007
    Messages
    2 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : Suisse

    Informations professionnelles :
    Activité : Comme retraité, des masses
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 2 978
    Points : 5 179
    Points
    5 179
    Par défaut
    A ton avis, est-ce que les valeurs sont brassées au hasard ou d'une manière systématique ?

    Jean-Marc Blanc
    Calcul numérique de processus industriels
    Formation, conseil, développement

    Point n'est besoin d'espérer pour entreprendre, ni de réussir pour persévérer. (Guillaume le Taiseux)

  9. #9
    Débutant
    Inscrit en
    Juillet 2007
    Messages
    386
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 386
    Points : 119
    Points
    119
    Par défaut
    Citation Envoyé par FR119492 Voir le message
    A ton avis, est-ce que les valeurs sont brassées au hasard ou d'une manière systématique ?

    Jean-Marc Blanc
    Ma matrice est choisie au hasard, et j ai fait le calcul comme tu m avait dit ,et j ai testé pour D(2,2) comme tu m as dit exactement et voila ce que j ai fait :
    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
    N := 3
    i := 2
      j := 2
        D(2,2) := 0.
        p := 0
          q := 0
            D(2,2)=D(2,2)+C(0,0)*exp(-b*(2.*pi/real(3))
    &                            *(real(0)*real(2)+real(0)*real(2)))
          q := 1
            D(2,2)=D(2,2)+C(0,1)*exp(-b*(2.*pi/real(3))
    &                            *(real(0)*real(2)+real(1)*real(2)))
          q := 2
            D(2,2)=D(2,2)+C(0,2)*exp(-b*(2.*pi/real(3))
    &                            *(real(0)*real(2)+real(2)*real(2)))
        p := 1
          q := 0
            D(2,2)=D(2,2)+C(1,0)*exp(-b*(2.*pi/real(3))
    &                            *(real(1)*real(2)+real(0)*real(2)))
          q := 1
            D(2,2)=D(2,2)+C(1,1)*exp(-b*(2.*pi/real(3))
    &                            *(real(1)*real(2)+real(1)*real(2)))
          q := 2
            D(2,2)=D(2,2)+C(1,2)*exp(-b*(2.*pi/real(3))
    &                            *(real(1)*real(2)+real(2)*real(2)))
        p := 1
          q := 0
            D(2,2)=D(2,2)+C(2,0)*exp(-b*(2.*pi/real(3))
    &                            *(real(2)*real(2)+real(0)*real(2)))
          q := 1
            D(2,2)=D(2,2)+C(2,1)*exp(-b*(2.*pi/real(3))
    &                            *(real(2)*real(2)+real(1)*real(2)))
          q := 2
            D(2,2)=D(2,2)+C(2,2)*exp(-b*(2.*pi/real(3))
    &                            *(real(2)*real(2)+real(2)*real(2)))

  10. #10
    Rédacteur

    Homme Profil pro
    Comme retraité, des masses
    Inscrit en
    Avril 2007
    Messages
    2 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : Suisse

    Informations professionnelles :
    Activité : Comme retraité, des masses
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 2 978
    Points : 5 179
    Points
    5 179
    Par défaut
    Salut !

    Est-ce que tu ne vois pas que le brassage n'est pas aléatoire, mais qu'il y a permutation des lignes 2 et 3, ainsi que des colonnes 2 et 3. A toi d'analyser le problème et de voir pourquoi.

    Jean-Marc Blanc
    Calcul numérique de processus industriels
    Formation, conseil, développement

    Point n'est besoin d'espérer pour entreprendre, ni de réussir pour persévérer. (Guillaume le Taiseux)

Discussions similaires

  1. transformée de Fourier discrète(DFT)
    Par ali gh dans le forum Images
    Réponses: 0
    Dernier message: 01/05/2014, 16h24
  2. Transformer de Fourier discrète c#
    Par manian54 dans le forum C#
    Réponses: 3
    Dernier message: 30/04/2014, 10h43
  3. [Débutant] La Transformée de Fourier Discrète
    Par Missay dans le forum Signal
    Réponses: 2
    Dernier message: 08/02/2014, 03h21
  4. Exercice sur la Transformée de Fourier Discrète
    Par karisweb dans le forum Signal
    Réponses: 2
    Dernier message: 14/03/2013, 19h07
  5. [À télécharger] [Math] Transformée de Fourier discrète
    Par 3DArchi dans le forum Téléchargez
    Réponses: 0
    Dernier message: 06/11/2010, 20h45

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