1 Kapitel 10: Signalverarbeitung mit Python: Sound Einführung in die Informatik Wintersemester 2007/08 Prof. Bernhard Jung Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg Übersicht Repräsentation von Sound Algorithmen: Erhöhen der Lautstärke Normalisierung von Sound Rückwärts-Sound Konkatenierung von Sound Kombination von Sounds Akkorde Echo Synthetischer Sound Frequenz von Sounds erhöhen / verringern Hauptlernziele • Repräsentation von digitalem Sound verstehen • Digitalen Sound als eine Art von Messwerten verstehen • Einfache Python-Programme zur Soundverarbeitung entwickeln können • Wdh: Schleifen (for) und bedingte Anweisungen (if … else) verstehen Signalverarbeitung mit Python: Sound
28
Embed
Kapitel 10: Signalverarbeitung mit Python: Sound · Multimedia Dateien Repräsentation von Samplewerten und Formatinformationen größtenteils als "little endian" z.B. Bytefolge 24
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
1
Kapitel 10:
Signalverarbeitung mit Python: Sound
Einführung in die InformatikWintersemester 2007/08
Prof. Bernhard Jung
Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg
Übersicht
Repräsentation von SoundAlgorithmen:
Erhöhen der LautstärkeNormalisierung von SoundRückwärts-SoundKonkatenierung von Sound
Kombination von SoundsAkkordeEcho
Synthetischer SoundFrequenz von Sounds erhöhen / verringern
Hauptlernziele• Repräsentation von digitalem Sound verstehen• Digitalen Sound als eine Art von Messwerten verstehen • Einfache Python-Programme zur Soundverarbeitung entwickeln können• Wdh: Schleifen (for) und bedingte Anweisungen (if … else) verstehen
Signalverarbeitung mit Python: Sound
2
Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg
Akustik – die Lehre vom Schall
Schallwellen sind zyklischFrequenz einer Welle
Anzahl der Zyklen pro Sekundegemessen in Hertz(1 Hz = 1 Zyklus / Sekunde)
Amplitudemaximale Höhe der Welle
Natürlich vorkommende Klänge bestehen aus Überlagerung einer Vielzahl von Schallwellen
Amplitude
1 Zyklus
Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg
Psychoakustik – Wahrnehmung von SchallLautstärke und Tonhöhe
Wahrgenommene Lautstärke korreliert (logarithmisch) mit AmplitudeVerdopplung der Amplitude ca. 3 Dezibel lauterDezibel: Maß für wahrgenommene Lautstärke
0 dB: Schwellwert für Wahrnehmbarkeit von Geräuschen60 dB: Unterhaltungsgespräch80 dB: Schreien
Wahrgenommene Tonhöhe korreliert (logarithmisch) mit FrequenzHöhere Frequenz größere TonhöheVerdopplung der Frequenz 1 Oktave höherMenschliches Gehör: 5 Hz – 20.000 Hz
3
Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg
Digitalisierung von Sound
Sound Samplenumerische Repräsentation der Amplitude zu einem bestimmten Zeitpunkt(Messung des Drucks, den Sound-Welle an Mikrofonmembran erzeugt)
Beschreibung der Sound-Welle durch hinreichende Anzahl von Samples
AD-Wandler (Analog-Digital)
wie viele Samples notwendig?
PCM – Pulse Code Modulation:Digitale Repräsentation eines analogenSignals, bei welcher das Signal in uniformenIntervallen abgetastet wird und die Signal-größe in digitaler Form quantisiert wird
Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg
Theorem von Nyquist
Theorem von Nyquist (bezogen auf Sound):
Sampling Rate: Anzahl der erfassten Samples pro Sekundez.B. Menschliche Stimmen: maximale Frequenz 4000 Hz
8000 Samples pro Sekunde notwendig (Telefon)z.B. Menschliches Gehör: maximale Frequenz ca. 22000 Hz
ca. 44000 Samples pro Sekunde notwendigCD-Qualität: 44.100 Samples / Sekunde3-Minuten Song benötigt 158.760.000 Samples (Stereo × 2)
Zur Repräsentation (und späteren Wiedergabe) von Sound mit maximaler Frequenz n Hertz
müssen mindestens 2n Samples abgenommen werden
4
Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg
Typischerweise jeder Sample-Wert wird durch 2 Byte repräsentiert2 Byte = 16 Bitd.h. 216 = 65.536 verschiedene Zahlen darstellbar
Sample-Werte: -32.768 … 32.767Bem: Viele Varianten möglich, z.B. 8 Bit pro Sample
Digitaler Sound = Feld (Array) von Sound-SamplesAchtung: Komprimierte Speicherung in üblichen Datei-Formaten (z.B. mp3)
Digitale Soundverarbeitung = Manipulation von FeldernÄndern der Sample-WerteÄndern der Feldgröße
Digitaler Sound: Repräsentation von Sound in Computern
59 -111-119 -30 18 18
0 321 4 5 6
Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg
Teil von Microsofts RIFF-Spezifikation für Multimedia DateienRepräsentation von Samplewerten und Formatinformationen größtenteils als "littleendian"z.B. Bytefolge24 17 1e 13repräsentiertHex-Zahl 0x131e1724= 320739108Falls 16 Bits per Sample, werden Samplewerte vorzeichenbehaftet (im Zweierkomplement) gespeichert, d.h. Wertebereich-32768 … 32767
Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg
TUBAFSound.pyFunktionen für die Sound-Verarbeitung
Skript mit Funktionen zur einfachen Verarbeitung von digitalem SoundEinschränkungen an Sound-Dateien
.wav Format16 Bit Sample-Breitemono (laden von Stereo ok)bevorzugte Samplingrate 22050
funktioniert aber auch mitanderen Samplingrates
VerwendungSkript auf Kurs-WebseiteSpeichern im Arbeitsverzeichnis
mit eigenen SkriptenSound-Dateien
Abspielen von Sound nur auf Windows u. Linuxalle Plattformen: Bearbeiteten Sound speichern, dann mit geeignetem Playerabspielen
>>> from TUBAFSound import *>>> sound = makeSound('c4.wav')>>> playSound(sound)>>> saveSound(sound,'c4-copy.wav')
6
Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg
TUBAF Sound: Funktionen für die Sound-Verarbeitung(Auswahl)
Öffnen von Sound-Dateien makeSound(dateiname) – Erzeugt internes Sound-Objekt
nur .wav Dateien !
Lesen und Setzen von Sample-WertengetSamples(sound) – liefert Liste aller SamplewertesetSamples(sound, samples) – setzt die Samplewerte getSample(sound, index) – liefert Wert eines Samples (als Integer-Zahl)setSample(sound, index, value) – setzt Wert eines SamplesgetLength(sound) bzw len(sound) – liefert Länge des Sounds (Anzahl der Samples)
Speichern / Abspielen von SoundssaveSound(sound, filename) – abspeichern des Sounds als .wav DateiplaySound(sound) – bis jetzt nur Windows und Linux
andere Plattformen: Abspeichern des Sounds, Abspielen mit jeweiligem Audio-Player
Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg
TUBAF Sound: Beispiele für Sound-Funktionen
>>> from TUBAFSound import *>>> filename = r'C:\Dokumente und Einstellungen\Jung\EigeneDateien\c4.wav' >>> sound = makeSound(filename)>>> print soundSound of length 55125>>> getSample(sound, 0)20>>> getSample(sound, 55124)4225>>> samples = getSamples(sound)>>> print samples[0:10] # ':' ist sog. 'slice'-operator[20, 946, 1948, 2919, 3814, 4748, 5673, 6547, 7333, 8130]>>> playSound(sound) # nur Windows u. Linux>>> saveSound(sound, 'c4-copy.wav') # alle Plattformen
7
Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg
Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg
Rückwärts-Sound
Rückwärts-Abspielen von Sound war zu Beatles-Zeiten beliebt …siehe z.B. en.wikipedia.org zu "Revolution 9"
Umsetzung mit digitalem SoundSound-Array einfach umkehren:
“[Revolution] number 9, number 9, number 9”
59 -111-119 -30 18 18
18 -111-3018 -1 19 59
vorwärts:
rückwärts:
0 321 4 5 6
0 321 4 5 6
Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg
Rückwärts-Listen
Vorgehen:Zweite Liste listeRueckwaerts erzeugen, die Ergebnis enthalten sollVerwendung von zwei Indices (Laufvariablen)
indexRueck – läuft von 0, 1, 2, …, n-1, zum Durchlaufen von listeRueckwaertsindexVor – läuft von n-1, n-2, …, 2, 1, 0, zum Durchlaufen der Originalliste
Bei jedem Schleifendurchlauf wirdindexRueck um 1 erhöht, durch range-FunktionindexVor um 1 erniedrigt, per expliziter Zuweisungein Wert von Originalliste in neue Liste listeRueckwaerts kopiert
Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg
Konkatenierung von Sound
Aneinanderhängen von Sounds in zwei Dateien zu Sound in einer Datei
Aneinanderhängen von Sample-Arrays
59 -111-119 -30 18 18
59 -111-119
0 321
-30 1818
0 21
+
=
0 321 4 5 6
Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg
Konkatenierung von Sound
Vorgehen zur Konkatenierung von zwei Sounds:1. Erzeuge neues, leeres Sound-Objekt, das mindestes so lang ist wie beide
Eingabe-Sounds zusammenTUBAF Sound: makeEmptySound(t) – t ist Länge des Sounds in Sekunden
2. Kopiere Sample-Werte von erstem Sound-Objekt an Anfang von neuem Sound-Objekt
3. Kopiere Sample-Werte von zweitem Sound-Objekt in neues Sound-Objekt, beginnend hinter den Samples des ersten Sounds
59 -111-119 -30 18 18
59 -111-1190 321
-30 18180 21+
=0 321 4 5 6
17
Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg
Konkatenierung von Sound
Neues Teilproblem: Berechnung der Dauer eines Sounds in Sekunden
Relevante Funktionen von TUBAFSound:getLength(sound) – Anzahl Samples eines SoundsgetSamplingRate(sound)
z.B. 22050 oder 44100 Samples / Sekunde
Dauer eines Sounds in Sekunden:duration(sound)in TUBAF-Sound enthaltendefiniert als: getLength(sound) / getSamplingRate(sound)Liefert i.d.R. float-Wert, z.B. 3.219
Länge des konkateniertenSounds berechnen(in Sekunden)
Leeren Sounderzeugen
Alle Samples von Sound1kopieren
Alle Samples von Sound2kopieren
18
Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg
Kontext: Manipulation digitaler Medien
… ist einfach: nur Ersetzung von Bytes durch andere Bytes
z.B. Bilder
z.B. Soundechtes Zitat des Dozenten: "Informatik macht Spaß"auch mal gesagt: "meistens"nie gesagt: "Informatik macht Spaß … meistens"
selbst falls Sound-Dateien dieses Inhalts existieren sollten!
www.br-online.de, 2005
Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg
Nachtrag: Sound-Bearbeitung mittels Builtin-Funktionenvon Python für Listen
Eingebaute Funktionen zur Manipulation von Listen in Python, u.a.:sei liste = [1,2,3]Liste rückwärts: liste.reverse() [3,2,1]Konkatenierung von Listen: liste+[4,5] [1,2,3,4,5]Erweitern um zweite Liste: liste.extend([2,1]) [1,2,3,2,1]
if index > 10000:s3Sample = getSample(sound3,index-10000)setSample(sound1,index,s1Sample+s2Sample+s3Sample)
return sound1
>>> makeChord(c4,e4,g4)<TUBAFSound.Sound instance at 0x00C454E0>>>> playSound(c4)>>>
sound1 wirdüberschrieben
21
Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg
Erzeugen von Echos
Idee: Neuer Sample-Wert erhält Anteile des bisherigen Samples + Anteile des Samples, das delay Samples zurück liegt
Zur Vermeidung, dass Amplitude über Maximalwert liegt (d.h. neuer Sample-Wert > 32767) fließen altes und Echo-Sample mit Faktoren < 1 in neuen Sound ein
10 403020 50 60 70
0 321 4 5 6
624+4=28
181230+8=38
36+12=48
42+16=58
0 321 4 5 6
Faktor 0.6Faktor 0.4
Beispiel: Delay 4 (realistisch: 10000-20000)
Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg
Erzeugen von EchosPython-Code
def echo(sound, delay):destSound = copySound(sound)for index in range(delay):
for index in range(delay, getLength(sound)):origSample = getSample(sound,index)echoSample = getSample(sound,index-delay)newSample = int(0.6*origSample+0.4*echoSample)setSample(destSound,index,newSample)
Synthesizer, 1964 (Moog)Hörbeispiel: "Popcorn", 1969; erster nur mit Synthesizer eingespielter Pop-Hit
MIDI, 1983"Musical Instrument Digital Interface"Befehle zur Ansteuerung von digitalen Instrumenten bzw. Soundkarten(analog zu Vektorgrafik) Hörbeispiel
Hammond-Orgel, wikipedia.org
Moog-Synthesizerwww.wendycarlos.com
Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg
Innovation
1970er Jahre: "Wall of Synthesizers"Foto: Emerson, Lake & Palmer, 1974 (Moog-Synthesizer)
Moderne SynthesizerFoto: Kraftwerk, www.kraftwerk.com
23
Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg
Synthetischer SoundGenerierung von Sinus-Wellen
Wie viele Zyklen pro Sekunde? Frequenz = Anzahl der Zyklen pro Sekunde
Wie viele Samples pro Zyklus?SamplesPerCycle = SamplingRate / Frequenz
z.B. 22050 / 440 = 50.11Wert des i.-ten Samples (i = 1…22050):
Bereich -1.0 ... +1.0: sin(i / SamplesPerCycle * 2 * pi) Multiplikation mit max. Amplitude!
def sineWave(freq, amplitude = 4000):'''Generate a 1 second sine wave sound'''from math import pi, sinbuildSin = makeEmptySound(1) # make a 1 sec. empty soundsr = getSamplingRate(buildSin) # e.g. 22050samplesPerCycle = float(sr) / freq # e.g. 22050 / 440 = 50.11for pos in range( len(buildSin) ):
def squareWave(freq, amplitude = 4000):'''Generate a 1 second square wave sound'''from math import pi, sinbuildSquare = makeEmptySound(1) # make a 1 sec. empty soundsr = getSamplingRate(buildSquare) # e.g. 22050samplesPerCycle = float(sr) / freq # e.g. 22050 / 440 = 50.11for pos in range( len(buildSquare) ):
wie slower-Skript, aber mit Auffüllen von Nullen, falls notwendig
Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg
Singender Eisberg entdeckt
Ein Lied von Kälte und EinsamkeitEigentlich wollten Forscher des Bremerhavener Alfred-Wegener-Instituts für Polar- und Meeresforschung seismische Signale in der Antarktis untersuchen. Als sie die Aufnahmen auswerteten, entdeckten sie völlig unerwartet ein neues Talent: ein Eisberg, der musikalisch anmutende Klänge erzeugt.Mit einer Frequenz von 0,5 Hertz ist der von den Forschern als "harmonischer Tremor" beschriebene Ton für das menschliche Ohr zwar nicht wahrnehmbar. Auf schnellerer Geschwindigkeit abgespielt hört er sich jedoch an wie ein Bienenschwarm oder ein sich warmspielendes Orchester, berichteten die Forscher. Redaktionsmitglieder von tagesschau.de fühlten sich eher an die Geräuschkulisse eines Formel-1-Rennens oder sogar an Celine Dions Lied "My Heart will go on" aus dem Film Titanic erinnert. …