Praxiswerkstatt Algorithmen der Signalcodierung in Python Gerald Schuller Organisation: Wöchentliche Aufgaben, Präsentation beim folgenden Termin, maximal 2 fehlende Termine für die Teilnahme. Philosophie: selbständig kreative Lösungen für Aufgaben finden. Wir benötigen Matlab oder Octave (die Open Source Version) auf unseren Rechnern für die Hausaufgaben. Octave-Link: http://www.malinc.se/math/octave/mainen.php Webseite der Praxiswerkstatt mit den Tafelfolien: Www.tu-ilmenau.de/mt → Lehrveranstaltungen → Bachelor MT → Praxiswerkstatt... Python Pylab ● Start pylab in einem Terminal oder Console mit: ipython –pylab Help mit “?” vor der Funktion, z.B. ?sin oder help(sin). Kommandozeilen orientierte Oberfläche: 1+2 enter ans=3 Zuweisung: x=16; ist Speicher mit Wert 16 (Semikolon unterdrückt die Anzeige des Ergebnisses) Eingabe von Matrizen (ggf. nach: import numpy): A=matrix([[1 2], [3 4]]) Oder: A=matrix(“[1 2; 3 4]”) A matrix([[1, 2], [3, 4]]) Python, Pylab oder Numpy Wenn Namespaces benutzt werden, z.B. mit “import numpy”, muss “numpy.” vorangestellt werden. B=matrix([[5, 6],[ 7, 8]]); oder: B=numpy.matrix([[5, 6],[ 7, 8]]) Matrix Multiplikation: C=A*B C matrix([[19, 22], [43, 50]]) Elementweise Multiplikation: C=multiply(A,B) oder: numpy.multiply(A,B) C Out[42]: matrix([[ 5, 12], [21, 32]]) Python Numpy oder Pylab Ansprechen bestimmter Elemente einer Matrix: Index beginnt bei Python bei 0! (also wie meist üblich) A[0,1] Element in der ersten Zeile und zweiten Spalte. A[:,0] erste Spalte A[0,:] erste Zeile A[0:3][:,1:4] alle Elemente, die in den Zeilen 0 bis 2 und in den Spalten 1 bis 3 zu finden sind (ausschl. letzter Index!). A= 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Python Numpy A=arange(1,9); oder: A=numpy.arange(1,9); (Beachte: Sequenz ist ohne Obergrenze! “range” erzeugt integers) A Out[98]: array([1, 2, 3, 4, 5, 6, 7, 8]) Schrittweite 0,5: A=arange(1,4.5,0.5) A Out[106]: array([ 1. , 1.5, 2. , 2.5, 3. , 3.5, 4. ]) Umgekehrte Zählrichtung: A=arange(8,0,-1) In [110]: A Out[110]: array([8, 7, 6, 5, 4, 3, 2, 1]) Python ● x=[2, 7, 32, 9]; ● For Schleife: For n in range(0,4): x[n]=x[n]*n; ● Als Vektor: n=range(0,4); x=multiply(x,n) Out[30]: array([ 0, 7, 64, 27]) ● Beachte: Python ist mit Schleifen deutlich schneller als Octave (gemessen ca. Faktor 6)! Die Vektordarstellung ist aber trotzdem noch schneller. Pylab Sound Beispiel ● Installation von python-pyaudio in einer Linux shell mit: sudo apt-get install python-pyaudio ● Start pylab in einem Terminal oder Console mit: ipython –pylab ● Importiere sound.py mit: import sound ● Dann erzeuge 32000 Zeitschritte zwischen 0 und 1: t=linspace(0,1,32000); ● Erzeuge einen Sinus mit Amplitude 10000 und Frequenz 440 Hz, also 440 Schwingungen in 1s, über 32000 Zeitschritte: s=10000*sin(2*pi*440*t); ● Ausgabe des Sound mit: sound.sound(s,32000); Grundlagen, Beispiel Sinuston mit Frequenz von 4000 Hz und Abtastrate von 44100 Hz s=sin(2*pi*f*t) Anschauen mit plot und anhören mit sound. Dasselbe mit einer Abtastrate von 8000 Hz. Verschiedene Frequenzen anhören (z.B. 3500, 3900, 4000) Was nehmen Sie in der Nähe der Nyquist-Frequenz wahr? Pylab Sound Funktionen ● ● ● In unserer Library “sound.py” werden weiterhin folgende audio Funktionen bereit gestellt. Import mit: import sound Einlesen aus einer Sound Datei (Fs ist die Abtastfrequenz) in den Vektor (das Array) snd: snd,Fs=sound.wavread(“soundfile.wav”); ● Schreiben von eines Vektors snd in eine Sound Datei: sound.wavwrite(snd, Fs, “soundfile.wav”); ● Aufnehmen eines Sounds mit t Sekunden in einen Vektor snd: snd=sound.record(t,Fs); Pylab Scipy Signal Funktionen Pylab stellt mit der Library scipy.signal unsere benoetigten Signal Processing Funktionen zur Verfuegung. ● Importieren der Library mit: import scipy.signal as signal help mit: ?signal ● Convolution von 2 Vektoren (arrays) X und B mit Y=signal.convolve(X,B); ● Filtern eines Signals X mit Zaehlerpolynom (bzw. Impulsantw.) B und Nennerpolynom A: Y=signal.lfilter(B,A,X); ● Beispiel für FIR filter design: B=signal.remez(8,[0, 0.15, 0.35, 0.5],[1, 0]); Grundlagen, Beispiel WAV-file einlesen, z.B. 'Windows XP-Startvorgang.wav' im Ordner C:\\Windows\Media Vektor B erstellen: B=numpy.array([1, 1, 1, 1])/4.0 Audiosignal mit B falten. Ansehen von x und y mit plot und freqz. Beachte: Die Folge von Einsen kann auch als Rechteck-Funktion angesehen werden, wenn man sie mit (imaginären) Nullen umgibt. Python Signal Funktionen ● ● Zum Ansehen des Frequenzganges in Python gibt es auch in der Library “signal” die entsprechende Funktion. Beispiel: Import signal w,h=signal.freqz(B,1); plot(w,20*log10(abs(h))) zur Anzeige des Betrages des Frequenzganges in dB. Python Funktionen ● ● Funktionen koennen in einer Datei zusammen gefasst werden, eine Library, die dann importiert werden muss. Beispiel: Die Library sound.py wird mit “import sound” importiert. Funktionsdefintion darin: def quadrat(x): ● “Funktion zur Berechnung des Quadrates” return x**2; Die Einrueckungen sind in Python wichtig (wie Klammern) Aufgaben zum nächsten Mal ● ● Erstellen Sie einen Tiefpass mit 2 kHz Grenzfrequenz. Verwenden Sie “remez” zum Filterentwurf. Wenden Sie das Filter auf ein WAV-File an (z.B. Windows XPStartvorgang.wav). Filtern Sie einmal mit “conv” und einmal mit “filter”. Vergleichen Sie beide Resultate. ● Vergleichen der Plots von Original und gefiltertem Signal. ● Original und gefiltertes Signal anhören. ● Erstellen Sie ein zweites Filter. Gehen Sie von einer Rechteckfunktion der laenge 16 im Zeitbereich als Filter aus (16 mal 1/16 als Wert), und vergleichen die Wirkung mit dem vorherigen Filter.