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

Calcul scientifique Python Discussion :

Fourier t'as jamais été mon copain, et même sous Python


Sujet :

Calcul scientifique Python

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    125
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Août 2008
    Messages : 125
    Points : 55
    Points
    55
    Par défaut Fourier t'as jamais été mon copain, et même sous Python
    Bonjour,
    je galère depuis deux jours.
    J'ai un signal fréquentiel de 10 MHz à 40 GHz que je dois transformer en temporel
    J'ai fait une TFD inverse toute simple et mon "Chefstain" veut que je vérifie que mon calcul est bon avec la fonction ifft... oui mais voilà, je n'arrive pas à la mettre en oeuvre !
    Voici mon programme pour la TFDinv :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #calcul par TFD inverse
    for n in range(0,len(Freq)):
        SigFreq = 0
        for nz in range(0, len(Freq)-1):
            #écriture de la valeur du signal à la fréquence donnée
            z = complex(float(RealS21[nz]), float(ImS21[nz]))
            SigFreq0 = (abs(z)*exp(phase(z)*1j))*exp((2*1j*pi*(1/float(Freq[n]))*(float(nz)/float(len(Freq)))))
            SigFreq = SigFreq0+SigFreq
        SigFreq = SigFreq/float(len(Freq))
    Pour IFFT :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for nz in range(0,len(Freq)):
        SignalZ = signal(RealS21[nz],ImS21[nz])
        FFTinv = np.fft.ifft(SignalZ)
    ça me retourne une erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Traceback (most recent call last):
      File "R:/LABO HF/DEP HF/USER/PVincent/P114930/FFT inverse.py", line 135, in <module>
        FFTinv = np.fft.ifft(SignalZ)
      File "C:\Python27\lib\site-packages\numpy\fft\fftpack.py", line 246, in ifft
        n = shape(a)[axis]
    IndexError: tuple index out of range
    je sais que c'est de la façon que j'ai écrit ifft mais comme je n'y comprends rien, et que toutes les aides sur ce module sont in english... je ne m'en sors pas
    Merci pour votre aide qui me sera très préciseuse !

    Patricia

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 351
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 351
    Points : 36 875
    Points
    36 875
    Par défaut
    Salut,

    np.fft.ifft(SignalZ) se vautre parce que la chose retournée par la fonction signal ne lui plaît pas.
    Si vous ne montrez pas a quoi ressemble cette fonction, pas facile d'en dire plus.

    Desole

    - W

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    125
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Août 2008
    Messages : 125
    Points : 55
    Points
    55
    Par défaut voici mon fichier
    en PJ
    voici ce qu'il y a avant
    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
     
    #Extraction du fichier .csv et mise en forme de la liste
     
    def extractioncsv(fichiercsv):
        Freqcsv = []  #Extraction des valeurs de fréquence
        RealS21csv = []  #Extraction des valeurs de la partie réelle du S21
        ImS21csv = []  #Extraction des valeurs de la partie imaginaire du S21
        URealS21csv = []  #Extraction des valeurs de l'incertitude de la partie réelle du S21
        UImS21csv = []  #Extraction des valeurs de l'incertitude de la partie imaginaire du S21
        with open(fichiercsv, 'rb') as fcsv:
            lecteur = csv.reader(fcsv, delimiter=';')
            for ligne in lecteur:
                Freqcsv.append(ligne[1])
                RealS21csv.append(ligne[2])
                ImS21csv.append(ligne[3])
                URealS21csv.append(ligne[4])
                UImS21csv.append(ligne[5])
        return Freqcsv, RealS21csv, ImS21csv, URealS21csv, UImS21csv
     
    #Création des listes en retirant les deux lignes de titres
    listeDataS21 = extractioncsv(fileDataS21)
    Freq = listeDataS21[0]
    RealS21 = listeDataS21[1]
    ImS21 = listeDataS21[2]
    UcRealS21 = listeDataS21[3]
    UcImS21 = listeDataS21[4]
    del Freq[0:2], RealS21[0:2], ImS21[0:2], UcRealS21[0:2], UcImS21[0:2]
    Fichiers attachés Fichiers attachés

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 351
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 351
    Points : 36 875
    Points
    36 875
    Par défaut
    signal, signal, signal,...
    SignalZ = signal(RealS21[nz],ImS21[nz])le reste est probablement fort intéressant mais sans signal, pas la peine de le regarder.
    - W

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    125
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Août 2008
    Messages : 125
    Points : 55
    Points
    55
    Par défaut exact

    voici le signal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #Signal fréquentiel : visualisation pour calcul
    def signal(valRe,valIm):
        z = complex(float(valRe),float(valIm))
        Signal = abs(z)*exp(cmath.phase(z)*1j)
        return Signal
    c'est mieux avec ça ?
    Merci encore

    Patricia

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 351
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 351
    Points : 36 875
    Points
    36 875
    Par défaut
    C'est mieux!
    Votre fonction retourne un scalaire alors que fft.ifft demande un tableau (array-like). Un emballage de ce scalaire dans une liste, i.e np.fft.ifft([ SignalZ] ) devrait corriger l'erreur Python. Calculer une FFT avec une seule valeur en entrée, c'est la valeur. Pas la peine de faire un appel a np.fft.ifft dans ce cas, non?

    - W

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    125
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Août 2008
    Messages : 125
    Points : 55
    Points
    55
    Par défaut Merci pour ton aide
    Je ne réponds qu'aujourd'hui, car fallait que je fasse autre chose entre temps.

    C'était effectivement ça, et j'obtient un beau signal
    Par contre je sais je suis ch... comment je peux enregistrer les résultats dans un fichier excel ?
    j'ai écrit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    ListeSignalZ = []
    for nz in range(0,len(Freq)):
        SignalZ = signal(RealS21[nz],ImS21[nz])
        ListeSignalZ.append(SignalZ)
    fileFFTinv.write("\n")
    print ListeSignalZ
    FFTinv = np.fft.ifft(ListeSignalZ)
    plt.plot(FFTinv)
    plt.show()
    fileFFTinv.write(str(complex(FFTinv))+"\n")
    et ça me renvoie une erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    C:\Python27\lib\site-packages\numpy\core\numeric.py:460: ComplexWarning: Casting complex values to real discards the imaginary part
      return array(a, dtype, copy=False, order=order)
    Traceback (most recent call last):
      File "R:/LABO HF/DEP HF/USER/PVincent/P114930/FFT Inverse Directe.py", line 145, in <module>
        fileFFTinv.write(str(complex(FFTinv))+"\n")
    TypeError: only length-1 arrays can be converted to Python scalars
    je souspçonne le fait de créer également une liste et d'enregistrer la liste ensuite dans excel... mais j'ai un gros doute

    Merci encore.

    Patricia

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 351
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 351
    Points : 36 875
    Points
    36 875
    Par défaut
    Salut,

    Je ne peux que vous faire la promotion de la console Python:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    >>> import numpy as np
    >>> fftinv = np.fft.ifft([1,2])
    >>> fftinv
    array([ 1.5+0.j, -0.5+0.j])
    >>> complex(fftinv)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: only length-1 arrays can be converted to Python scalars
    >>>
    enregistrer les résultats dans un fichier excel ?
    Dans un fichier .xls, c'est complique!
    Par contre, un fichier .CSV sera comestible par XL et vous avez la fonction numpy.savetxt qui fait le boulot pour vous.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    >>> np.savetxt('foo.csv', fftinv, delimiter=';')
    - W

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    125
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Août 2008
    Messages : 125
    Points : 55
    Points
    55
    Par défaut merci beaucoup
    c'est génial !

    bon ben maintenant je m'attaque au calcul d'incertitude sur FFTinv...

    Patricia

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 351
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 351
    Points : 36 875
    Points
    36 875
    Par défaut
    Et bien tant mieux!
    Pensez au bouton
    - W

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    125
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Août 2008
    Messages : 125
    Points : 55
    Points
    55
    Par défaut C'est résolu ... en parti

    Maintenant que j'ai le signal et que je vaux calculer les incertitudes, il ne faut pas que j'utilise la bibliotheque python de la FFT inv !
    Donc je dois écrire la TFD inverse, avec les boucles pour les sommes pour pouvoir propager les incertitudes et là c'est toujours pas une mince affaire.
    Ce que je calcule ne correspond en rien au résultat de la FFTinv de python (et de Excel).
    Au fait quand je parlais de Excel... c'est bien un .csv que je pensais.

    Patricia

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    125
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Août 2008
    Messages : 125
    Points : 55
    Points
    55
    Par défaut C'est effectivement résolu
    Pour ceux que ça interesse, voici le petit prog en python pour faire la fft inverse sans passer par la fonction intégrée à python :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    def signal(valRe,valIm):
        z = complex(float(valRe),float(valIm))
    for nz in range(0,dimensionX-2):
        SignalComplexe = signal(Real[nz],Im[nz])
        Fichier.append(SignalComplexe)
     
    for k in range(0,len(SignalComplexe)):
        print "k=",k
        somme = 0
        for n in range(0,len(SignalComplexe)-1):
            somme = somme + SignalComplexe[n+1]* np.exp(2*1j*pi*k*n/len(SignalComplexe))

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 27/06/2007, 23h32
  2. Mon script de démarage sous init.d ne se lance pas
    Par zulul dans le forum Administration système
    Réponses: 18
    Dernier message: 12/06/2007, 23h39
  3. Réponses: 4
    Dernier message: 13/09/2006, 21h16
  4. [phpMyAdmin] lien entre mon code et phpMyAdmin sous xampp
    Par temperature dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 15/04/2006, 14h12

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