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 :

numpy et analyse spectrale


Sujet :

Calcul scientifique Python

  1. #1
    Membre du Club
    Homme Profil pro
    autodidacte
    Inscrit en
    Décembre 2018
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : autodidacte

    Informations forums :
    Inscription : Décembre 2018
    Messages : 100
    Points : 49
    Points
    49
    Par défaut numpy et analyse spectrale
    Bonjour à tous, j'essai d'utiliser numpy pour faire de l'analyse spectrale avoir la fréquence et l'amplitude. Est ce que je me trompe si pour avoir l'amplitude je fait :amplitudes = np.abs(np_fft) et pour avoir les fréquences je fait : freqs = np.fft.fftfreq(len(w))? Pouvez vous m'expliquer s'il vous plait, merci d'avance pour votre aide

  2. #2
    Membre émérite

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Points : 2 328
    Points
    2 328
    Par défaut
    Citation Envoyé par haku972 Voir le message
    Est ce que je me trompe si pour avoir l'amplitude je fait :amplitudes = np.abs(np_fft) et pour avoir les fréquences je fait : freqs = np.fft.fftfreq(len(w))?
    Oui vous vous tromper. Depuis quand l'amplitude c'est la valeur absolue ? L'amplitude c'est le max moins le min. La fréquence, là je présume que vous chercher cela sur une fonction périodique. Là le module np.fft.fftfreq va vous donner la transformée de Fourrier discrète (suffit d'aller regarder la notice ), ce qui je pense n'est pas ce que vous voulez.

    Donner un exemple de w que l'on voit. Et mettez votre code dans des balises [CODE] (le bouton # lorsque vous rédigez votre message)

  3. #3
    Membre du Club
    Homme Profil pro
    autodidacte
    Inscrit en
    Décembre 2018
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : autodidacte

    Informations forums :
    Inscription : Décembre 2018
    Messages : 100
    Points : 49
    Points
    49
    Par défaut
    Pour l'amplitude je pensais que c'était comme ça car dans mes recherches j'ai trouvé ( afin d’obtenir le tableau d’amplitudes à partir du résultat d’une FFT, vous devez l’appliquer*numpy.abs.). Mon but est de comprendre sur une chanson donnée, comment obtenir un tableau des fréquences d'un coté et un tableau des amplitudes de l'autre coté, et après manipulation pouvoir reconstituer le son. J'ai fait beaucoup de recherche mais je trouve pas mal de formule diverse sans grande explication.

    L'exemple que j'avais trouvé pour la fréquence :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        w = np.fft.fft(data)
        freqs = np.fft.fftfreq(len(w)) * framerate
    Où data est le fichier son mis en tableau numpy. merci grandement de votre aide

  4. #4
    Membre du Club
    Homme Profil pro
    autodidacte
    Inscrit en
    Décembre 2018
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : autodidacte

    Informations forums :
    Inscription : Décembre 2018
    Messages : 100
    Points : 49
    Points
    49
    Par défaut
    Ah donc pour avoir l'amplitude je dois faire la fmax-fmin ? Et pour modifier l'amplitude on multiplie ou divise par une valeur? Mais tout ça revient a modifier la fréquence ? Merci de votre aide pour toute ces questions, j'essais vraiment de comprendre le tout

  5. #5
    Membre émérite

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Points : 2 328
    Points
    2 328
    Par défaut
    Ils disent quoi vos cours de math ou de physique ?

    http://workig.free.fr/ch05s02.html

  6. #6
    Membre du Club
    Homme Profil pro
    autodidacte
    Inscrit en
    Décembre 2018
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : autodidacte

    Informations forums :
    Inscription : Décembre 2018
    Messages : 100
    Points : 49
    Points
    49
    Par défaut
    ok donc j'ai compris que modifier l'amplitude ne modifie pas la fréquence, si je ne me trompe pas encore, mais je n'arrive toujours pas a comprendre comment avoir l'amplitude pour chaque fréquence, je suis un peu dure de la feuille

  7. #7
    Membre émérite

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Points : 2 328
    Points
    2 328
    Par défaut
    Citation Envoyé par haku972 Voir le message
    ok donc j'ai compris que modifier l'amplitude ne modifie pas la fréquence, si je ne me trompe pas encore
    Exact

    Citation Envoyé par haku972 Voir le message
    je n'arrive toujours pas a comprendre comment avoir l'amplitude pour chaque fréquence, je suis un peu dure de la feuille
    Vous pouvez avoir l'amplitude d'une fréquence donnée (hauteur de la courbe). Maintenant si vous avez un signal quelconque vous devez le décomposer en une somme de signaux périodiques (appelés harmoniques ici :
    http://w3.cran.univ-lorraine.fr/pers...ie_Fourier.pdf, slide 13 notamment)

    Une fois que vous avez décomposé votre signal en une somme d'harmoniques, pour chacune de ces harmoniques vous pouvez en déterminer l'amplitude (chaque harmonique corespondant à une fréquence précise).

  8. #8
    Membre du Club
    Homme Profil pro
    autodidacte
    Inscrit en
    Décembre 2018
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : autodidacte

    Informations forums :
    Inscription : Décembre 2018
    Messages : 100
    Points : 49
    Points
    49
    Par défaut
    Décomposer le signal en somme d'harmoniques c'est faire la transformé de fourrier, mais c'est l'amplitude que je n'arrive pas a comprendre comment l'avoir avec python, toute les techniques que j'ai vu c'était pour déterminer l'amplitude graphiquement

  9. #9
    Membre émérite

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Points : 2 328
    Points
    2 328
    Par défaut
    Comment on calcule une amplitude ? cf. mon premier message

    Citation Envoyé par lg_53 Voir le message
    L'amplitude c'est le max moins le min

  10. #10
    Membre du Club
    Homme Profil pro
    autodidacte
    Inscrit en
    Décembre 2018
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : autodidacte

    Informations forums :
    Inscription : Décembre 2018
    Messages : 100
    Points : 49
    Points
    49
    Par défaut
    Est ce que je peux avoir un exemple s'il vous plait ?

  11. #11
    Membre émérite

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Points : 2 328
    Points
    2 328
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    import numpy as np
     
    data = np.array([5,4,2,-1,-6,3,2,-1,-2,-4,3,5,7])
     
    amplitude = np.max(data)-np.min(data)
    qui devra ici produire 13 (les datas allant de -6 à +7)

  12. #12
    Membre du Club
    Homme Profil pro
    autodidacte
    Inscrit en
    Décembre 2018
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : autodidacte

    Informations forums :
    Inscription : Décembre 2018
    Messages : 100
    Points : 49
    Points
    49
    Par défaut
    ok mais pour avoir l'amplitude d'une harmonique, je ne vois pas quelle donnée prendre, c'est ça que je ne comprends pas

  13. #13
    Membre émérite

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Points : 2 328
    Points
    2 328
    Par défaut
    Je croyais que tu avais déjà les harmoniques .... Ton problème n'est pas du tout clair. De plus on n'a pas un bout de code fonctionnel surlequel s'appuyer.

  14. #14
    Membre du Club
    Homme Profil pro
    autodidacte
    Inscrit en
    Décembre 2018
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : autodidacte

    Informations forums :
    Inscription : Décembre 2018
    Messages : 100
    Points : 49
    Points
    49
    Par défaut
    Si, mais en gros je voulais juste pouvoir modifier l'amplitude, mais avant cela je voulais connaitre l'amplitude de départ pour savoir quelle modification apporter (diminuer, augmenter ...). Ce que je ne comprend pas c'est le tableau de valeur pris pour calculer l'amplitude, on dirait que vous avez pris le tableau data moi je pensais qu'il fallait prendre le tableau de freqs, et en prenant tout un tableau, on ne peut pas cibler une harmonique particulière, l'amplitude est global?

    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
     
     
    import wave, struct
    from struct import *
    from time import sleep
    import numpy as np
    import matplotlib.pyplot as plt
    from scipy.optimize import curve_fit
     
    def func(x,a,b,c):
        return c * np.exp( -np.power( (x-a)/b, 2) )
     
     
    # Ouverture du fichier wav a decrypter
    wav_original = wave.open("pianoDm.wav",'rb')
     
    nchannels = wav_original.getnchannels()     # Returns number of audio channels (1 for mono, 2 for stereo)
     
    framerate = wav_original.getframerate()     # Returns sampling frequency
     
    nframes   = wav_original.getnframes()       # Returns number of audio frames
     
     
    # Decouper le fichier en plusieurs parties (une note par partie)
    frequences, freq_gauss = [], []
    larg_frame = 44100
    for posi in range(0,nframes,larg_frame):
     
        # Sequence contenant une note
        wav_original.setpos(posi)
        donnee = wav_original.readframes(larg_frame)
        data = struct.unpack('%sh' % (larg_frame*nchannels ), donnee)
        # Transformee de Fourier
        w     = np.fft.fft(data)
        sig   = np.real(w * w.conjugate())
        freqs = np.fft.fftfreq(len(w)) * framerate
     
        # Estimation de la frequence
        idx = np.argmax(sig)
        f0, maxi = np.abs(freqs[idx]), sig[idx]
        frequences.append( f0 )
     
        # Ajustement par une gaussienne
        ind = np.where( np.abs(freqs - f0) < 20 )
        popt, pcov = curve_fit( func, freqs[ind], sig[ind]/maxi, p0=[f0,1,1] )
        a, b, c = popt
        freq_gauss.append(a)
     
    wav_original.close()
     
    for res in (frequences,freq_gauss):
        print(np.round(res, 0))

  15. #15
    Membre émérite

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Points : 2 328
    Points
    2 328
    Par défaut
    J'ai appelé data de manière arbitraire. Effectivement vous aller regarder l'amplitude de vos harmoniques. Attention, vous sembler confondre fréquences et harmoniques. C'est fortement llié mais ce n'est pas la meme chose. Une fréquence c'est juste un nombre. Une harmonique est une courbe périodique (et dont la fréquence est l'inverse de la longueur de la période).

    Vous ne pourrez donc pas régler l'amplitude de vos fréquences, mais celle des harmoniques qui leur sont liées.

  16. #16
    Membre du Club
    Homme Profil pro
    autodidacte
    Inscrit en
    Décembre 2018
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : autodidacte

    Informations forums :
    Inscription : Décembre 2018
    Messages : 100
    Points : 49
    Points
    49
    Par défaut
    Donc pour avoir les harmoniques j'ai tout faux ? mais l'harmonique est une fréquence? Dans la composition fréquenciel, il y a la composition harmonique?

  17. #17
    Membre du Club
    Homme Profil pro
    autodidacte
    Inscrit en
    Décembre 2018
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : autodidacte

    Informations forums :
    Inscription : Décembre 2018
    Messages : 100
    Points : 49
    Points
    49
    Par défaut
    Donc si je comprends bien, pour avoir le tableau des amplitudes associé au tableau des fréquences d'un signal sonore où data[1] est l'amplitude de la fréquence freqs[1] :

    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
     
     
    >>> import numpy as np
    >>> import scipy.io.wavfile
    >>> 
    >>> rate, data = scipy.io.wavfile.read('output2.wav')        #donne le tableau des amplitudes où data[i] est l'amplitude de la trame i
    >>> data
    array([40, 27, 26, ...,  2,  2,  3], dtype=int16)
    >>> w = np.fft.fft(data)                                                  #ici on obtient la fft du signal sonore
    >>> w
    array([  22976.             +0.j        ,
           -107502.72682889-113963.60588997j,
           -189081.65234699 +35918.35350594j, ...,
            -54923.80199662 -48468.48626009j,
           -189081.65234699 -35918.35350594j,
           -107502.72682889+113963.60588997j])
    >>> freqs = np.fft.fftfreq(len(w))                                     #et ici on obtient le tableau des fréquences où freqs[i] est la fréquence de la trame i
    >>> freqs
    array([ 0.00000000e+00,  2.08055925e-05,  4.16111851e-05, ...,
           -6.24167776e-05, -4.16111851e-05, -2.08055925e-05])

  18. #18
    Membre émérite

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Points : 2 328
    Points
    2 328
    Par défaut
    Citation Envoyé par haku972 Voir le message
    Donc pour avoir les harmoniques j'ai tout faux ? mais l'harmonique est une fréquence? Dans la composition fréquenciel, il y a la composition harmonique?
    Non une harmonique est une courbe. Une fréquence est un nombre. Une harmonique étant lié à une fréquence, on fait très souvent l'amalgame.


    Bon votre code se rapproche de qqch en effet. Etes vous capable de retrouver data à partir de freqs et w ? Si oui c'est que c'est bon.

  19. #19
    Membre du Club
    Homme Profil pro
    autodidacte
    Inscrit en
    Décembre 2018
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : autodidacte

    Informations forums :
    Inscription : Décembre 2018
    Messages : 100
    Points : 49
    Points
    49
    Par défaut
    Ah ok j'ai compris la différence (courbe, nombre). Quand je fais la ifft à partir de w j'obtiens quasiment data, après je ne comprends pas à 100% le résultat de a

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    >>> a = np.fft.ifft(w)
    >>> a
    array([40.-1.13047609e-13j, 27.-1.61557407e-14j, 26.-9.94233546e-14j, ...,
            2.+3.61658271e-14j,  2.+2.17535305e-13j,  3.+2.39041564e-13j])

  20. #20
    Membre émérite

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Points : 2 328
    Points
    2 328
    Par défaut
    le résultat te redonne un nombre complexe parce qu'il y a des petites approximations numériques (des erreurs d'arrondi que l'ordinateur fait, car quoi que l'on dise, un ordi à beau être puissant, sa capacité à toujours une limite). Donc là si tu considère la partie réelle de ce que tu obtiens tu dois retrouver le signal de départ. La partie imaginaire doit etre très petite (ici de l'ordre de 10 puissance -13, c'est bon).

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 26/09/2010, 21h01
  2. [Débutant] Analyse spectrale d'un signal audio
    Par christs dans le forum Signal
    Réponses: 14
    Dernier message: 14/04/2010, 10h31
  3. Problème de création de plan d'abondance après analyse spectrale
    Par Vagdish dans le forum Traitement d'images
    Réponses: 2
    Dernier message: 09/07/2009, 10h33
  4. analyse spectrale d'une image
    Par tweety22 dans le forum Traitement d'images
    Réponses: 2
    Dernier message: 20/04/2009, 11h03
  5. Analyse spectrale d'un signal périodique
    Par espoir1976 dans le forum Signal
    Réponses: 1
    Dernier message: 06/04/2009, 13h30

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