Wenn man die Frequenz eines 1-Sekunden-Klangs für jeden 0,1-Sekunden-Teil erhalten möchte, so muss man die Fourier-Transformation für den ersten 0,1-Sekunden-Teil anwenden, für den zweiten 0,1-Sekunden-Teil anwenden, für den dritten =,1-Sekunden-Teil anwenden …
Das Problem
Auf diese Weise wendet man implizit eine (rechteckige) Fensterfunktion an:
- Für die ersten 0,1 Sekunden wendet man die Fourier-Transformation auf das volle 1-Sekunden-Signal an, multipliziert mit einer Funktion, die 1 zwischen 0,0 und 0,1 Sekunden entspricht, und 0 für den Rest
- Für die zweiten 0,1 Sekunden wendet man die Fourier-Transformation auf das volle Signal einer Sekunde an, multipliziert mit einer Funktion, die 1 zwischen 0,1 und =,2 Sekunden entspricht, und 0 für den Rest
- Für die dritten =,1 Sekunden wendet man die Fourier-Transformation auf das volle Signal einer Sekunde an, multipliziert mit einer Funktion, die 1 zwischen 0,2 und 0,3 Sekunden entspricht, und 0 für den Rest
- …
Hier ist ein visuelles Beispiel der Fensterfunktion, die auf ein digitales (gesampeltes) Audiosignal angewendet wird, um den ersten 0,01-Sekunden-Teil zu erhalten:
In dieser Abbildung muss man, um die Frequenzen für den ersten 0,01-Sekunden-Teil zu erhalten, das abgetastete Audiosignal (blau) mit der Fensterfunktion (grün) multiplizieren.
In dieser Abbildung muss man, um die Frequenzen für den zweiten 0,01-Sekunden-Teil zu erhalten, das abgetastete Audiosignal (blau) mit der Fensterfunktion (grün) multiplizieren.
Durch "Fenstern" des Audiosignals multipliziert man das Signal audio(t) mit einer Fensterfunktion fenster(t). Diese Fensterfunktion erzeugt spektrale Lecks. Spektrale Lecks bedeutet das Auftreten neuer Frequenzen, die nicht innerhalb des Audiosignals existieren. Die Stärke der realen Frequenzen wird auf andere Frequenzen übertragen.
Hier ist eine nicht-formale (und sehr leichte) mathematische Erklärung. Angenommen, wir möchten einen Teil des vollständigen Audiosignals berechnen. Wir multiplizieren das Audiosignal mit einer Fensterfunktion, die den Klang nur für den gewünschten Teil durchlässt:
$$ audioabschnitt(t) = vollesaudio(t) · fenster(t) $$
Wenn man versucht, die Frequenzen des Audioteils zu ermitteln, wendet man die Fourier-Transformation auf das Signal an:
$$ Fourier( audioabschnitt(t) ) = Fourier( vollesaudio(t) · fenster(t) ) $$
Nach dem Faltungstheorem (das Zeichen * stellt den Faltungsoperator dar und · den Multiplikationsoperator):
$$ Fourier( vollesaudio(t) · fenster(t) ) = Fourier( vollesauto(t) ) * Fourier( fenster(t) ) $$
$$ → Fourier( audioabschnitt(t) ) = Fourier( vollesaudio(t) ) * Fourier( fenster(t) ) $$
Die Frequenzen von audioabschnitt(t) hängen von der gewählten Fensterfunktion fenster() ab.
Wir gehen nicht weiter ins Detail, da höhere Mathematik erforderlich wäre.
Wenn du mehr wissen möchtest, schau dir diesen Link auf Seite 29 an. Das Kapitel "the truncate effects" ("Die abgeschnittenen Effekte") zeigt den mathematischen Effekt, wenn man ein rechteckiges Fenster auf ein Signal anwendet. Beachte, dass das Zerschneiden eines Audiosignals in kleine Teile, um die Frequenzen jedes Teils zu analysieren, spektrale Lecks erzeugt.
Verschiedene Arten von Fenstern
Man kann spektrale Lecks nicht vermeiden, aber man kann mit der Wahl der richtigen Fensterfunktion beeinflussen, wie sich die Lecks verhalten: Statt einer rechteckigen Fensterfunktion kann man ein dreieckiges Fenster, ein Parzen-Fenster, ein Blackman-Fenster, ein Hamming-Fenster usw. wählen.
Das rechteckige Fenster ist das am einfachsten zu verwendende Fenster (weil man das Audiosignal nur in kleine Teile schneiden muss), aber für die Analyse der wichtigsten Frequenzen in einem Signal ist es möglicherweise nicht die beste Art von Fenster. Schauen wir uns drei Arten von Fenstern an: Rechteckige, Hamming-Fenster und Blackman-Fenster. Um den Effekt der drei Fenster zu analysieren, verwenden wir das folgende Audiosignal, bestehend aus:
- Eine Frequenz von 40 Hz mit einer Amplitude von 2
- Eine Frequenz von 160 Hz mit einer Amplitude von 0,5
- Eine Frequenz von 320 Hz mit einer Amplitude von 8
- Eine Frequenz von 640 Hz mit einer Amplitude von 1
- Eine Frequenz von 1000 Hz mit einer Amplitude von 1
- Eine Frequenz von 1225 Hz mit einer Amplitude von 0,25
- Eine Frequenz von 1400 Hz mit einer Amplitude von 0,125
- Eine Frequenz von 2000 Hz mit einer Amplitude von 0,125
- Eine Frequenz von 2500 Hz mit einer Amplitude von 1,5
In einer perfekten Welt sollte die Fourier-Transformation dieses Signals das folgende Spektrum ergeben:
Diese Abbildung zeigt ein Spektrum mit nur 9 vertikalen Linien (bei 40 Hz, 160 Hz, 320 Hz, 640 Hz, 1000 Hz, 1225 Hz, 1400 Hz, 2000 Hz und 2500 Hz). Die y-Achse gibt die Amplitude in Dezibel (dB) an. Das heißt, die Skala ist logarithmisch: Mit dieser Skala ist ein Klang von 60 dB 100-mal stärker als ein Klang von 40 dB und 10 000-mal stärker als ein Klang von 20 dB. Um eine Vorstellung davon zu bekommen: Wenn ein Mann in einem leisen Raum spricht, ist der von ihm erzeugte Klang 20 - 30 dB lauter (1 m von ihm entfernt) als der Klang des Raumes.
Um dieses "perfekte" Spektrum zu zeichnen, haben wir die Fourier-Transformation mit einem sehr langen Fenster angewendet: einem 10-Sekunden-Fenster. Die Verwendung eines sehr langen Fensters reduziert das spektrale Leck, aber 10 Sekunden sind zu lang, weil sich der Klang in einem echten Song viel schneller ändert. Um eine Vorstellung davon zu bekommen, wie schnell sich die Musik verändert:
- Hier ist ein Video mit 1 Änderung (bzw. Beat) pro Sekunde, es klingt langsam, aber dies ist ein gewöhnlicher Rhythmus für klassische Musik.
- Hier ist ein Video mit 2,7 Änderungen pro Sekunde, es klingt viel schneller, aber dieser Rhythmus ist für Electro-Musik üblich.
- Hier ist ein Video mit 8,3 Änderungen pro Sekunde, es ist ein sehr (sehr) schneller Rhythmus, aber verwendbar für kleine Teile von Songs.
Um diese schnellen Änderungen zu erfassen, muss man den Klang mithilfe von Fensterfunktionen in sehr kleine Teile "zerschneiden". Stellen wir uns vor, wir wollen die Frequenzen eines Klangs alle 1/3 Sekunden analysieren:
In dieser Abbildung können wir das Audiosignal mit einem der 3 Fenstertypen multiplizieren, um den Teil des Signals zwischen 0,333 und 0,666 Sekunden zu erhalten. Die Verwendung eines rechteckigen Fensters entspricht dem Zerschneiden des Signals zwischen 0,333 s und 0,666 s, während man mit Hamming- oder Blackman-Fenstern das Signal mit dem Fenstersignal multiplizieren muss.
Im Folgenden sei nun das Spektrum des vorherigen Audiosignals mit einem 4096-Sample-Fenster gezeigt:
Das Signal wird bei 44100 Hz abgetastet, so dass ein 4096-Sample-Fenster einen 93-Millisekunden-Teil (4096/44100) und eine Frequenzauflösung von 10,7 Hz darstellt.
Diese Abbildung zeigt, dass alle Fenster das reale Klangspektrum verändern. Wir sehen deutlich, dass ein Teil der Stärke der realen Frequenzen auf ihre Nachbarn übertragen wird. Das Spektrum des rechteckigen Fensters ist das schlechteste, da das spektrale Lecken viel höher ist als die zwei anderen. Dies gilt insbesondere zwischen 40 und 160 Hz. Das Blackman-Fenster gibt das nächstgelegene Spektrum vom realen Spektrum an.
Hier ist das gleiche Beispiel mit einer Fourier-Transformation eines 1024-Fensters:
Das Signal wird bei 44100 Hz abgetastet, sodass ein 1024-Sample-Fenster einen 23-Millisekunden-Teil (1024/44100) und eine Frequenzauflösung von 43 Hz darstellt.
Diesmal gibt das rechteckige Fenster das beste Spektrum. Bei den 3 Fenstern ist die Frequenz von 160 Hz durch die spektralen Lecks der Frequenzen 40 Hz und 320 Hz verdeckt. Das Blackman-Fenster zeigt das schlechteste Ergebnis mit einer Frequenz von 1225 Hz, die nahezu unsichtbar ist.
Vergleicht man beide Abbildungen, so zeigt sich, dass das spektrale Lecken (für alle Fensterfunktionen) zunimmt, wenn die Frequenzauflösung zunimmt. Der von Shazam verwendete Fingerabdruck-Algorithmus sucht nach den lautesten Frequenzen innerhalb einer Audiospur. Wegen des spektralen Lecks können wir nicht einfach die X höchsten Frequenzen nehmen. Im letzten Beispiel sind die 3 lautesten Frequenzen ungefähr 320 Hz, 277 Hz (320 - 43) und 363 Hz (320 + 43), wohingegen nur die 320 Hz-Frequenz existiert.
Welches Fenster ist das beste?
Es gibt keine "besten" oder "schlechtesten" Fenster. Jedes Fenster hat seine Besonderheiten und abhängig von dem Problem verwendet man den entsprechenden Typen.
Ein rechteckiges Fenster hat ausgezeichnete Auflösungseigenschaften für Sinusoide von vergleichbarer Stärke, aber es ist eine schlechte Wahl für Sinusoide mit unterschiedlichen Amplituden (was in einem Song der Fall ist, weil die Noten nicht die gleiche Lautstärke haben).
Fenster wie Blackman sind besser, um zu verhindern, dass spektrale Lecks von starken Frequenzen die schwachen Frequenzen verdecken. Aber diese Fenster können schlecht mit Rauschen umgehen, da ein Rauschen mehr Frequenzen verdecken wird als ein rechteckiges Fenster. Dies ist problematisch für einen Algorithmus wie Shazam, der mit Rauschen umgehen muss (zum Beispiel, wenn man Shazam für einen Song in einer Bar oder draußen im Freien benutzt, wo eine Menge Lärm vorhanden ist).
Ein Hamming-Fenster liegt zwischen diesen beiden Extremen und ist (meiner Meinung nach) eine bessere Wahl für einen Algorithmus wie Shazam.
Hier sind einige nützliche Links, um die Fensterfunktionen und das spektrale Lecken genauer zu betrachten:
• Leck-Effekt (Fenster-Effekt/Leakage-Effekt)
• Fensterfunktion
• On the Use of Windows for Harmonic Analysis with the Discrete Fourier Transform (PDF)