IDFT oraz IFFT - odwrócona transformata Fouriera po okienkowaniu

0

Witam,
mam pytanie chyba bardziej matematyczne niż programistyczne, ale jednak dotyczy mojego kodu w C++

Napisałem sobie program do liczenia DFT i jestem w trakcie pisania programu do liczenia FFT.

Ale już myślę, a nawet częściowo zaimplementowalem, odwrotność tych funkcji, czyli IDFT oraz IFFT.

I dla zwykłych sinusoid (o pełnym przebiegu) fajnie to wychodzi, wszystko wydaje się cacy. Ale kiedy mam sinusoidy o niepełnym przebiegu, to normalne, że zaczynają się przecieki, wtedy wyniki mojej IDFT wyglądają dziwnie. Próbowałem oczywiście okienkowania - standardowego Hanna - ale to nic nie daje.

Oczywiscie przy okienkowaniu wyniki DFT są super (mówię o spectrum), wszystko git, ale już przy inwersji zaczyna wszystko się sypać. I dla mnie to jest nawet logiczne, bo przecież stosując okienkowanie, do DFT wysyłamy tak naprawdę lekko okrojony materiał (na początku próbkowania i na końcu), więc skoro podajemy DFT okrojony materiał, to i do inwersji wchodzi okrojony. A zatem zastanawiam się jak go przed IDFT "od okroić" :)

Czytałem, że się stosuje nakładanie badanych okienek (overlaping) jeszcze nie wiem jak to zrobic, ale wydaje mi się, że kumam ideę. Jednak mam wrażenie, że u mnie mimo wszystko chodzi o coś innego, gdyż:

jak okroję materiał za pomocą okienka Hanna to wyciszam materiał na poczatku i na końcu próbkowania - dla uproszczenia przyjmijmy, że jest to ksztalt paraboli z ramionami w dół.
Jednak po inwersji, mój sygnal wygląda odwrotnie, tzn. na początku i na końcu mam sygnał o najwyższej amplitudzie, a w srodku jest wyciszony - takie odwrotne okienko Hanna (parabola z ramionami do góry).
Jak na to zaradzic? Jak "od okroić" materiał przed poddaniem go inversji? A moze to zrobic juz po inwersji, ale jak ?

0

Hej,
kurcze i nikt nic na ten temat? Bo ja juz walcze z tym chyba trzeci tydzien i niedlugo sie chyba pochlastam, bo co mi pozostalo? :)

0

Koło 7 rano napisałem Ci odpowiedź, ale coś się widocznie zbiesiło...

Generalnie funkcja okna jest nieodwracalna.

Krótko: pytanie nr 1: czy FFT i IFFT bez funkcji okna daje odpowiedni wynik? Bo cudów nie ma.
Pyt.2: co z tym sygnałem potem jeszcze robisz w dziedzinie częstotliwości, tj. przed powrotem do dziedziny czasu?

Literatura: ;)
https://se.mathworks.com/matlabcentral/newsreader/view_thread/81418
https://se.mathworks.com/matlabcentral/newsreader/view_thread/169570
https://stackoverflow.com/questions/7337709/why-do-i-need-to-apply-a-window-function-to-samples-when-building-a-power-spectr

0

Hej wielkie dzieki za odpowiedź i to o 7 rano :)

A co robię z sygnałem w dziedzinie częstotliwości? W ramach testów nic nie robię :)

Na razie po prostu próbuje przekonwertować fale za pomoca DFT, a następnie dokonać inwersji.

I jak pisalem, dla fali o pełnym przebiegu, wszystko śmiga, ale jak już mam falę, która się kończy w np. jednej trzeciej okresu, to wtedy ta fala pochodząca z inwersji wygląda dziwnie (na początku i na końcu ma najwyższą amplitude, a w środku się zwęża do zera), to pewnie przez te przecieki. Ale jak je wyeliminować, skoro po obróbce oknem Hanna taka fala już jest (jak podejrzewałem) nieodwracalna?

I do czego w takim razie stosuje się okienka Hanna, tylko do analizy? A już obróbki nie można robić? Bo po co robić obróbkę, skoro i tak właściwy sygnał jest już nie odwracalny.

W dalszej perspektywie oczywiście chcę obrobić sygnał w dziedzinie częstotliwości i taki obrobiony sygnał, chcę przekonwertować z powrotem do dziedziny czasu. Nic specjalnego, chcę tylko obciąć delikatnie dolne i górne pasma (tzw. high-pass i low-pass filters). I powiem więcej: to również już mi się udało zrobić, ale wciąż tylko dla fali o pełnym okresie (lub całkowitej wielokrotności), a przy niepełnym okresie, już uzyskuję nie tylko przefiltrowany materiał, ale zarazem, główny sygnał zniekształcony.

0

Przeciek bierze się stąd, że założeniem DFT/FFT jest właśnie okresowość sygnału. Okno go ogranicza, ale powoduje częściową utratę danych.

I z tego właśnie powodu filtrowanie przeprowadza się typowo w dziedzinie czasu :)

0
pajczur napisał(a):

Hej wielkie dzieki za odpowiedź i to o 7 rano :)

A co robię z sygnałem w dziedzinie częstotliwości? W ramach testów nic nie robię :)

Na razie po prostu próbuje przekonwertować fale za pomoca DFT, a następnie dokonać inwersji.

I jak pisalem, dla fali o pełnym przebiegu, wszystko śmiga, ale jak już mam falę, która się kończy w np. jednej trzeciej okresu, to wtedy ta fala pochodząca z inwersji wygląda dziwnie (na początku i na końcu ma najwyższą amplitude, a w środku się zwęża do zera), to pewnie przez te przecieki. Ale jak je wyeliminować, skoro po obróbce oknem Hanna taka fala już jest (jak podejrzewałem) nieodwracalna?

I do czego w takim razie stosuje się okienka Hanna, tylko do analizy? A już obróbki nie można robić? Bo po co robić obróbkę, skoro i tak właściwy sygnał jest już nie odwracalny.

W dalszej perspektywie oczywiście chcę obrobić sygnał w dziedzinie częstotliwości i taki obrobiony sygnał, chcę przekonwertować z powrotem do dziedziny czasu. Nic specjalnego, chcę tylko obciąć delikatnie dolne i górne pasma (tzw. high-pass i low-pass filters). I powiem więcej: to również już mi się udało zrobić, ale wciąż tylko dla fali o pełnym okresie (lub całkowitej wielokrotności), a przy niepełnym okresie, już uzyskuję nie tylko przefiltrowany materiał, ale zarazem, główny sygnał zniekształcony.

Czyli chcesz sobie po prostu powycinać wybrane częstotliwości, i obejrzeć wykres sygnału "na oko"?
Nie dziw się że może wyglądać zupełnie inaczej, bo obserwowany kształ sygnału najczęściej nie ma żadnego znaczenia.
Czy to ma być związane z obróbką dźwięku czy innych sygnałów?

0
alagner napisał(a):

Przeciek bierze się stąd, że założeniem DFT/FFT jest właśnie okresowość sygnału. Okno go ogranicza, ale powoduje częściową utratę danych.

I z tego właśnie powodu filtrowanie przeprowadza się typowo w dziedzinie czasu :)

O kurcze to mnie zabiłeś :) A jak odfiltrować niechciane czestotliwosci w dziedzinie czasu?

0
Radek__ napisał(a):

Czyli chcesz sobie po prostu powycinać wybrane częstotliwości, i obejrzeć wykres sygnału "na oko"?
Nie dziw się że może wyglądać zupełnie inaczej, bo obserwowany kształ sygnału najczęściej nie ma żadnego znaczenia.
Czy to ma być związane z obróbką dźwięku czy innych sygnałów?

Tak właśnie chcę sobie powycinać niechciane częstotliwości i obejrzeć sygnał na oko :) , ale też chcę odczytać glówną częstotliwość (coś jak tuner do gitary) wiem, że do działania tunera gitarowego, nie potrzebuję z powrotem dokonywać inwersji, ale już do obejrzenia wynikowego sygnału w dziedzinie czasu potrzebuję.
Piszesz, że obserwowany kształt sygnału nie ma znaczenia, ale ja w ramach prób generuję sobie zwykłą sumę trzech sinusoid (o wysokies, niskiej i średniej częstotliwości i różnych amplitudach). I ta fala - wydaje mi się - że bez żadnej obróbki powinna być taka sama na wejsciu i na wyjściu, przecieŻ o to chyba chodzi w transformacji fouriera, ktora oczywiscie zaklada pelen okres, ale przecieŻ w rzeczywistosci takie idealne fale się raczej rzadko zdażają, więc jak z tego fouriera korzystać. przecieŻ istnieją equalizery i inne zabawki, jak oni to robią. Rozumiem, ze fala wynikowa może być przesunięta w fazie, ale u mnie te różnice w amplitudzie. I tak jak pisalem problem jest tylko kiedy mam niepelen okres fali.

0

Acha i przepraszam za ortografie, pisze na kolanie i w pospiechu bom w pracy i szef przez ramie zaglada :)

0

Szukaj pod hasłem splot, ang. convolution. Transmitancja filtru (ang. transfer function) to w dziedzinie czasu odpowiedź impulsowa (impulse response). Po konkretne techniki odsyłam do haseł overlap-add i overlap-save.

Z literatury polecam:
Digital Signal Processing, R. Schafer, A. Oppenhiem
DAFX, U. Solzer
Cyfrowe przetwarzanie sygnałów, T. Zieliński

EDIT: equalizery to właśnie filtry pasmowo-przepustowe pracujące w dziedzinie czasu, typowo FIR.
Nie jestem pewny wiem jak działa tuner gitarowy, ale z tego co wiem nie potrzebujesz do niego rekonstruować sygnału, jedynie go analizować, więc okienkowanie nie będzie przeszkadzać. O ile oczywiście jest on oparty na FFT; mogę się mylić, ale w teorii równie dobrze mógłby zadziałać filtr BP + detektor amplitudy.

0

Dzięki Alanger za propozycję, na pewno obczaję.

0

Kurde świetny link, ale właśnie się zawalił cały mój świat, a przynajmniej ten związany z FFT :)
Muszę przebrnąć przez to wszystko

1 użytkowników online, w tym zalogowanych: 0, gości: 1