Transformata Fouriera

Jeśli chcesz zasięgnąć rady, podzielić się doświadczeniem w trudnej sztuce samodzielnego programowania - to tu jest miejsce, aby tego dokonać.
Awatar użytkownika
Bart709man
Posty:9
Rejestracja:wtorek 21 lut 2006, 00:00
Re: Transformata Fouriera

Post autor: Bart709man » poniedziałek 19 cze 2006, 17:31

**********************
okno Kaisera nie nadaje się do przetwarzania sygnału z zakładką bo jego kształt nie spełnia zasady dopełnienia do 1.
**********************
thx za wytłumaczenie... poszperam sobie na ten temat


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

Re: Transformata Fouriera

Post autor: Krizz » wtorek 20 cze 2006, 09:01

Widzę że źle robiłem stosując zakładkowanie (choć bez niego, przy okienku prostokątnym miałem brzydkie kliki na łączeniach bloków). Spróbuję z metodą uzupełniania zerami... Dzięki, MB.

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

Re: Transformata Fouriera

Post autor: MB » wtorek 20 cze 2006, 14:49

Przy okazji, pamiętaj modyfikując wartości współczynników FFT, że:

1. typowa organizacja wyniku FFT jest taka, że wartości o indeksach od 0 do N/2 odpowiadają częstotliwościom od 0 do fs/2, a te następne są ułożone w odwrotnej kolejności, oraz, że widmo sygnałów rzeczywistych musi być symetryczne. Musisz więc zadbać o to, żeby w wyniku operacji odpowiadające sobie prążki były lustrzanym odbiciem takim, że:
abs(F(k))=abs(F(N-k)) oraz arg((F(K))=-arg(F(N-k)). Jeśli nie spełnisz tego warunku, to po odwrotnej transformacji dostaniesz sygnał zespolony o istotnej partii energii zawartej w składowych urojonych.

2. Jeśli chcesz modyfikować dowolnie wartości współczynników (przy zachowaniu symetrii opisanej powyżej), to musisz liczyć się z "dziwnymi" efektami, jak np. dzwonienie. W "normalnych" (zachowujących się przyzwoicie) filtrach kolejne współczynniki są od siebie silnie zależne i na ogół charakterystyka jest funkcją dość gładką. Przykładowo, jeśli wytniesz tylko jeden prążek FFT o indeksie k (i odpowiadające mu odbicie lustrzane o indeksie N-k), to zrealizujesz stosunkowo kiepski filtr pasmowo-zaporowy, który strasznie "dzwoni", tzn. jego odpowiedź na wszelkie transienty będzie zawierała silne i długie oscylacje. Uzyskanie dobrze brzmiących efektów filtracji wymaga znajomości teorii filtrów.

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

Re: Transformata Fouriera

Post autor: senjin » środa 21 cze 2006, 02:00

hmm... aktualnie jestem skołowany - okazuje się, że o fft wiedziałem znacznie mniej, niż myślałem, że wiem... :) ale mam nadzieję, że jak trochę o tym poczytam, to mi się to jakoś ułoży.

niewiele zrozumiałem z tego "dopełniania zerami". zwyczajnie nie rozumiem pojęć, którymi posługują się w linku, który podałeś mb, ale myślę, że dłuższy wieczór z pomocą google rozwiąże ten problem :)
poza tym, wspomniałeś o 50% marginesie zer. gdzie umieścić ten margines? na początku, na końcu, czy może po 25% z obu końców mojego prostokątnego okienka?

Krizz:
Zastanawiam mnie to, co napisałeś:
"Dotychczas aby przekształcić cały plik robiłem tak: brałem pierwsze n sampli, fft, edycja, odwrotna fft dzieliłem przez n i zapisywałem na wyjście"
Na wyjściu fft otrzymywałeś tablicę wartości, więc nie rozumiem jak dzieliłeś ją przez n otrzymując, jak rozumiem, pojedynczą wartość?


dzieliłem każdą wartość z tablicy (a właściwie wektora) przez n... to taka normalizacja, bo w prawie całym pliku w każdym miejscu zachodziło na siebie n okienek.

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

Re: Transformata Fouriera

Post autor: MB » środa 21 cze 2006, 16:31

niewiele zrozumiałem z tego "dopełniania zerami". zwyczajnie nie rozumiem pojęć, którymi posługują się w linku, który podałeś mb, ale myślę, że dłuższy wieczór z pomocą google rozwiąże ten problem :)
poza tym, wspomniałeś o 50% marginesie zer. gdzie umieścić ten margines? na początku, na końcu, czy może po 25% z obu końców mojego prostokątnego okienka?
**********************
dla przekształcenia Fouriera to w sumie nieważne czy na początku czy na końcu czy z obu stron, bo cały fragment objęty transformacją traktowany jest jako przebieg okresowy. Pisząc 50% margines miałem na myśli po 50% z obu stron (łącznie 100%), ale w sumie można dać te zera po jednej. Dla ułatwienia, podaję poniżej jak powinna wyglądać implementacja w oparciu o podejście OLA:

Zakładamy, że dysponujesz algorytmem FFT, który liczy przekształcenie z bloku danych o długości N (np. N=1024) i wyznacza z niego N współczynników o wartościach zespolonych, oraz kompatybilnym algorytmem odwrotnej FFT. Do obliczeń potrzebujesz roboczy wektor o długości N. Algorytm jest iteracyjny:
1. pobierasz z pliku wejściowego N/2 nowych próbek, przesuwając wskaźnik o N/2 i przepisujesz te próbki na początek wektora.
2. pozostałe N/2 niezapisanych elementów wektora (tzn. od N/2+1 do N) zapisujesz wartościami zero.
3. Obliczasz FFT i w wyniku otrzymujesz N zespolonych współczynników
4. Modyfikujesz te współczynniki, pamiętając, aby dokonywać symetryczne operacje na współczynnikach z pierwszej i drugiej połowy bloku (czyli F[k] oraz F[N-k])
5. Obliczasz odwrotne FFT. w efekcie dostaniesz z powrotem N próbek w dziedzinie czasu, z tym, że mogą się pojawić wartości zespolone (część urojona różna od 0), choćby z powodu zaokrągleń numerycznych. Część urojoną można odrzucić, pozostawiając wartości rzeczywiste. Zauważ, że próbki o numerach od N/2 do N wcale nie są zerami, tylko zawierają ogon odpowiedzi, która by się zawinęła wokół bloku, gdyby nie to uzupełnienie
6. Teraz trzeba wkleić ten blok próbek do pliku wyjściowego. Pamiętaj, że wklejasz całe N, a nie tylko początkowe N/2 próbek. O ile nie jest to pierwsza iteracja, ostatnie N/2 próbek w pliku zawiera ogon z poprzedniej iteracji. Ten ogon trzeba zsumować z nowymi próbkami z bieżącej iteracji (początkowe N/2 próbek z wektora wynikowego), a pozostałe N/2 próbek z wektora po prostu doklejasz na koniec pliku, przesuwając wskaźnik bieżący o N/2 (tak, że zawsze pokazuje on pozycję N/2 przed końcem pliku).

Tak postępujesz w kółko aż do wyczerpania próbek wejściowych. Plik wynikowy będzie dłuższy od pliku wejściowego o N/2 próbek (tę końcówkę można ewentualnie odciąć).

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

Re: Transformata Fouriera

Post autor: senjin » czwartek 22 cze 2006, 11:19

WIELKIE DZIĘKI :)

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

Re: Transformata Fouriera

Post autor: Krizz » piątek 23 cze 2006, 13:21

Dla ułatwienia, podaję poniżej jak powinna wyglądać implementacja w oparciu o podejście OLA:

Niestety po zaimplementowaniu tego algortymu w pliku wyjściowym pojawiają mi sie kliki na łączeniach bloków...

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

Re: Transformata Fouriera

Post autor: MB » piątek 23 cze 2006, 13:44

W takim razie masz błędy w indeksowaniu wektorów. Zwróć uwagę na to, jak biegną te indeksy, bo to ma zasadnicze znaczenie. Jestem na 100% pewny tego opisu, bo sam takowy zaimplementowałem i działa idealnie, tak jak piszą we wszystkich książkach - zero klików.

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

Re: Transformata Fouriera

Post autor: Krizz » piątek 23 cze 2006, 14:41

...W takim razie masz błędy w indeksowaniu wektorów. Zwróć uwagę na to, jak biegną te indeksy, bo to ma zasadnicze znaczenie. Jestem na 100% pewny tego opisu, bo sam takowy zaimplementowałem i działa idealnie, tak jak piszą we wszystkich książkach - zero klików....
**********************
Robię dosłownie tak:
1) pobranie n próbek z pliku do wektora x[1]
2) dodanie n zer na końcu wektora x[1]
3) przeprowadzam fft, jakis filtr, i inv fft na x[1]
4) dzielę wektor x[1] wyjściowy na dwie częsci: out[1] = od 0 do n-1, i temp[1] = od n do n*2-1 (ogon)
5) zapisuję out[1] do pliku
6) przy kolejnej iteracji , gdy x[2] zostanie zwrócone przez inv fft, po podzieleniu go na out[2] i temp[2], dodaję temp[1] do out[2] i dopisuje do pliku, itd.

Chyba dobrze?

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

Re: Transformata Fouriera

Post autor: MB » sobota 24 cze 2006, 21:37

Robię dosłownie tak:
1) pobranie n próbek z pliku do wektora x[1]
2) dodanie n zer na końcu wektora x[1]
3) przeprowadzam fft, jakis filtr, i inv fft na x[1]
4) dzielę wektor x[1] wyjściowy na dwie częsci: out[1] = od 0 do n-1, i temp[1] = od n do n*2-1 (ogon)
5) zapisuję out[1] do pliku
6) przy kolejnej iteracji , gdy x[2] zostanie zwrócone przez inv fft, po podzieleniu go na out[2] i temp[2], dodaję temp[1] do out[2] i dopisuje do pliku, itd.

Chyba dobrze?...
**********************
Na pierwszy rzut oka ten opis wygląda poprawnie, choć tak naprawdę to jest masa drobiazgów, które mogą spowodować niepoprawne wyniki. Bez drobiazgowego zweryfikowania całości kodu trudno wyrokować, gdzie leży źrodło niepowodzenia. Nie wyjaśniłeś JAKI dokładnie algorytm FFT i w jakiej implementacji został tu użyty, nie napisałeś JAK dokładnie modyfikujesz prążki FFT ("jakis filtr" to trochę za mało), 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). Gdyby wszystko było w porzadku to MUSI działać. Dziesiątki książek opisujących technikę ola i rzesze programistów, którzy to zaimplementowali nie mogą się mylić.

ODPOWIEDZ