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...)