Praxiswerkstatt Algorithmen der Signalcodierung in

Werbung
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.
Herunterladen