Transformata Fouriera

Jeśli chcesz zasięgnąć rady, podzielić się doświadczeniem w trudnej sztuce samodzielnego programowania - to tu jest miejsce, aby tego dokonać.
senjin
Posty: 405
Rejestracja: poniedziałek 26 wrz 2005, 00:00
Kontakt:

Re: Transformata Fouriera

Post autor: senjin » poniedziałek 26 cze 2006, 23:14

hem, to jakby ktoś nie zauważył, to bzdury napisałem w swoim ostnim poście :)

kupiłem sobie pleconą książkę "cyfrowe przetwarzanie sygnałów" tomasza zielińskiego i mogę ją polecić. wszystko jest dokładnie wyjaśnione, poza tym jest dużo przykładów (i obrazków - wykresów), które ułatwiają zrozumienie. to będzie moja lektura na letnie wieczory ;)

w każdym razie w tej książce jest napisane, że wystarczy modyfikować tylko pierwsze N/2+1 prążków transformaty, a resztę odtworzyć z warunków symetrii i antysymetrii - i chyba w przypadku bardziej złożonych filtrów to jest najwydajniejsza metoda, bo nie robisz 2x tego samego.

Krizz
Posty: 263
Rejestracja: sobota 09 lis 2002, 00:00
Kontakt:

Re: Transformata Fouriera

Post autor: Krizz » poniedziałek 26 cze 2006, 23:42

Nie robilem przeplotu bez powodu... po prostu sądziłem, że tak działa funkcja FFT, że zwraca składowe w tym a nie innym porządku, i że wykonanie przeplotu będzie przywróceniem naturalnej kolejności składowych (tak to jest jak sie nie czyta odpowiedniej literatury...).
Czyli F[0] odpowiada za składową stałą... Czy będę wielkim ignorantem pytając, co w związku z tym oznaczają współczynniki po prawej stronie osi symetrii? W jaki sposób są one związane z ich symetrycznymi odpowiednikami po lewej stronie?
Na matematyce mnie uczono, iż Transformata Fouriera jest funkcją rozkładającą dowolną funkcję na nieskończoną ilość składowych harmonicznych; innymi słowy podstawiając je jako iloczyny funkcji sin i cos w szeregu Fouriera w wyniku otrzymamy oryginalny przebieg. Tak to sobie tłumaczyłem i wydawało mi się to jasne. Ale teraz chyba coś mi sie ta wizja wali... A może za bardzo sobie to uprościłem?

Awatar użytkownika
MB
Posty: 3318
Rejestracja: wtorek 09 kwie 2002, 00:00

Re: Transformata Fouriera

Post autor: MB » wtorek 27 cze 2006, 00:26

...Nie robilem przeplotu bez powodu... po prostu sądziłem, że tak działa funkcja FFT, że zwraca składowe w tym a nie innym porządku, i że wykonanie przeplotu będzie przywróceniem naturalnej kolejności składowych (tak to jest jak sie nie czyta odpowiedniej literatury...).
**********************
I tak i nie. Dla sygnałów wejściowych o wartościach rzeczywistych transformata ma wspomnianą symetrię, co oznacza, że połowa współczynników jest nadmiarowa (nie niesie żadnej dodatkowej informacji), choć jest niezbędna dla prawidłowego odtworzenia sygnału w przekształceniu odwrotnym. W tym kontekście ten "przeplot" jest bezcelowy bo dubluje się te same wartości. Dla sygnału o wartościach zespolonych sprawa jest bardziej skomplikowana, ale zostawmy to na inną dyskusję.


Czyli F[0] odpowiada za składową stałą...
***********************
Wiele nieporozumień związanych z interpretacją wyniku FFT bierze się z nieznajomości założeń przy jakich zdefiniowano to przekształcenie. Ponieważ operujemy na skończonym bloku próbek wejściowych, FFT nie wie nic o tym, co jest poza tym blokiem. Założenie jest takie, że sygnał jest okresowy, a jego okres wygląda dokładnie tak, jak ów blok. F[0] to nic innego jak wartość średnia ze wszystkich próbek w bloku. Gdyby sygnał istotnie był okresowy, wtedy byłaby to też jego składowa stała, ponieważ najczęściej tak nie jest, zatem to tylko lokalne przybliżenie składowej stałej, które może być bardzo niedokładne.


Czy będę wielkim ignorantem pytając, co w związku z tym oznaczają współczynniki po prawej stronie osi symetrii? W jaki sposób są one związane z ich symetrycznymi odpowiednikami po lewej stronie?
***********************
Zacznijmy od tego, że FFT jest operacją dla sygnału dyskretnego, którego widmo jest okresowe (powielone dla każdej wielokrotności fs). O dziwo wynik FFT też jest okresowy z okresem N. Współczynniki na prawo od N/2 to te same współczynniki, które są na lewo od zera, a dokładnie F[N-i]=F[-i]. Zamiast używać współczynników F[0]...F[N-1] równie dobrze można by używać F[-n/2+1]...F[n/2] (z identycznym skutkiem). Zatem pytanie o to, co reprezentują współczynniki dla i>N/2 jest również pytaniem o to, co reprezentują współczynniki dla i<0. Odpowiedź wymaga znajomości wzorów Eulera, które wyrażają funkcje trygonometryczne sin i cos za pomocą exp z urojonym wykładnikiem (tak tak, tego samego exp(-jkn2pi/N), które występuje we wzorze na DFT/FFT). Jeśli sygnał ma się składać z rzeczywistych sinusoid i kosinusoid, to potrzebujemy pary funkcji exp z przeciwnymi wykładnikami, np. 0.5exp(jx)+0.5exp(-jx)=cos(x). Zatem potrzebujemy 2 współczynników o indeksie k i -k, aby złożyć z tego rzeczywisty kosinus.



Na matematyce mnie uczono, iż Transformata Fouriera jest funkcją rozkładającą dowolną funkcję na nieskończoną ilość składowych harmonicznych; innymi słowy podstawiając je jako iloczyny funkcji sin i cos w szeregu Fouriera w wyniku otrzymamy oryginalny przebieg. Tak to sobie tłumaczyłem i wydawało mi się to jasne. Ale teraz chyba coś mi sie ta wizja wali... A może za bardzo sobie to uprościłem?...
***************************
Transformacja Fouriera jest operacją przekształcającą funkcję w jej transformatę. Stwierdzenie o nieskończonej ilości składowych jest prawdziwe dla całkowej transformacji z sygnału ciągłego, nieokresowego. Tymczasem DFT (i jego szybka implementacja - FFT) dotyczy sygnałów dyskretnych (a więc ograniczonych pasmowo, by nie było aliasingu), oraz o ograniczonym czasie trwania (interpretowanym jako skończony okres, o czym wspomniałem wyżej). Nie mamy już więc żadnej nieskończoności - widmo jest ograniczone i dyskretne (bo sygnał okresowy ma tylko przeliczalną liczbę prążków harmonicznych), zatem składa się z dokładnie skończonej liczby drgań. Patrząc na FFT/iFFT jak na zwykłe przekształcenie algebraiczne widzimy wynik FFT będący kombinacją liniową elementów skończonego wektora próbek sygnału, to samo z przekształceniem odwrotnym. Skoro mamy N próbek sygnału, to jest N punktów swobody, zatem zgodnie z zasadami algebry możemy wyliczyć tylko N innych niezależnych zmiennych. Zatem liczba składowych sygnału jest ograniczona dokładnie do N. Co to są za składowe? No cóż, jak już wspominałem, nie są to sinusy ani kosinusy tylko funkcje zespolone typu exp(jkn2pi/N). Dopiero para takich funkcji o przeciwnych k daje pojedyncze drganie harmoniczne o rzeczywistych wartościach.

Krizz
Posty: 263
Rejestracja: sobota 09 lis 2002, 00:00
Kontakt:

Re: Transformata Fouriera

Post autor: Krizz » wtorek 27 cze 2006, 08:52

I tak i nie. Dla sygnałów wejściowych o wartościach rzeczywistych transformata ma wspomnianą symetrię, co oznacza, że połowa współczynników jest nadmiarowa (nie niesie żadnej dodatkowej informacji), choć jest niezbędna dla prawidłowego odtworzenia sygnału w przekształceniu odwrotnym. W tym kontekście ten "przeplot" jest bezcelowy bo dubluje się te same wartości.
Hmm, ciekawe... z początku zauważywszy symetrię, próbowałem modyfikować tylko lewą połowę składowych, a potem kopiowac wynik na prawą stronę - w wyniku otrzymywałem sygnał zdecydowanie niepożądany. No ale nie wiedziałem wtedy o punktach symetrii (F[0] i F[n/2]), czyli modyfikując F[0] analogicznej modyfikacja ulegał F[n-1], a jak rozumiem to był błąd. Z tego co mówisz rozumiem iż modyfikacje powinienem przeprowadzać na zakresie F[0] - F[n/2], przy czym kopiować dla uzyskania symetrii powinienem tylko zakres F[1] - F[n/2 -1] zgodnie z zasadą:
F[n-1] = F[1]
F[n-2] = F[2]
..
F[n/2+1] = F[n/2-1]

Wiele nieporozumień związanych z interpretacją wyniku FFT bierze się z nieznajomości założeń przy jakich zdefiniowano to przekształcenie. (...) Gdyby sygnał istotnie był okresowy, wtedy byłaby to też jego składowa stała, ponieważ najczęściej tak nie jest, zatem to tylko lokalne przybliżenie składowej stałej, które może być bardzo niedokładne.
Nie o to chodzi... Po prostu do tej pory myślałem że F[0] reprezentuje jakąś składową o najniższej częstotliwości... a przeciez zapomniałem że informacje o DC też są przenoszone przez filtry korzystające z FFT, bo jakżeby inaczej :) DC to w końcy też pewna "częstotliwość".
A możesz mi powiedzieć w takim razie, jak najbardziej elegancko rozwiązać w takim razie filtr usuwający DC? Rozumiem, że zerowanie wartości F[0] może mieć bardzo niefajne skutki, bo w związku z tym iż przedstawia ona dosyć niedokładne przybliżenie składowej stałej w całym materiale (bo dotyczy jedynie bloku), sygnał wyjściowy może ulec dosyć sporym zniekształceniom.

Awatar użytkownika
MB
Posty: 3318
Rejestracja: wtorek 09 kwie 2002, 00:00

Re: Transformata Fouriera

Post autor: MB » wtorek 27 cze 2006, 09:36

Z tego co mówisz rozumiem iż modyfikacje powinienem przeprowadzać na zakresie F[0] - F[n/2], przy czym kopiować dla uzyskania symetrii powinienem tylko zakres F[1] - F[n/2 -1] zgodnie z zasadą:
F[n-1] = F[1]
F[n-2] = F[2]
..
F[n/2+1] = F[n/2-1]
********************************
ależ nie! popatrz na poprzednie posty - symetria nie polega na tym, że odpowiadające sobie wartości są identyczne, tylko, że są do siebie sprzężone! Sprzężenie zespolone oznacza przeciwny znak części urojonej, zatem chcąc uzyskać poprawny wynik musisz skopiować
F[n-1].re=F[1].re, F[n-1].im= - F[1].im,
F[n-2].re=F[2].re, F[n-2].im= - F[2].im,
itd...



do tej pory myślałem że F[0] reprezentuje jakąś składową o najniższej częstotliwości... a przeciez zapomniałem że informacje o DC też są przenoszone przez filtry korzystające z FFT, bo jakżeby inaczej :) DC to w końcy też pewna "częstotliwość".
**********************
Poniekąd dobrze myślałeś. Tak, jak napisałem wcześniej, F[0] jest niedokładnym przybliżeniem składowej stałej, wynikającym z uśrednienia tylko N próbek. Efektem tej niedokładności jest to, że oprócz składowej stałej na wartość F[0] mają wpływ również składowe bardzo wolno zmienne, a więc o okresie większym niż długość bloku próbek.




A możesz mi powiedzieć w takim razie, jak najbardziej elegancko rozwiązać w takim razie filtr usuwający DC? Rozumiem, że zerowanie wartości F[0] może mieć bardzo niefajne skutki, bo w związku z tym iż przedstawia ona dosyć niedokładne przybliżenie składowej stałej w całym materiale (bo dotyczy jedynie bloku), sygnał wyjściowy może ulec dosyć sporym zniekształceniom....
**********************
wyzerowanie F[0] w każdym bloku FFT zadziała faktycznie jak filtr górnoprzepustowy, ale skutki będą niefajne, podobnie jak niefajne są skutki wyzerowania wszystkich prążków powyżej połowy pasma. Takie filtry to filtry bardzo ostro tnące i ich zasadniczą wadą są silne zafalowania w odpowiedzi impulsowej - filtr "dzwoni" na częstotliwości równej swojej częstotliwości granicznej. Usuniesz zatem poprawnie składową stałą, ale odpowiedzią na każdy transient będzie bardzo długo ciągnące się tąpnięcie o niskiej częstotliwości. "Grzeczne" filtry mają znacznie bardziej łagodne zbocza i można je otrzymać metodami projektowania filtrów.

Najlepszą metodą usunięcia DC jest zastosowanie prostego rekursywnego filtru górnoprzepustowego o częstotliwości granicznej poniżej 20Hz. Taki filtr łagodnie stłumi niepożądane infradźwięki, a ponieważ jego tłumienie rośnie odwrotnie proporcjonalnie do częstotliwości to dla f=0 dostajesz tłumienie nieskończenie wielkie. Filtr rekursywny musi być zaimplementowany wprost, bo nie da się go zrealizować przez FFT, ale dla niskich rzędów (2 max 3 komórki opóźniające o 1 próbkę) złożoność obliczeniowa będzie mniejsza niż FFT.

Krizz
Posty: 263
Rejestracja: sobota 09 lis 2002, 00:00
Kontakt:

Re: Transformata Fouriera

Post autor: Krizz » wtorek 27 cze 2006, 09:59

ależ nie! popatrz na poprzednie posty - symetria nie polega na tym, że odpowiadające sobie wartości są identyczne, tylko, że są do siebie sprzężone! Sprzężenie zespolone oznacza przeciwny znak części urojonej, zatem chcąc uzyskać poprawny wynik musisz skopiować
F[n-1].re=F[1].re, F[n-1].im= - F[1].im,
F[n-2].re=F[2].re, F[n-2].im= - F[2].im,
itd...

Oj... to co mam zrobić, skoro, jak napisałem wcześniej, podczas filtrowania operuję na typach double a nie complex? Mam pisać filtry operujące na typach complex? W jaki sposób zrealizować filtr np. dolnoprzepustowy na typie complex?
Jak na mój rozum, dany prążek składowej ma pewną wysokość i wystarczy typ double by opisać jego wysokość... po co mi tam wartość im?

Awatar użytkownika
MB
Posty: 3318
Rejestracja: wtorek 09 kwie 2002, 00:00

Re: Transformata Fouriera

Post autor: MB » wtorek 27 cze 2006, 10:14

Oj... to co mam zrobić, skoro, jak napisałem wcześniej, podczas filtrowania operuję na typach double a nie complex? Mam pisać filtry operujące na typach complex? W jaki sposób zrealizować filtr np. dolnoprzepustowy na typie complex?
**********************
jeśli całą "filtrację" sprowadzasz do zerowania prążków to nie musisz, ale jak już napisałem takie brutalne zerowanie daje kiepską odpowiedź impulsową. Operowanie na wartościach zespolonych zamiast stosowania protezy polegającej na binarnym przemapowaniu dwóch liczb w jedną zmienną da Ci możliwość manipulowania tymi współczynnikami znacznie większe niż "jest-nie ma". Bo przecież ta Twoja reprezentacja double nie nadaje się do żadnych obliczeń.


Jak na mój rozum, dany prążek składowej ma pewną wysokość i wystarczy typ double by opisać jego wysokość... po co mi tam wartość im?...
**********************
a faza to pies? Potrzebujesz dwóch wartości liczbowych, żeby określić amplitudę składowej oraz jej fazę. Jeśli zniszczysz informację o fazie, to składowe się poprzesuwają i będziesz miał nieciągłości na krańcach bloków (stuki). Te dwie wartości to część kosinusoidalna (re) i sinusoidalna (im) drgania, zgodnie ze wzorem Eulera: exp(jx)=cos(x)+j.sin(x)

Krizz
Posty: 263
Rejestracja: sobota 09 lis 2002, 00:00
Kontakt:

Re: Transformata Fouriera

Post autor: Krizz » wtorek 27 cze 2006, 10:36

No to ślicznie... muszę przepisać sporą część programu.

Powiedz mi MB, gdybym chciał zrealizować filtr dolnoprzepustowy o łagodnym zboczu, jak mam w ogóle traktować informację o fazie? Czy wystarczy że nie będę w ogóle jej ruszał a modyfikował tylko amplitudę prążka?

Awatar użytkownika
MB
Posty: 3318
Rejestracja: wtorek 09 kwie 2002, 00:00

Re: Transformata Fouriera

Post autor: MB » wtorek 27 cze 2006, 11:08

Powiedz mi MB, gdybym chciał zrealizować filtr dolnoprzepustowy o łagodnym zboczu, jak mam w ogóle traktować informację o fazie? Czy wystarczy że nie będę w ogóle jej ruszał a modyfikował tylko amplitudę prążka?...
**********************
Możesz nie modyfikować fazy, otrzymasz wtedy filtr zerofazowy, czyli taki, który nie wprowadza opóźnienia do żadnej składowej. Takie filtry mają wiele zalet, warto jednak wiedzieć, że brzmią zupełnie nie-analogowo, ponieważ filtry analogowe są z reguły minimalno-fazowe.

Krizz
Posty: 263
Rejestracja: sobota 09 lis 2002, 00:00
Kontakt:

Re: Transformata Fouriera

Post autor: Krizz » wtorek 27 cze 2006, 14:02

Możesz nie modyfikować fazy, otrzymasz wtedy filtr zerofazowy, czyli taki, który nie wprowadza opóźnienia do żadnej składowej. Takie filtry mają wiele zalet, warto jednak wiedzieć, że brzmią zupełnie nie-analogowo, ponieważ filtry analogowe są z reguły minimalno-fazowe....
Akurat mój reduktor szumów nie musi brzmieć analogowo :D (to oczywiście żart, bo nie ma analogowych reduktorów szumu opartych na odejmowaniu spektralnym).
Nie zmęczę Cię za bardzo pytając, jak zazwyczaj się traktuje fazy składowych w filtrach pretendujących do brzmienia analogowego?

ODPOWIEDZ