Benutzer-Werkzeuge

Webseiten-Werkzeuge


ws1415:ton_zu_bild

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen gezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
ws1415:ton_zu_bild [2015/02/28 14:31]
lennyleass
ws1415:ton_zu_bild [2016/05/10 14:46] (aktuell)
Zeile 22: Zeile 22:
 ===Theoretischer Hintergrund=== ===Theoretischer Hintergrund===
  
-Zuerst mussten wir uns damit auseinandersetzen,​ wie Schall mathematisch beschrieben werden kann. Wir haben uns die Begriffe Periode, Frequenz, Amplitude etc. noch einmal vergegenwärtigt. Grundlage für die Verarbeitung und Analyse von Tonsignalen ist die Fourier-Analyse. Sie bietet eine Möglichkeit,​ Schallsignale in ihre Teilfrequenzen zu zerlegen. Somit kann man z.B. Grundtöne bestimmen, Obertonspektren vergleichen,​ und vieles mehr - so weit sind wir aber noch nicht gekommen.+Zuerst mussten wir uns damit auseinandersetzen,​ wie Schall mathematisch beschrieben werden kann. Wir haben uns die Begriffe Periode, Frequenz, Amplitude etc. noch einmal vergegenwärtigt. ​
  
-[[Wochenprotokolle]]+==Fourier-Analyse==
  
-===Protokoll===+Grundlage für die Verarbeitung und Analyse von Tonsignalen ist die Fourier-Analyse. ​
  
-**20.11**   ​Grundlagen Fourier-AnalyseFestlegung der Kommunikationsmittel (Facebook ​und Dropbox)+Sie bietet eine Möglichkeit,​ Schallsignale in ihre Teilfrequenzen zu zerlegenSomit kann man z.B. Grundtöne bestimmen, Obertonspektren vergleichen, und vieles mehr.
  
-**27.11** ​  ​Einrichten der Wiki, Grundlagen Fourier-Analyse,​ Erkundung von Schallwekrzeugen in Python 
  
-**4.12** ​  ​Erstellen von Klassen Ton und Bild, Beginn der Erstellung von Bildgenerierungsprogrammen+===Unser Programm===
  
-**11.12** ​  ​Anfängliche technische Schwierigkeiten:​ Der Befehl img.show() resultiert nicht in der Darstellung des Bildes. Dank Stefans Hilfe konnten ​  wir das Problem schnell beheben, sodass wir nun einen einzelnen Ton als unbewegtes Bild darstellen können.  +Um Töne  aufnehmen deren Daten verarbeiten zu können, verwenden ​wir das Modul pyaudio
-Für unsere Weiterarbeit stellen sich im Wesentlichen zwei Probleme: +Für die Verarbeitung der Daten verwenden ​wir das Modul numpy.  
-  * 1. **In welcher Form soll sich das Bild bewegen?** Dazu müssen ​wir wissen: Wird ein Bild einem Ton oder einer Sekunde zugeordnet? Oder orientiert sich unsere Bild an verschiedenen Messwerten: Lautstärke -> Größe eines Objekts; Tonfrequenz -> Farbe des Objekts. +Für die Generierung ​und Darstellung der Bilder verwenden ​wir das Modul matplotlib.
-Aufgrund unseres bishergen Programms haben wir uns dafür entschieden,​ dass das Programm pro Sekunde eine bestimme Anzahl von Bildern generiert. Diese lassen wir anschließend hintereinander ablaufen+
-Ausblick: Das Programm soll nach und nach immer mehr Messwerte berücksichtigen,​ weshalb ​wir schrittweise mehr Parameter in den Sourcecode einbauen wollenDiese stellen dann zum Beispiel die Lautstärke oder die Frequenz dar. +
-  * 2. **Wie können wir die bildliche Darstellung ästhetisch optimieren?​**+
  
-**08.01** Durch zwei neue Programme ​von Stefan ist nun eine detailliertere und erweiterte Darstellung des Tons möglich: +Ein Funktion zum Aufnehmen ​von Tönen kann z.B. so aussehen:
-  - Nummerierter Listenpunkt "​Visuals":​ 3-dimensionale Darstellungen +
-  -  Das Einlesen von wav-DateienAnstatt Mikrofonaufnahmen kann jetzt direkt auf die Daten der Tonaufnahmen zugegriffen werden und ins Programm ​  ​eingegeben werden.+
  
-Ausblick für nächste Woche:  +<code python>
-  *  Einarbeitung und Anwendung der Fourier-Analyse +
-  *  Benutzung von "​Visuals"​ in Python+
  
-**15.01** Bislang haben wir aus einigen Sekunden langen Mikrofonaufnahmen,​ ein 2-dimensionales,​ mehrfaches Bild erzeugt. Das Verfahren gestaltete sich somit grob in die Teilschritte: ​ +from __future__ import division 
-    * Aufnahme ​ +import pyaudio 
-  * -> Datenspeicherung +import numpy as np
-  * -> Umrechnung +
-  * -> Bildanzeige+
  
-Heute ist es gelungen, diese zwei grundsätzlichen Prozesse von Mikrofonaufnahme und Bildanzeige jeweils kontinuierlich und selbstständig ablaufen zu lassen. 
-Somit können wir jetzt beispielsweise ein Gespräch aufnehmen und es direkt in ein Bild umwandeln. Das heißt, es werden permanent Aufnahmen getätigt, also Daten gesammelt, die direkt und zusammenhängend in eine Bildatei umgewandelt werden. Je nach dem, wie viele Bilder pro Zeit erzeugt werden, entsteht eine Art Film.  
  
-**22.01** Der nächste Schritt ist nun, die Bilddarstellung vielfältiger zu gestaltenEs wird diskutiertnach welchen ästhetischen Aspekten wir unsere Bilder erzeugen wollenAn dieser Stelle sind zum Beispiel 3-dimensionale Körper interessantEine weitere Möglichkeit istdie eigentliche Bilddatei mit weiteren kleineren Bilddateien zu überlagern;​ also praktisch ein Bild im Bild erzeugen.+def recordsnd(filenametime): 
 + '''​ 
 + Nimmt eine  time  Sekunden lange Schallsequenz 
 + auf (mit der Samplerate 44100 Hz) auf, 
 + speichert sie in der Datei filename und gibt die 
 + Aufnahme als numpy-array mit Werten zwischen -1 und 1 zurück 
 + '''​ 
 +        CHANNELS = 1 
 +        RATE = 44100 
 + DAUER=time 
 + ANZAHL=int(RATE*DAUER) 
 +  
 +  
 + p = pyaudio.PyAudio() 
 + raw_input("​Aufnehmen ​ "​+str(time)+ " Sekunden): Eingabetaste drücken..."​) 
 +  
 + stream = p.open(format =pyaudio.paInt16 , 
 +                channels = CHANNELS, 
 +                 rate = RATE, 
 +                 input = True, 
 +                 frames_per_buffer = 1024)#​ANZAHL) 
 +  
 +  
 + yy=stream.read(ANZAHL) 
 + y=np.fromstring(yy,dtype=np.short) 
 + if CHANNELS==2:​ 
 + y=y.reshape((y.shape[0]//​2,​2))
  
-Hier stoßen wir auf unsere Defizite beim Umgang mit matplotlib. Deshalb steht auch unsere Hausaufgabe bis nächster Woche festHeranarbeitung an das Verständnis von Aufbau und Funktion von matplotum unsere vielen Ideen zur Bilddarstellung auch technisch umsetzen zu können + print("​Aufgenomen" + str(ANZAHL) + " Frames"​) 
 + stream.close() 
 + p.terminate() 
 + yy=np.array(y,dtype='​d'​)/​32768.
 + if filename!=None:​ 
 + wavwrite(filename,​ yy) 
 +  
 + return yy
  
-**29.01** Stefan hat für uns ein matplotlib-Beispiel erstelltwelches alle Möglichkeiten darstellt die man mit diesem Modul hat. Auf der Grundlage dessen haben wir nun einen Kreis in einem Koordinatensystem erstelltder seine Farbe entsprechend des Tones ändert der aufgenommen wirdNächste EtappeDer Kreis ändert auf Basis des Tones die Größe. Wir wollen demnach als Endergebnis einen pulsierenden seine Farbe ändernden Kreis erzeugen.+</​code>​ 
 +  
 +Den numpy-arrayden wir hierdurch erhaltenkönnen wir uns mit matplotlib anzeigen lassen, z.B. so:
  
 +<code python>
 +import matplotlib.pyplot as plt
  
- +y = recordsnd(None,​1) 
 +y = y[:2000] 
 +y = y.reshape(len(y),​ 1) + y.reshape(1,​ len(y)) 
 +ax = plt.axes() 
 +ax.imshow(y) 
 +plt.show() 
 + 
 +</​code>​ 
 + 
 +Wenn wir nun auch die Fourier-Analyse ins Spiel bringen, können wir noch interessantere Bilder erzeugen: 
 + 
 +<code python>​ 
 + 
 +y = recordsnd(None,​1) 
 +y = y[:512] 
 +y = np.abs(np.fft.fft(y)) 
 +y = np.concatenate((y[-50:​],​y[:​50]),​axis=0) 
 +y = y.reshape(len(y),​1) + y.reshape(1,​len(y)) 
 +ax = plt.axes() 
 +ax.imshow(y) 
 +plt.show() 
 + 
 + 
 +</​code>​ 
 + 
 + 
 +Nun brauchen wir eine Methode, um Tondaten kontinuierlich verarbeiten und anzeigen zu lassen.  
 +Zunächst erstellen wir ein Anzeigeobjekt,​ zusammen mit einer Methode, wie sich dieses aktualisiert:​ 
 + 
 +<code python>​ 
 + 
 +class Anzeige(object):​ 
 + 
 + def __init__(self,​chunk,​rate):​ 
 + self.chunk=chunk 
 + self.pixels = np.random.rand(chunk,​chunk) 
 + plt.pause(0.001) 
 + self.rate=rate 
 + self.fig = plt.figure() 
 + self.ax = self.fig.add_axes((0,​0.25,​0.5,​0.5)) 
 + plt.axis("​off"​) 
 + self.ax2 = self.fig.add_axes((0.5,​0.25,​0.5,​0.5)) 
 + plt.axis("​off"​) 
 + #​self.image = self.ax.imshow(self.pixels) 
 + self.fig.canvas.draw() 
 + self.noch_kein_erstes_bild_da=True 
 +  
 +  
 + def update(self,​data):​ 
 + l=len(data) 
 + self.fourier = np.abs(np.fft.fft(data,​ axis=0)) 
 + self.fourier = np.concatenate((self.fourier[-50:,​0],​self.fourier[:​50,​0]),​axis=0) 
 + l2 = len(self.fourier) 
 + self.fourier2 = self.fourier.reshape((l2,​1))+self.fourier.reshape((1,​l2)) 
 +  
 + self.pixels=data.reshape((l,​1))+data.reshape((1,​l)) 
 + if self.noch_kein_erstes_bild_da:​ 
 + self.image = self.ax.imshow(self.pixels) 
 + self.image.set_cmap("​spectral"​) 
 + self.fourier_image = self.ax2.imshow(self.fourier2) 
 + self.fourier_image.set_cmap("​spectral"​) 
 + self.noch_kein_erstes_bild_da=False 
 + self.fig.canvas.draw() 
 + plt.pause(0.05) 
 + self.image.set_data(self.pixels) 
 + self.fourier_image.set_data(self.fourier2) 
 + 
 + 
 +anzeige=Anzeige(CHUNK,​RATE) 
 + 
 +</​code>​ 
 + 
 + 
 +Dann erstellen wir eine callback-funktion,​ welche unser Anzeige-objekt sich mit neuen Daten aktualisieren lässt: 
 + 
 +<code python>​ 
 + 
 +def micro_callback(in_data,​ frame_count,​ time_info, status): 
 + 
 + if CHANNELS==2:​ 
 + y=y.reshape((y.shape[0]//​2,​2)) 
 + else: 
 + y=y.reshape((y.shape[0],​1)) 
 + anzeige.update(y) 
 + return (in_data, pyaudio.paContinue) 
 + 
 +</​code>​ 
 + 
 +Nun wird ein Audiostream gestartet, welcher, immer wenn CHUNK frames vom Mikrophon gelesen wurden, unsere callback-funktion aufruft: 
 + 
 +<code python>​ 
 + 
 +p = pyaudio.PyAudio() 
 +stream = p.open(format=pyaudio.paInt16 , 
 +                channels=CHANNELS,​ 
 +                rate=RATE,​ 
 +                input=True,​ 
 +                output=False,​ 
 +                stream_callback=micro_callback,​ 
 +                frames_per_buffer=CHUNK) 
 + 
 +stream.start_stream() 
 +time.sleep(0.5) 
 + 
 +</​code>​ 
 + 
 +Schließlich startet unsere Hauptschleife,​ welche das Anzeige-objekt so lange darstellt, wie der Stream aktiv ist: 
 + 
 +<code python>​ 
 + 
 +while stream.is_active():​ 
 + anzeige.fig.canvas.draw() 
 + anzeige.fig.canvas.flush_events() 
 + 
 +     
 +</​code>​ 
 + 
 +===Das Endprodukt=== 
 + 
 +{{ws1415:​projekte_im_wintersemester_2014_15:​bild2.png}}
  
 +[[Protokolle]]
ws1415/ton_zu_bild.1425130301.txt.gz · Zuletzt geändert: 2016/05/10 14:46 (Externe Bearbeitung)