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 :

Ajustement des paramètres d'une FFT via pymedia (mp3)


Sujet :

Calcul scientifique Python

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mai 2006
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 47
    Points : 35
    Points
    35
    Par défaut Ajustement des paramètres d'une FFT via pymedia (mp3)
    Bonjour,
    Je cherche à réaliser la FFT d'un fichier mp3. Ce mp3 étant "uniforme", je ne cherche donc à ne faire cette FFT qu'une seule fois, en un endroit qulconque du morceau (assez loin des bords bien sur). Je choisis cette endroit au hasard à l'aide de la variable "a".
    La decompression préalable du mp3 en .wav est OK (issue de pymedia)


    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
     
    def FFT( name ):
    	import pymedia.audio.acodec as acodec
    	import pymedia.muxer as muxer
    	import time, wave, string, os
     
     
    	SAMPLES= 256
                 NUM_FREQS= 256
                 BANDS = 10
                 a = 0
    	name1= str.split( name, '.' )
    	save= string.join( name1[ : len( name1 )- 1 ] )
    	analyzer= sound.SpectrAnalyzer( 1, SAMPLES, NUM_FREQS ) #RF
    	# Demux
     
    	dm= muxer.Demuxer( name1[ -1 ].lower() )
    	dec= None
    	f= open( name, 'rb' )
    	snd= None
    	s= " "
     
    	while len( s ):
    		s= f.read( 44100 )  
    		if len( s ):
    			frames= dm.parse( s )
    			for fr in frames:
                                a=a+1
    			    if dec == None:
                                    dec= acodec.Decoder( dm.streams[ 0 ] )
                                r= dec.decode( fr[ 1 ] )
     
    			    if r and r.data:
    				    if snd== None:
    					    snd= wave.open( save+ '.wav', 'wb' )
    					    snd.setparams( (r.channels, 2, r.sample_rate, 0, 'NONE','') )
    					    resampler= sound.Resampler( (r.sample_rate,r.channels), (r.sample_rate,1) ) #RF
     
    				    snd.writeframes( r.data )
     
    			    if r and len( r.data ) and a ==16:   #RF
                                    s1= resampler.resample( r.data )    #RF
                                    fTmp= analyzer.asBands( BANDS, s1 )  #RF
     
                                    print "\n TMP(0): ", fTmp[0]
                                    print "\n TMP(1): ", fTmp[1]
                                    #(...)
                                    ecriture = open(save + ".txt", 'a')
                                    ecriture.write(str(fTmp) + '\n')
                                    ecriture.write('\n')
                                    ecriture.close
    Question1:
    Le résultat de la FFT est ici stocké dans fTmp (issue de asBands). Il est le suivant:

    (((169.140625, 118.18461100260417), (422.8515625, 2.4421555445744443), (972.55859375, 0.41417581694466726), (2156.54296875, 0.2080460654364692), (4820.5078125, 1.0275812893049092)), ((169.140625, 120.94239298502605), (422.8515625, 2.6184249291053185), (972.55859375, 0.53230881690979004), (2156.54296875, 0.26295919266958084), (4820.5078125, 0.88253746303260749)),
    (.........)
    169.140625, 119.96302286783855), (422.8515625, 2.6326933640700121), (972.55859375, 0.52503848075866699), (2156.54296875, 0.29092997596377418), (4820.5078125, 1.3292588037801973)))
    Les commentaires de Pymedia me m'inspirant guère, que faut il comprendre ici? Que la FFT a été réalisé plusieurs fois malgré tout? Et donc, qu'ainsi, en prenant par exemple Ftmp[0] j'obtiens bel et bien une FFT du signal à un temps quelconque?


    Question2:
    J'ai un peu de mal à saisir ici le sens certains paramètres. Pour obtenir des bandes de fréquences plus "propres" que du [0 169Hz][169,422][422 972Hz]...(comme ci dessous) que dois je modifier ?(par exemple pour avoir des bandes uniformes de 200Hz ou 1Khz, enfin vous voyer le truc...Mes modif' n'ayant pas le résultat escompté...
    Edit: quelles sont le paramètre à surveiller pour Shannon?

    Merci par avance pour vos indications, malgré la longueur de mon message! (j'essaie d'être précis...)

  2. #2
    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
    Je pense que ton tableau te retourne quelque chose de ce genre.

    ((Freq A, Amplitude A),(Freq B, Amplitude B),(Freq N, Amplitude N))

    Pour ce qui est de Shannon, je me rapelle qu'il faut que la frequence d'echantillonage soit au moins 2 fois supérieur a la frequence max du signal.
    [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...

  3. #3
    Nouveau membre du Club
    Inscrit en
    Mai 2006
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 47
    Points : 35
    Points
    35
    Par défaut
    Citation Envoyé par parp1
    Je pense que ton tableau te retourne quelque chose de ce genre.

    ((Freq A, Amplitude A),(Freq B, Amplitude B),(Freq N, Amplitude N))

    Pour ce qui est de Shannon, je me rapelle qu'il faut que la frequence d'echantillonage soit au moins 2 fois supérieur a la frequence max du signal.
    Oui tout à fait! Seulement as tu un idée des paramètres à ajuster pour obtenir des bandes de fréquences plus précises? Des modifs de SAMPLES,
    NUM_FREQS ou BANDS n'apportent rien de très sympahtique, ou alors je m'y prend mal.

    Peut être parce que la Notice de AsBands() parle d'octave???

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    asBands(...)
    asBands( bandsNum, data ) -> [ (( lowFreq, value )*) ]
    List of bands groupped by frequency.
    All m frequencies will be splitted into bandNum bands accodring to number of octaves per band.
    The result will be given as lists of tuples in which first two elements are frequency limits 
    to which value is computed.
    It will be at least len( data ) / n elements in a list for every n samples in the input data.
    If there is no enough data to fullfill the n samples, it will be right padded with zeroes.
    IMPORTANT: Please note that only mono signals are supported at this time.

  4. #4
    Nouveau membre du Club
    Inscrit en
    Mai 2006
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 47
    Points : 35
    Points
    35
    Par défaut
    D'ailleurs quel est la paramètre qui concerne la fréquence d'échantillonage? Because:
    SAMPLE muste be > 32 et < 576
    NUM_FREQS <1024, en puissance de 2
    (paramètres de SpectrAnalyzer)

    Thanks!

  5. #5
    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
    Essaie de faire apparaitre le spectre de ton signal. Via plotlib ou un truc comme ca?

    Je ne me demande si il ne mettes pas plusieurs fois le spectre afin d'avoir un signal pseudo continue..... Moi Fourrier ça fait longtemps... enfin j'adore ça. Mais la ...
    [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...

  6. #6
    Nouveau membre du Club
    Inscrit en
    Mai 2006
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 47
    Points : 35
    Points
    35
    Par défaut
    Merci de ta suggestion, je ferai un essai la semaine prochaine

Discussions similaires

  1. Réponses: 3
    Dernier message: 10/01/2008, 13h50
  2. Ajouter des CHAMPS dans une table via ASP
    Par hysteresis dans le forum Access
    Réponses: 1
    Dernier message: 27/09/2005, 15h39
  3. Récupération des paramètres d'une requête
    Par TomPad dans le forum Access
    Réponses: 10
    Dernier message: 16/06/2005, 15h11
  4. Récupération des paramètres avec une procedure stockée
    Par samlerouge dans le forum Bases de données
    Réponses: 2
    Dernier message: 31/03/2004, 22h00
  5. Comment obtenir la liste des paramètres d'une SP ?
    Par Le Gritche dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 14/03/2003, 16h54

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