Hier werden die Unterschiede zwischen zwei Versionen gezeigt.
Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
ws1617:the_art_of_music:protokolle:03 [2017/01/26 16:20] fabi_an angelegt |
ws1617:the_art_of_music:protokolle:03 [2017/01/26 16:31] (aktuell) fabi_an |
||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
====== 2017-01-12: ====== | ====== 2017-01-12: ====== | ||
- | * microlistener.py | + | * microlistener.py zum Laufen gebracht |
<code python> | <code python> | ||
Zeile 102: | Zeile 102: | ||
while True: | while True: | ||
pass | pass | ||
+ | </code> | ||
+ | |||
+ | * Um nicht nur die Lautstärke mit Sternchen in einer Eingabeauffordeung visualisiert zu bekommen, sondern pro Frequenz den Anteil, nun zusätzlich die DFT (discrete fourier transform) genutzt, bevor visualiert wird. | ||
+ | |||
+ | <code python> | ||
+ | #!/usr/bin/python | ||
+ | # coding=utf8 | ||
+ | |||
+ | from __future__ import division | ||
+ | |||
+ | import pyaudio | ||
+ | import time | ||
+ | |||
+ | |||
+ | ### Diese Klasse wird im Modul microlistener definiert. | ||
+ | ### Sie kann in allen Projekten verwendet werden, die eine | ||
+ | ### kontinuierliche Audio-Eingabe brauchen. | ||
+ | |||
+ | |||
+ | class MicroListener(object): | ||
+ | def __init__(self,rate,channels,chunk,callback,playback=False): | ||
+ | '''kreiert einen Stream, der mit der Samplerate 'rate' | ||
+ | und 'channels' Kanälen über das Microphon Audio aufnimmt. | ||
+ | Nach jeweils 'chunk' Frames wird die callback-Funktion | ||
+ | aufgerufen. | ||
+ | |||
+ | Falls playback==True, werden die Daten an den Lautsprecher | ||
+ | durchgereicht. | ||
+ | |||
+ | Die Callback-Funktion nimmt als Argumente | ||
+ | |||
+ | (in_data, frame_count, time_info, status) | ||
+ | |||
+ | und gibt ein Tupel zurück, dessen erster Eintrag die | ||
+ | Daten (für Playback), dessen zweiter Eintrag ein Signal | ||
+ | ist, sollte pyaudio.paContinue sein. | ||
+ | |||
+ | Also z. B. (mit einer globalen Variable CHANNELS) | ||
+ | |||
+ | |||
+ | def micro_callback(in_data, frame_count, time_info) | ||
+ | y=np.fromstring(in_data,dtype=np.short) | ||
+ | if CHANNELS==2: | ||
+ | y=y.reshape((y.shape[0]//2,2)) | ||
+ | else: | ||
+ | y=y.reshape((y.shape[0],1)) | ||
+ | ## y enthält danach die Daten des letzten Abschnitts | ||
+ | ## aus chunk samples. | ||
+ | ## jetzt irgendwas mit den Daten machen | ||
+ | ## | ||
+ | return (in_data, pyaudio.paContinue) | ||
+ | ''' | ||
+ | |||
+ | self.p = pyaudio.PyAudio() | ||
+ | self.stream = self.p.open(format=pyaudio.paInt16 , | ||
+ | channels=channels, | ||
+ | rate=rate, | ||
+ | input=True, | ||
+ | output=playback, | ||
+ | stream_callback=callback, | ||
+ | frames_per_buffer=chunk) | ||
+ | |||
+ | self.stream.start_stream() | ||
+ | time.sleep(0.5) | ||
+ | |||
+ | def __del__(self): | ||
+ | self.stream.stop_stream() | ||
+ | self.stream.close() | ||
+ | self.p.terminate() | ||
+ | |||
+ | |||
+ | ######################################################################### | ||
+ | ### Test-Sektion ####################################################### | ||
+ | ######################################################################### | ||
+ | |||
+ | |||
+ | |||
+ | if __name__=='__main__': | ||
+ | |||
+ | import numpy as np | ||
+ | import matplotlib.pyplot as plt | ||
+ | import scipy.fftpack | ||
+ | |||
+ | ########################### | ||
+ | |||
+ | ### GLOBALE VARIABLEN | ||
+ | |||
+ | CHANNELS=2 | ||
+ | RATE=44100 | ||
+ | CHUNK=2**11 | ||
+ | |||
+ | |||
+ | def micro_callback(in_data, frame_count, time_info,status): | ||
+ | '''callback Funktion: wird vom PyAudio-Objekt aufgerufen, | ||
+ | wenn CHUNK Frames von der Soundkarte (Mikrophon) gelesen wurden''' | ||
+ | y=np.array(np.fromstring(in_data,dtype=np.short),dtype=np.float) | ||
+ | yf = scipy.fftpack.fft(y) | ||
+ | xf = np.linspace(0.0, (2.0*RATE), CHUNK/2) | ||
+ | plt.plot(yf) | ||
+ | plt.show() | ||
+ | if CHANNELS==2: | ||
+ | y=y.reshape((y.shape[0]//2,2)) | ||
+ | else: | ||
+ | y=y.reshape((y.shape[0],1)) | ||
+ | print int(np.linalg.norm(y[:,0])/2000.)*'*' | ||
+ | return (in_data, status) | ||
+ | |||
+ | listen=MicroListener(RATE,CHANNELS,CHUNK,micro_callback) | ||
+ | while True: | ||
+ | pass | ||
+ | |||
</code> | </code> |