Transformata Fouriera

Jeśli chcesz zasięgnąć rady, podzielić się doświadczeniem w trudnej sztuce samodzielnego programowania - to tu jest miejsce, aby tego dokonać.
Krizz
Posty: 263
Rejestracja: sobota 09 lis 2002, 00:00
Kontakt:

Re: Transformata Fouriera

Post autor: Krizz » niedziela 25 cze 2006, 09:34

Nie wyjaśniłeś JAKI dokładnie algorytm FFT i w jakiej implementacji został tu użyty
Cooley-Tukey pobierający próbki typu zespolonego (nie ma takiego typu w Javie, ale odpowiednia klasę zaimplemenowal autor FFT. Ja konwertuję typy double na complex poprzez podzielenie typów double w pary, z których pierwsza wartość bedzie uzyta jako re a druga jako im; odwrotna konwersja analogicznie jest przeciwieństwem pierwszej). Co do symetryczności FFT, po dokonaniu tranformaty robię przeplot w ten sposób (oznaczmy nowa tablice jako h2[], a stara jako h1[]):
h2[0]=h1[0]
h2[1]=h1[n-1]
h2[2]=h1[1]
h2[3]=h1[n-2]
itd.

nie napisałeś JAK dokładnie modyfikujesz prążki FFT ("jakis filtr" to trochę za mało)
Np. dolnoprzepustowy - wyzerowanie wszystkich wartości powyżej połowy tablicy. Może nie ma to nic wspólnego z emulacją filtrów analogowych, ale dla testu wystarcza.

nie mówiąc już o pokrętnym oznaczeniu zmiennych (np. x[1] to dla mnie drugi licząc od zera element wektora czyli skalar)
Oj czepiasz się :)


Dziesiątki książek opisujących technikę ola i rzesze programistów, którzy to zaimplementowali nie mogą się mylić....
Mam nadzieję... zakładam że gdzies popełniłem błąd.

senjin
Posty: 405
Rejestracja: poniedziałek 26 wrz 2005, 00:00
Kontakt:

Re: Transformata Fouriera

Post autor: senjin » niedziela 25 cze 2006, 12:21

jeśli dobrze zrozumiałem MB, to część rzeczywista transformaty powinna być parzysta, a urojona nieparzysta (przyjmując 0 - oś symetrii - w środku tablicy z transformatą). więc wystarczy modyfikować tylko elementy 1 do n/2 transformaty, a drugą połowę odtworzyć z zależności

f[i] = f[n-i]*

gdzie * to sprzężenie zespolone... czyli odwrócenie znaku części urojonej.

ale jeśli dobrze zrozumiałem twój algorytm Krizz, to dla filtra z zerowaniem dolnych prążków transformaty, to powinno być ok (jeśli zerujesz parzystą liczbę elementów). i jak rozumiem po wszystkich operacjach odwracasz ten "przeplot"?

niestety póki co mam sesję, dopiero we wtorek najwcześniej będę miał okazję sprawdzić jak to działa.

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

Re: Transformata Fouriera

Post autor: Krizz » niedziela 25 cze 2006, 20:40

...jeśli dobrze zrozumiałem MB, to część rzeczywista transformaty powinna być parzysta, a urojona nieparzysta (przyjmując 0 - oś symetrii - w środku tablicy z transformatą). więc wystarczy modyfikować tylko elementy 1 do n/2 transformaty, a drugą połowę odtworzyć z zależności
Nie dokonuję żadnych operacji filtra na liczbach zespolonych. Po uzyskaniu wyniku z fft najpierw konwertuję tablicę complex do tablicy double, potem dokonuję "desymetryzacji" (czyli owego przeplotu), a potem dopiero bawię się filtrami.

ale jeśli dobrze zrozumiałem twój algorytm Krizz, to dla filtra z zerowaniem dolnych prążków transformaty, to powinno być ok
Jesli chodzi o traktowanie liczb zespolonych to robię to dobrze, bo inaczej uzyskiwałbym jakiś szum na wyjściu. Dowodem na to jest to, że przy ominięciu operacji filtracji, czyli zrobieniu pustego przebiegu, na wyjściu dostaję dokładniei to, co na wejściu (no prawie dokładnie, bo odrzucam ostatni ogon, a także ostatni ciąg bitów wejściowych mniejszy niż ustawiony rozmiar fft).

i jak rozumiem po wszystkich operacjach odwracasz ten "przeplot"?
Oczywiście :)

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

Re: Transformata Fouriera

Post autor: MB » poniedziałek 26 cze 2006, 11:14

Np. dolnoprzepustowy - wyzerowanie wszystkich wartości powyżej połowy tablicy. Może nie ma to nic wspólnego z emulacją filtrów analogowych, ale dla testu wystarcza.
**********************
Co rozumiesz przez "powyżej połowy tablicy" ? Czy to nie przypadkiem dokładnie połowa współczynników? Jeśli tak, to moim zdaniem robisz źle, bo zerujesz parzystą liczbę próbek, czyli nie zapewniasz warunku F[i]=F*[n-i]. Nie zapominaj, że prążek F[n-1] nie jest symetrycznym odbiciem F[0], tylko F[1], i tak dalej.

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

Re: Transformata Fouriera

Post autor: Krizz » poniedziałek 26 cze 2006, 13:19

Co rozumiesz przez "powyżej połowy tablicy" ? Czy to nie przypadkiem dokładnie połowa współczynników? Jeśli tak, to moim zdaniem robisz źle, bo zerujesz parzystą liczbę próbek, czyli nie zapewniasz warunku F[i]=F*[n-i]. Nie zapominaj, że prążek F[n-1] nie jest symetrycznym odbiciem F[0], tylko F[1], i tak dalej.
MB, nie czytasz co napisałem... a napisałem że zanim zrobię jakiekolwiek operacje filtracji, przystosowuje tablicę składowych do uzytku, czyli robię przeplot wg powyżej opisanego algorytmu. Potem, kiedy tablica jest gotowa do konwersj spowrotem na próbki w domenie czasu, dokonuję operacji odwrotnej ("symetryzującej" tablicę składowych).

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

Re: Transformata Fouriera

Post autor: MB » poniedziałek 26 cze 2006, 14:19

MB, nie czytasz co napisałem... a napisałem że zanim zrobię jakiekolwiek operacje filtracji, przystosowuje tablicę składowych do uzytku, czyli robię przeplot wg powyżej opisanego algorytmu. Potem, kiedy tablica jest gotowa do konwersj spowrotem na próbki w domenie czasu, dokonuję operacji odwrotnej ("symetryzującej" tablicę składowych)....
**********************
Ależ czytam. Obawiam się, że nie zrozumiałeś mojej uwagi. Bez względu na to, jak sobie zorganizowałeś dane, wyzerowanie dokładnie połowy współczynników jest błędne.

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

Re: Transformata Fouriera

Post autor: Krizz » poniedziałek 26 cze 2006, 19:57

Ależ czytam. Obawiam się, że nie zrozumiałeś mojej uwagi. Bez względu na to, jak sobie zorganizowałeś dane, wyzerowanie dokładnie połowy współczynników jest błędne. ...
**********************
Dlaczego? Bo nie rozumiem.

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

Re: Transformata Fouriera

Post autor: Krizz » poniedziałek 26 cze 2006, 20:02

(dlaczego nie można edytowac postów?... :( )

Czy chodzi o tą sprzężoną? Jakbym miał to zrobić skoro operuję na typach double (a tam sprzężona danej liczby będzie równa jej samej)?

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

Re: Transformata Fouriera

Post autor: Krizz » poniedziałek 26 cze 2006, 20:06

(dlaczego nie można edytowac postów?... :( )

Czy F[n-i] jest jest czasem zależna od F[i] (i przeciwnie)?

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

Re: Transformata Fouriera

Post autor: MB » poniedziałek 26 cze 2006, 20:39

Chodzi po prostu o to, że we wspomnianej symetrii F[0] nie ma swojego "lustrzanego" odpowiednika (bo składowa stała jest jedna!), podobnie jak nie ma pary współczynnik F[n/2] (bo to odpowiada dokładnie fs/2). Te dwa współczynniki wypadają dokładnie na osiach symetrii.

Oto prosty przykład: załóżmy, że n=8. Po FFT mamy więc współczynniki F[0], F[1]... aż do F[7]. W Twoim uporządkowaniu (jak to nazwałeś - przeplocie) ustawiasz je tak: F[0], F[7], F[1], F[6], F[2], F[5], F[3], F[4]
Jeśli teraz wyzerujesz POŁOWĘ, to wytniesz współczynniki F[2], F[5], F[3] i F[4] i to jest właśnie źle, bo skoro F[2]=0, to również F[8-2] powinno być zero. Aby była symetria musisz wyzerować NIEPARZYSTĄ liczbę współczynników FFT.

ODPOWIEDZ