Transformata Fouriera
Re: Transformata Fouriera
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.
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.
Re: Transformata Fouriera
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.
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.
Re: Transformata Fouriera
...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 :)
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 :)
Re: Transformata Fouriera
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.
**********************
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.
Re: Transformata Fouriera
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).
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).
Re: Transformata Fouriera
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.
**********************
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.
Re: Transformata Fouriera
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.
**********************
Dlaczego? Bo nie rozumiem.
Re: Transformata Fouriera
(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)?
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)?
Re: Transformata Fouriera
(dlaczego nie można edytowac postów?... :( )
Czy F[n-i] jest jest czasem zależna od F[i] (i przeciwnie)?
Czy F[n-i] jest jest czasem zależna od F[i] (i przeciwnie)?
Re: Transformata Fouriera
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.
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.