STFT und DWT (Wavelets)

12

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=4produziert STFT approximativ eine 430x4096Anordnung (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 bmit aZeitrahmen und bFrequenzbereichen, 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.

Basj
quelle
Eine Randbemerkung: Diese Art von "Filtern" auf der STFT ist eine wirklich schlechte Idee. Es ist keine großartige Möglichkeit, die meisten Dinge zu tun, die Sie wirklich tun möchten. Was versuchst du eigentlich zu erreichen?
Peter K.
Beachten Sie, dass PyWavelets nur für die diskrete Wavelet-Transformation vorgesehen ist. Wenn Sie STFT-ähnliche Dinge tun möchten, können Sie die kontinuierliche Wavelet-Transformation, wie z. B. die konstante Q-Transformation, die eine Gabor-Transformation ist, die im Wesentlichen mit einer komplexen kontinuierlichen Morlet-Wavelet-Transformation identisch ist , jedoch so konzipiert ist, dass sie funktioniert invertible
endolith
1
(Diese Frage wurde von "Community" wiederbelebt.) Meiner Meinung nach überlappen sich Wavelets und fügen sich auf eine Art und Weise hinzu, die der STFT sehr ähnlich ist. Also verstehe ich die Art der Frage nicht ganz.
Robert Bristow-Johnson
Werden weitere Details benötigt?
Laurent Duval

Antworten:

4

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.

Laurent Duval
quelle
"Redundant" bedeutet "hat mehr Informationen in der Ausgabe als zur Reproduktion der Eingabe notwendig ist"?
Endolith
1
Genau. Im Allgemeinen erhalten Sie für ein Abtastsignal M > N Koeffizienten nach der Transformation. Dies bedeutet, dass Sie dies zu Ihrem Vorteil nutzen können. Zum Beispiel gibt es mehrere mögliche Umkehrungen, von denen einige praktischer sind als andere. Noch wichtiger ist, dass Sie bei der Verarbeitung im Transformationsbereich (Verbesserung, Erkennung, Rauschunterdrückung, adaptives Filtern, Wiederherstellung, Entfaltung, Quellentrennung) Robustheit und geringere Empfindlichkeit gegenüber Rauschen erzielen. Dies ergibt sich aus der zusätzlichen "Diversität" der transformierten Daten. Bei richtiger Anwendung nur ...NM>N
Laurent Duval
3

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.

Jazzmaniac
quelle
1
Danke für deine Antwort. Der Hauptgrund, warum ich versuche, ein Code-Framework zu haben, ist, dass ich es immer bemerkt habe (von meiner Kindheit bis vor ein paar Jahren, als ich meinen Doktor gemacht habe (natürlich nicht DSP-bezogen, wenn ja, würde ich nicht fragen Neue Fragen hier!)) ist, dass das Manipulieren von realem Material (z. B. Audiosignal in DSP) viel zum Verständnis der tiefen Theorie beiträgt. Was möchte ich Code mag , ist: 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.
Basj
1
@Basj, dann mach wie gesagt. Suchen Sie eine Python-Bibliothek, die sowohl die schnelle Wavelet-Transformation als auch deren Inverse unterstützt, und spielen Sie dann mit dem generierten Koeffizientenbaum. Viel Glück und hab Spaß!
Jazzmaniac
"sind alle nicht auf die Wavelet-Transformation anwendbar" Sie sind auf CWT anwendbar, richtig?
Endolith
1

Es gibt viele Möglichkeiten, eine Wavelet-Basis zu definieren. In der Regel sieht ein Wavelet folgendermaßen aus:

wx0,k0(x)=Aexp(ik0x)e(k0(xx0))

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 .x0k0eAk

(x0,k0)(x0,k0)

Da die Dimensionalität der transformierten Daten die des Signals übersteigt, ist die Wavelet-Basis nicht orthonormal. Dh folgendes wird falsch sein:

wk0,x0|wk0,x0=δ(x0,x0)δ(k0,k0)

Aw

x0,k0|wx0,k01k0wx0,k0|=identity

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:

my_filter=x0,k0|wx0,k0f(x0,k0)wx0,k0|

Update 2013-11-19: Hinzufügen von Implementierungsdetails wie gewünscht.

f(x)

cx0,k0=wx0,k0|f

k0cx0,k0x0ffw0,k0cx0,k0

  • ff^
  • k01/4
    • f^w^0,k0
    • [kl,kr)w^0,k0
    • Wenden Sie darauf eine inverse Fourier-Transformation an.
    • exp(ixkl+kr2)cx0,k0x0

k0x0w0,k0k0k0

cx0,k0k0

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. ;-)

w^x0,k0(k)wx0,k0(x)

w^x0,k0=Aexp(i(kk0)x0)exp((Qlog(k/k0))2)

QAk0

apt1002
quelle
1
Vielen Dank, dass Sie sich an diese wichtigen Punkte zur Wavelet-Theorie erinnern, die in der Tat notwendig sind, um zu verstehen, wie es funktioniert. Hier geht es aber eher darum, einen Framework-Code zu erstellen, der beispielsweise für Audiosignale geeignet ist. Die Fragen sind: Wie gehe ich mit diesen unendlichen Summen um, wie wähle ich die Fenster (oder besser Mutter-Wavelet ) aus, wie mache ich das mit pyWavelets in Python (oder einer anderen äquivalenten Sprache, die ich dann in Python übersetze)? Wählen Sie die Parameter (wie in meinem Beispiel für Audio: Abtastrate = 44100, FFT-Fenster = 4096, Überlappung = 4 usw.)
Basj
akk|kakk|=Id
K
akakf
1
Der beste Weg, um zu sehen, ob es funktioniert oder nicht, wäre, ein minimales Codebeispiel bereitzustellen (mit pyWavelet sollte es zum Beispiel in ein paar Zeilen möglich sein, wie ich es mir vorstelle)
Ich