STFT kann erfolgreich für Audiodaten verwendet werden (z. B. mit einer WAV-Audiodatei), um einige Frequenzbereichsänderungen vorzunehmen (z. B. Rauschunterdrückung).
Mit N=441000
(dh 10 Sekunden bei Abtastrate fs=44100
) windowsize=4096
, overlap=4
produziert STFT approximativ eine 430x4096
Anordnung (erste Koordinate: Zeitrahmen, Koordinaten zweite: frequency bin). An diesem Array können Änderungen vorgenommen werden, und die Rekonstruktion kann mit Überlappungsaddition (*) erfolgen.
Wie ist es möglich, mit Wavelets etwas Ähnliches zu machen ? (DWT), dh erhalten Sie eine ähnliche Form a x b
mit a
Zeitrahmen und b
Frequenzbereichen, nehmen Sie eine Modifikation an dieser Anordnung vor und stellen Sie am Ende ein Signal wieder her? Wie ? Was ist das Wavelet-Äquivalent zu Überlappungsaddition ? Um welche Python-Funktionen handelt es sich hier (ich habe mit pyWavelets
... kein einfaches Beispiel für eine Audiomodifikation gefunden )?
(*): Hier ist das STFT-Framework, das verwendet werden kann:
signal = stft.Stft(x, 4096, 4) # x is the input
modified_signal = np.zeros(signal.shape, dtype=np.complex)
for i in xrange(signal.shape[0]): # Process each STFT frame
modified_signal[i, :] = signal[i, :] * ..... # here do something in order to
# modify the signal in frequency domain !
y = stft.OverlapAdd(modified_signal, 4) # y is the output
Ziel ist es, mit Wavelets ein ähnliches Framework zu finden.
Antworten:
Die Kurzzeit-Fourier-Transformation ist im Allgemeinen eine redundante Transformation, die normalerweise mit der gleichen Unterabtastung über jede Frequenz implementiert wird. Wenn das Fenster gut ausgewählt ist, ist es vollständig: Sie können es invertieren und jedes anfängliche Signal wiederherstellen.
Da es redundant und vollständig ist, hat es viele perfekte Umkehrungen. Es kann mit allgemeineren Tools implementiert und verstanden werden: (überabgetastete) komplexe Filterbänke. Ausgehend von einem Fenstertyp und einer Fensterlänge sowie der Überlappung erhalten Sie eine Analysefilterbank, für die Sie berechnen können, ob sie invertierbar ist oder nicht. In diesem Fall können Sie eine natürliche Inverse und auch optimierte Inverse berechnen . Die Überlappungsaddition ist nur eine der vielen möglichen Inversen, wahrscheinlich die häufigste, die die Fensterauswahl oft einschränkt.
Standardmäßige diskrete Wavelet-Transformationen sind ebenfalls Filterbänke, mit dem Unterschied, dass die Unterabtastung nicht in jedem Frequenzband gleich ist (oder besser skaliert). Dies führt zu ungeraden Längen für jede Waage. Es gibt jedoch redundante Wavelet-Implementierungen, die "ein Rechteck-Array" von Koeffizienten ergeben, mit denen Sie arbeiten können. Die bekanntesten Schemata werden unter verschiedenen Namen bezeichnet: verschiebungsinvariante oder zeitinvariante Wavelets , undezimierte Wavelets, stationäre Wavelet-Transformation(SWT), und manchmal schleudern. Die Standardrekonstruktion umfasst Schritte, die der Überlappungsaddition ähneln, mit der Ausnahme, dass sie aufgrund der unterschiedlichen Abtastfaktoren über Skalen hinweg "eingebettet" sind. Sie können sie mit jedem diskreten Wavelet aus einer Bibliothek verwenden oder sogar ein eigenes Wavelet entwerfen. Der Grund dafür ist, dass diskrete Standard-Wavelets nicht redundant ausgelegt wurden, wodurch die Auswahl der Wavelets eingeschränkt wird. Mit der Redundanz steigt die Auswahl an Wavelets, da die zu erfüllenden Einschränkungen weniger streng sind. Der "ultimative" Avatar ist die kontinuierliche Wavelet-Transformation, die "fast" jedes Wavelet mit inverser Synthese zulässt. Mein letzter Satz ist ziemlich mies, ich hoffe, Sie haben die Bedeutung: Wenn eine quadratische Matrix invertierbar ist, hat sie nur eine Inverse. Wenn eine "rechteckige" Matrix verallgemeinert links-invertierbar ist,
Es scheint eine Python-Implementierung der stationären Wavelet-Transformation zu geben . Einige Referenzen finden Sie in der 2.3.4. Kapitel "Translation Invariant Wavelets" des verlinkten Papiers .
In der Praxis (Geophysik, zerstörungsfreie Prüfung, Ultraschall, Vibrationen) ist es in der Regel wesentlich robuster zum Aufspüren, Entrauschen oder Wiederherstellen.
quelle
Der Grund, warum Sie für die Filterung mit der Kurzzeit-Fourier-Transformation eine Überlappungsaddition / Überlappungsspeicherung benötigen, ist im Grunde, dass die Basisfunktionen, die mit den Koeffizienten verknüpft sind, die Sie erhalten, über einen bestimmten Zeitbereich definiert sind (im Gegensatz zu einem einzelnen Zeitpunkt). Die Fourier-Transformation, die Sie zur Berechnung der Expansionskoeffizienten verwenden, implementiert auch die Faltung in einem kreisförmigen Bereich, der durch Ihre Signalrahmenlänge definiert ist. Das heißt, die beiden Endpunkte des Rahmens werden wirklich identifiziert und in einem Kreis geschlossen. Aus diesem Grund müssen Sie sicherstellen, dass die Basisfunktionen der von Ihnen bearbeiteten Koeffizienten niemals beide Enden des Rahmens durch Umlauf beeinflussen.
Wavelets sind weder Zeitverschiebungseigenvektoren noch werden sie unter Verwendung einer Kreisfaltung berechnet. Dies bedeutet, dass Sie weder das Hinzufügen oder Speichern von Überlappungen noch andere Methoden benötigen, die sich mit den Nebenwirkungen der Kreisfaltung befassen. Stattdessen sind die Wavelet-Basisvektoren nur eine mögliche Basis, um Ihr Signal zu beschreiben. Die (vollständige, diskrete, möglicherweise orthogonale) Wavelet-Transformation ist daher nichts anderes als ein Basiswechsel von der Zeitdomänenbasis zur Wavelet-Domänenbasis. Basisänderungen können invertiert werden (durch Anwenden der Inversen der Basisänderungsmatrix, die Sie dorthin gebracht hat), und Sie können zurück in den Zeitbereich wechseln.
Die von Ihnen angegebenen Parameter für Fenstergröße, Überlappung und Abtastrate gelten nicht für die Wavelet-Transformation. Das einzige, was Sie brauchen, ist eine Mutter Wavelet. Wenn Sie die Ergebnisse mit Ihrer STFT-Ausgabe vergleichen möchten, können Sie einen beliebigen STFT-Basisvektor (dh Ihr Fenster multipliziert mit einem komplexen Exponentialträger) als Wavelet-Prototyp auswählen. Dann wenden Sie die schnelle Wavelet-Transformation an, die Ihr Signal in einen Baum aus hoch- und tiefpassgefilterten und dezimierten Signalen zerlegt, die letztendlich zu Ihren Koeffizienten werden. Jeder Koeffizient ist einem Wavelet-Basisvektor und seinen Parametern (Skala, Zeit) oder (Frequenz, Zeit) zugeordnet. Sie können die Koeffizienten manipulieren und dann die inverse diskrete Wavelet-Transformation anwenden. Es nimmt Ihre Koeffizienten und führt sie durch eine Resynthesefilterbank, um wieder ein Signal zu erzeugen.
Diese Prozesse sind nicht trivial und für einen Anfänger möglicherweise schwer zu verdauen. Sie sollten jedoch in der Lage sein, Bibliotheken / Toolboxes für die Plattform Ihrer Wahl zu finden, die die schnelle Wavelet-Transformation und ihre Inverse implementieren. Wenn Sie jedoch Ihre eigene Wavelet-Basis realisieren möchten, müssen Sie die Filterkoeffizienten für die Zerlegungs- und Synthesefilterbanken ableiten. Das erfordert eine tiefe Theorie, und Sie müssen sie wahrscheinlich zuerst studieren.
Es gibt andere Arten der Wavelet-Transformation, nämlich die kontinuierliche Wavelet-Transformation, die auf einer übervollständigen Basis arbeitet. Es ist sowohl langsamer zu berechnen als auch schwerer zu invertieren, sodass es derzeit keine Option für das ist, was Sie tun möchten.
quelle
Audio sound -> Wavelet transform -> (do something on the array) -> Inversion -> Audio output
. Ich bin sicher, dass ich mit viel (etwas auf dem Array tun) ein bisschen mehr verstehen werde, wie Wavelet funktioniert.Es gibt viele Möglichkeiten, eine Wavelet-Basis zu definieren. In der Regel sieht ein Wavelet folgendermaßen aus:
Dabei ist die Zeitmitte, k 0 die Frequenzmitte und e eine Fensterfunktion. A absorbiert die Phase und Normalisierung. Der Hauptunterschied zu Ihrer STFT besteht darin, dass die Breite des Fensters von k abhängt .x0 k0 e A k
Da die Dimensionalität der transformierten Daten die des Signals übersteigt, ist die Wavelet-Basis nicht orthonormal. Dh folgendes wird falsch sein:
Mit anderen Worten, Sie können das Signal perfekt rekonstruieren, indem Sie nur die Wavelets addieren, aus denen es besteht.
Ihre "Modifikation" kann einfach in die obige Summe eingefügt werden:
Update 2013-11-19: Hinzufügen von Implementierungsdetails wie gewünscht.
Das Abschneiden von Spektren führt manchmal zu Normalisierungsproblemen, je nachdem, wie genau Ihre FFT definiert ist. Ich werde hier nicht alle Möglichkeiten abdecken. Normalisierung ist grundsätzlich ein einfaches Problem. ;-)
quelle