2017-06-10 3 views
1

Je veux faire un analyseur de spectre audio en Python. J'ai utilisé la bibliothèque pyaudio et je lis le flux du microphone. Pour chaque lecture, j'obtiens 4410 valeurs, que je convertis en nombres en utilisant numpy puis je les dessine sur l'écran de pygame. Il ressemble à ceci: https://photos.google.com/share/AF1QipMCWVk1pR0dmrrsTlpE3gHQ9GTUV25MqwUxw4JuW8TrItkGkuU9X3ZpY2ZQ-RLHew?key=UE9Id19IU1dtSHZfUk43TjB3SWxFcVhRRTFYOWFB (le graphique est à l'envers) Le code que j'ai pour c'est ceci:Analyseur de spectre audio (4410 valeurs en 15 bars)

import pyaudio, math, struct,pygame, numpy 
pa = pyaudio.PyAudio() 
#open audio stream 
stream = pa.open(input_device_index=1,rate=44100,format=pyaudio.paInt16,channels=2,input=True)  

#read bytes from stream and convert to numbers 
def get_data(): 
    data = stream.read(int(44100*0.05)) 
    s = numpy.fromstring(data, numpy.int16) 
    return struct.unpack('h'*4410, data) 



pygame.init() 
screen = pygame.display.set_mode((4000,1000)) 

def redraw(): 
    data = get_data() 
    #draw every number as a bar onto pygame windows 
    #last 4410 values are missin  
    for x in range(4000):    
     val = data[x]   
     pygame.draw.rect(screen,(0,0,0),(x,0,1,1000),0)      
     pygame.draw.rect(screen,(255,255,255),(x,0,1,val),0) 


    pygame.display.update() 
    pygame.event.clear() 

while 1:  
    redraw() 

Est-il possible de fantaisie de fusionner ces 4410 valeurs en seulement 15, donc je peux avoir la belle & cool green & barres rouges dans la fenêtre de taille raisonnable, au lieu de cette chose laide qui a besoin de 3 écrans?

Répondre

2

Fréquence vs domaine temps

Comme écrit votre code dessine une représentation time-domain des échantillons alors qu'un analyseur de spectre est une représentation frequency domain.

Temps -> La conversion du domaine de fréquence peut être obtenue en utilisant le Discrete Fourier Transform. En pratique, vous voudrez appliquer un Window function aux données avant de les transformer.

La sortie de la DFT est une série de cases de fréquence de taille égale, chacune contenant un composant réel et imaginaire. Les analyseurs de spectre ont généralement des bandes ayant une largeur perceptuelle égale, c'est-à-dire un nombre égal d'octaves (ou fractions d'une octave). Ainsi, chaque bande aura deux fois plus de casiers de fréquences que celui d'avant. 15 bandes équivaudraient à 2/3 octave par bande.

Explication de la sortie graphique

Vous avez rendu des échantillons dans le domaine temporel, en utilisant un pixel horizontalement pour chaque échantillon, et l'amplitude mappé directement à la coordonnée y. Comme la gamme d'amplitude est -32767 < x < 32768, la grande majorité des échantillons sera plus petit ou plus grand que la plage fournie à l'écran qui est 0 <= x < 4000 - ainsi la plupart des échantillons seront coupés à 0 ou 3999.

Il est possible de corriger la mettant à l'échelle les échantillons à installer et à solliciter le résultat par 500, de telle sorte qu'une valeur d'échantillon de 0 est rendu à Y-cordinate de 500.