STFT i DWT (falki)

12

STFT może być z powodzeniem stosowany do danych dźwiękowych (na przykład z plikiem dźwiękowym .wav) w celu dokonania pewnych modyfikacji w dziedzinie częstotliwości (na przykład: usuwanie szumów).
Z N=441000(to jest 10 sekund przy szybkości próbkowania fs=44100) windowsize=4096, overlap=4, STFT wytwarza approximatively w 430x4096tablicy (I współrzędnych: czasie, drugiej współrzędnej bin częstotliwość). Można modyfikować tę tablicę, a rekonstrukcję można wykonać za pomocą funkcji overlap-add (*).

Jak można zrobić podobnie z falkami ? (DWT), tj. Uzyskać podobną tablicę kształtu a x bz aramami czasowymi i bprzedziałami częstotliwości, czy wprowadzić pewne modyfikacje w tej tablicy, a na końcu odzyskać sygnał? W jaki sposób ? Co to jest odpowiednik falki do nakładania-dodawania ? Jakie byłyby tutaj funkcje Pythona (nie znalazłem łatwego przykładu modyfikacji audio za pomocą pyWavelets...)?

(*): Oto framework STFT, którego można użyć:

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

Celem jest znalezienie podobnej struktury z falkami.

Basj
źródło
Dodatkowy komentarz: takie „filtrowanie” na STFT to naprawdę zły pomysł. To nie jest świetny sposób na robienie większości rzeczy, które naprawdę chcesz robić. Co tak naprawdę próbujesz osiągnąć?
Peter K.
Zauważ, że PyWavelets są przeznaczone tylko do dyskretnej transformaty falkowej. Jeśli chcesz robić rzeczy podobne do STFT, łatwiej zrozumiesz ciągłą transformację falkową, taką jak stała transformata Q, która jest transformacją Gabora, zasadniczo to samo, co złożona ciągła transformata falkowa Morleta , ale została zaprojektowana tak, aby była odwracalna: grrrr.org/research/software/nsgt
endolit
1
(pytanie to odnowione przez „Społeczność”). moim zdaniem falki nakładają się i dodają w sposób bardzo podobny do STFT. więc nie do końca rozumiem charakter pytania.
Robert Bristol-Johnnson
Czy potrzebne są dodatkowe szczegóły?
Laurent Duval,

Odpowiedzi:

4

Krótkotrwała transformata Fouriera jest generalnie transformacją redundantną, zwykle implementowaną z tym samym podpróbkowaniem dla każdej częstotliwości. Jeśli okno jest dobrze wybrane, jest kompletne: możesz je odwrócić i odzyskać dowolny sygnał początkowy.

Ponieważ jest zbędny i kompletny, ma wiele doskonałych odwrotności. Można to zaimplementować i zrozumieć przy użyciu bardziej ogólnych narzędzi: (nadpróbkowanych) złożonych banków filtrów. Podany typ i długość okna plus zakładka zapewnia bank filtrów analizy, dla którego można obliczyć, czy jest on odwracalny, czy nie. Jeśli tak, możesz obliczyć odwrotność naturalną i zoptymalizowane odwrotności . Nakładanie-dodawanie jest tylko jednym z wielu potencjalnych odwrotności, prawdopodobnie najbardziej powszechnym, co często ogranicza wybór okna.

Standardowe dyskretne transformaty falkowe są również bankami filtrów, z tą różnicą, że podpróbkowanie nie jest takie samo w każdym paśmie częstotliwości (lub bardziej odpowiednio skalowane). To zmienia się w nierówne długości dla każdej skali. Istnieją jednak nadmiarowe implementacje falkowe, które dają „prostokątną tablicę” współczynników, z którymi można pracować. Najbardziej znane schematy nazywane są pod różnymi nazwami: falki niezmienne lub niezmienne w czasie, falki nieokreślone, stacjonarna transformacja falkowa(SWT), a czasem wirowanie cykliczne. Jego standardowa rekonstrukcja obejmuje kroki podobne do nakładania-dodawania, z tym że są one bardziej „osadzone” ze względu na różne współczynniki próbkowania w różnych skalach. Możesz używać ich z dowolnymi dyskretnymi falkami z biblioteki, a nawet projektując własne falki. Powodem jest to, że standardowe dyskretne falki zostały zaprojektowane z myślą o braku nadmiarowości, co ogranicza wybór falek. Dzięki redundancji zwiększa się wybór falki, ponieważ ograniczenia do spełnienia są mniej rygorystyczne. „Ostateczny” awatar to ciągła transformacja falkowa, która dopuszcza „prawie” każdą falę odwrotną do syntezy. Moje ostatnie zdanie jest dość kiepskie, mam nadzieję, że rozumiesz: kiedy odwrócona matryca jest odwracalna, ma tylko jedną odwrotność. Gdy „prostokątna” matryca jest odwracalna w lewo w uogólniony sposób,

Wydaje się, że istnieje stacjonarna transformata falkowa w języku Python . Możesz znaleźć kilka referencji w 2.3.4. Tłumaczenie niezmiennych falek rozdział powiązanego dokumentu .

Jest ogólnie znacznie bardziej odporny na wykrywanie, odszumianie lub odtwarzanie w praktycznych zastosowaniach (geofizyka, badania nieniszczące, ultradźwięki, wibracje).

Laurent Duval
źródło
„Nadmiarowe” znaczenie „ma więcej informacji na wyjściu niż jest to konieczne do odtworzenia danych wejściowych”?
endolith,
1
Dokładnie. Generalnie dla -sample sygnału, można uzyskać M > N współczynników po transformacji. Oznacza to, że możesz użyć tego dla swojej korzyści. Na przykład dostajesz kilka potencjalnych odwrotności, niektóre są bardziej praktyczne niż inne. Co ważniejsze, podczas przetwarzania w dziedzinie transformacji (ulepszanie, wykrywanie, odszumianie, filtrowanie adaptacyjne, przywracanie, dekonwolucja, separacja źródeł) zyskujesz solidność i niższą wrażliwość na szum. Wynika to z dodatkowej „różnorodności” w przekształconych danych. Przy właściwym użyciu tylko ...NM>N
Laurent Duval,
3

Powodem, dla którego potrzebujesz nakładania dodawania / zapisywania nakładania do filtrowania z krótkim czasem transformacji Fouriera, jest w zasadzie to, że funkcje podstawowe związane z otrzymanymi współczynnikami są zdefiniowane w pewnym przedziale czasowym (w przeciwieństwie do jednego punktu w czasie). Transformacja Fouriera, której używasz do obliczania współczynników rozszerzenia, implementuje również splot w domenie kołowej zdefiniowanej przez długość ramki sygnału. Oznacza to, że dwa punkty końcowe ramki są naprawdę zidentyfikowane i zamknięte w okręgu. Dlatego musisz się upewnić, że podstawowe funkcje edytowanych współczynników nigdy nie wpływają na oba końce ramki, zawijając.

Falki nie są wektorami własnymi translacji w czasie, ani nie są obliczane przy użyciu splotu kołowego. Oznacza to, że nie potrzebujesz nakładania dodawania lub zapisywania ani żadnych innych metod radzenia sobie z efektami ubocznymi splotu kołowego. Zamiast tego wektory falkowe są po prostu możliwą podstawą do opisania twojego sygnału. (Kompletna, dyskretna, być może ortogonalna) transformacja falkowa jest zatem niczym innym jak zmianą podstawy z bazy w dziedzinie czasu na bazę w dziedzinie falkowej. Podstawowe zmiany można odwrócić (stosując odwrotność macierzy zmian podstawowych, które cię tam dostarczyły) i możesz wrócić do dziedziny czasu.

Parametry podane jako rozmiar okna, nakładanie się, częstotliwość próbkowania nie mają zastosowania do transformaty falkowej. Jedyne, czego potrzebujesz, to falka matki. Jeśli chcesz porównać wyniki z wynikiem wyjściowym STFT, możesz wybrać dowolny z wektorów podstawowych STFT (tj. Okno pomnożone przez złożoną nośną wykładniczą) jako prototyp falkowy. Następnie zastosujesz szybką transformatę falkową, która rozłoży twój sygnał na drzewo sygnałów filtrowanych i zdziesiątkowanych górno i dolnoprzepustowo, które ostatecznie staną się twoimi współczynnikami. Każdy współczynnik jest powiązany z wektorem podstawowym falki i jego parametrami (skala, czas) lub (częstotliwość, czas). Możesz manipulować współczynnikami, a następnie zastosować odwrotną dyskretną transformatę falkową. Weźmie twoje współczynniki i przepuści je przez zestaw filtrów resyntezy, aby ponownie wygenerować sygnał.

Procesy te nie są trywialne i być może trudne do strawienia dla początkującego. Ale powinieneś być w stanie znaleźć biblioteki / zestawy narzędzi dla wybranej platformy, które implementują szybką transformację falkową i jej odwrotność. Jeśli jednak chcesz zrealizować własną bazę falkową, będziesz musiał uzyskać współczynniki filtrów dla banków filtrów dekompozycji i syntezy. Wymaga to głębokiej teorii i prawdopodobnie będziesz musiał ją najpierw przestudiować.

Istnieją inne smaki transformaty falkowej, a mianowicie ciągła transformata falkowa, która działa w oparciu o nadmierną liczbę podstaw. Jest zarówno znacznie wolniejszy do obliczenia, jak i trudniejszy do odwrócenia, więc obecnie nie jest to opcja dla tego, co chcesz zrobić.

Jazzmaniac
źródło
1
Dzięki za odpowiedź. Głównym powodem, dla którego próbuję mieć strukturę kodu, jest to, że zawsze zauważyłem (od dzieciństwa do kilku lat temu, kiedy skończyłem doktorat (oczywiście nie związane z DSP, jeśli tak, to nie pytałbym więc pytania dla początkujących!)) jest takie, że manipulowanie jakimś materiałem z prawdziwego życia (na przykład sygnał audio w DSP) bardzo pomaga zrozumieć głęboką teorię. Co chciałbym kod jest: Audio sound -> Wavelet transform -> (do something on the array) -> Inversion -> Audio output. Z dużą ilością (zrób coś na tablicy), jestem pewien, że zrozumiem trochę więcej, jak działa falka.
Basj
1
@Basj, to zrób tak, jak powiedziałem. Znajdź bibliotekę Python obsługującą zarówno szybką transformację falkową, jak i jej odwrotność, a następnie baw się wygenerowanym drzewem współczynników. Powodzenia i miłej zabawy!
Jazzmaniac,
„nie wszystkie dotyczą transformacji falkowej”. Dotyczy to CWT, prawda?
endolith,
1

Istnieje wiele sposobów definiowania podstawy falki. Zazwyczaj falka wygląda mniej więcej tak:

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

x0k0eAk

Zwykle używa się dyskretnych punktów (x0,k0)(x0,k0)

Ponieważ wymiarowość transformowanych danych przekracza wymiar sygnału, podstawa falkowa nie będzie ortonormalna. Tzn. Następujące będą fałszywe:

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

Aw

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

Innymi słowy, możesz idealnie zrekonstruować sygnał, po prostu dodając jego składowe falki.

Swoją „modyfikację” można po prostu wstawić do powyższej sumy:

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

Aktualizacja 19.11.2013: Dodawanie szczegółów implementacji poniżej zgodnie z życzeniem.

f(x)

dox0,k0=wx0,k0|fa

k0dox0,k0x0fafaw0,k0dox0,k0

  • fafa^
  • k01/4
    • fa^w^0,k0
    • [kl,kr)w^0,k0
    • Zastosuj do tego odwrotną transformatę Fouriera.
    • mixp(jaxkl+kr2))dox0,k0x0

k0x0w0,k0k0k0

dox0,k0k0

Widma obcięcia czasami powodują problemy z normalizacją, w zależności od dokładnego zdefiniowania FFT. Nie podejmę tutaj próby wykorzystania wszystkich możliwości. Normalizacja jest w zasadzie łatwym problemem. ;-)

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

w^x0,k0=ZAmixp(-ja(k-k0)x0)mixp(-(Qlosol(k/k0))2))

QZAk0

apt1002
źródło
1
Dziękuję za przypomnienie tych ważnych punktów dotyczących teorii falek, które są rzeczywiście niezbędne, aby zrozumieć, jak to działa. Ale tutaj pytanie dotyczyłoby raczej zbudowania kodu ramowego, który działałby na przykład na sygnale audio. Pytania są następujące: jak radzić sobie z tymi nieskończonymi sumami, jak wybrać okna (a raczej falkę macierzystą ), jak to zrobić za pomocą pyWavelets w Pythonie (lub innym równoważnym języku, przetłumaczę na Python wtedy), jak wybierz parametry (jak w moim przykładzie dla audio: częstotliwość próbkowania = 44100, FFT okna = 4096, nakładanie = 4 itd)
Basj
zakk|kzakk|=jare
K.
zakzakfa
1
Najlepszym sposobem, aby sprawdzić, czy to działa, czy nie, jest podanie minimalnego przykładu kodu (na przykład pyWavelet powinno to być możliwe w kilku liniach, jakie sobie wyobrażam) (zrobię to dobrze, gdy to zrozumiem, myślę, że potrzebuję jeszcze kilku dni, aby przeczytać o falach!)
Basj,