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:

Transformata Fouriera

Post autor: senjin » niedziela 18 cze 2006, 11:19

Witam!

Chcę napisać program, który bierze zapisany dźwięk (plik wave), robi mu fft, coś robi z uzyskanym widmem, a następnie robi odwrotną transformatę, tak, że w efekcie znowu mam dźwięk, tylko zmieniony.

Moje pytanie dotyczy sposobu w jaki powinienem robić fft w jedną i w drugą stronę. Otóż: żeby zrobić fft muszę mu zapodać jakiś fragment dźwięku (jeśli dobrze rozumiem, zawierający przynajmniej jeden okres drgań najniższego dźwięku). Po wszystkich przekształceniach znowu dostaję tej samej długości fragment dźwięku.

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. następnie przesuwałem się o 1 sampel do przodu i znowu fft, edycja, odwr. fft i dzielenie przez n i dodawałem do pliku wyjściowego (oczywiście też przesunięte o 1 sampel) - i tak dalej aż po kroczkami po jednym samplu przeszedłem przez cały plik. Ta metoda daje dość dobre efekty ale jest bardzo czasochłonna.

Zastanawiam się, czy przypadkiem nie każę komputerowi liczyć wielokrotnie tej samej rzeczy. Bo przecież w ciągu 1 "cyklu" dostaję całe n przetworzonych sampli. Spróbowałem zrobić tak, że przetwarzam n sampli, i nie przechodzę o 1 sampel, tylko o n. Program zaczął działać w rozsądnym tempie, ale efekty były tragiczne.

Czy ta metoda ma szanse na powodzenie?

Awatar użytkownika
jarekz
Posty: 245
Rejestracja: niedziela 15 sty 2006, 00:00

Re: Transformata Fouriera

Post autor: jarekz » niedziela 18 cze 2006, 17:49

...przesuwałem się o 1 sampel do przodu...
Co to jest sampel? Czy chodzi o stempel albo o skalpel? A może jest to nowe pojęcie używane w cyfrowym przetwarzaniu sygnałów? Przepraszam - w dygitalowym sygnalprocessingu...

Awatar użytkownika
Bart709man
Posty: 9
Rejestracja: wtorek 21 lut 2006, 00:00

Re: Transformata Fouriera

Post autor: Bart709man » niedziela 18 cze 2006, 19:21

musisz analizowac sygnał w oknach czasowych o odpowiedniej długości dla której zakładasz że sygnał jest stacjonarny... tzn. np dla mowy możesz przyjąć 30ms. (przeliczając dla 44100Hz masz 1323 próbek) dla muzyki okna musisz dobrac mniejsze... poeksperymentuj poniżej 10ms.. I rób transformate tylko dla tego wybranego okna.. im krótsze okno tym mniej probek sygnału do transformaty.. tym mniejsza rozdzielczosc czestotliwosciowa.. ale kompromis musi byc.. zalezy wszystko od tego co chcesz potem robic z widmem.

Samo okienkowanie realizujesz wymnazajac sygnal przez okna czasowe o odpowiednim ksztalcie (hamminga, kaisera, ..... - jest tego troche; ja używałem okno kaisera) i długości (np. 256 próbek - około 6ms dla 44,1kHz). Kolejne okna musza na siebie zachodzic zebys nie tracil informacji na skrajach okna (dla 256probek na okno niech nastepne zaczyna się dla 180 próbki poprzedniego okna. itd..).. I robisz fft dla sygnału w tych oknach, czyli co 180 próbek, a nie co jedną. Polecam książke "Cyfrowe Przetwarzanie Sygnałów - od teorii do zastosowań" Tomasza P. Zielińskiego.



Pozdrawiam

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

Re: Transformata Fouriera

Post autor: senjin » poniedziałek 19 cze 2006, 06:56

pisząc "sample" miałem na myśli kolejne próbki sygnału cyfrowego... takie, których np. u mnie jest 44100 na sekundę :)



...musisz analizowac sygnał w oknach czasowych o odpowiedniej długości dla której zakładasz że sygnał jest stacjonarny... tzn. np dla mowy możesz przyjąć 30ms. (przeliczając dla 44100Hz masz 1323 próbek) dla muzyki okna musisz dobrac mniejsze... poeksperymentuj poniżej 10ms.. I rób transformate tylko dla tego wybranego okna.. im krótsze okno tym mniej probek sygnału do transformaty.. tym mniejsza rozdzielczosc czestotliwosciowa.. ale kompromis musi byc.. zalezy wszystko od tego co chcesz potem robic z widmem.
***********
a czy zmniejszając długość "okna" nie stracę informacji o basach? wydaje mi się, że jeśli transformata nie "zobaczy" całego okresu drgania (a może połowy?), to zinterpretuje to, co widzi przy użyciu wyższych harmonicznych - czy może przy odwrotnej transformacie basy się odtworzą?



Polecam książke "Cyfrowe Przetwarzanie Sygnałów - od teorii do zastosowań" Tomasza P. Zielińskiego.
**********************
poszukam, dzięki :)

Awatar użytkownika
jarekz
Posty: 245
Rejestracja: niedziela 15 sty 2006, 00:00

Re: Transformata Fouriera

Post autor: jarekz » poniedziałek 19 cze 2006, 09:28

...pisząc "sample" miałem na myśli kolejne próbki sygnału cyfrowego...
No właśnie, próbki - takie ładne polskie słowo. O to mi chodziło.
Z Internetu można bezpłatnie ściągnąć świetną książkę o DSP: tutaj. Jest w niej cały rozdział poświęcony zagadnieniu, które Cię interesuje.

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

Re: Transformata Fouriera

Post autor: Krizz » poniedziałek 19 cze 2006, 09:44

Kolega Bart709man powiedział juz chyba wszystko, ja jedynie dodam coś od siebie. Podejrzewam że stosujesz najpopularniejszy algorytm FFT Cooley-Tukeya. Algorytm ten przyjmuje okienka o długości będacej potęgą dwójki. Na wyjściu dostajesz spektrum o precyzji n-harmonicznych, gdzie n to długość okienka, zatem im większe n, tym lepsza precyzja, równocześnie większy narzut na CPU. Odwrotna FFT zwróci też n sampli.

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ść?

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

Re: Transformata Fouriera

Post autor: MB » poniedziałek 19 cze 2006, 09:55

Poza odesłaniem kolegi do literatury warto jednak sprostować kilka kwestii, które tutaj padły, a które po prostu wprowadzają w błąd.

Po pierwsze - wyjaśnijmy, że operacje na FFT wykonuje się blokami próbek. Taki blok pobrany z sygnału wejściowego reprezentuje fragment sygnału, który po wykonaniu FFT, przetworzeniu i odwrotnej FFT wklejamy w to samo miejsce. Nie jest prawdą, że blok próbek transformaty musi zawsze obejmować stacjonarny fragment sygnału. Dla większości klasycznych operacji na widmie taka stacjonarność jest całkowicie bez znaczenia. Długość bloku decyduje o rozdzielczości czasowej i częstotliwościowej, które są do siebie odwrotnie proporcjonalne.

Po drugie - żeby to zrobić dobrze trzeba dokładnie określić JAKIE operacje są wykonywane i znać właściwości FFT. Przykładowo, mnożenie współczynników transformaty przez różne liczby jest niczym innym jak operacją filtracji dokonywaną w dziedzinie częstotliwości. Jednak specyficzne właściwości FFT powodują, że taka operacja nie jest trywialna, ponieważ pojawia się tzw. aliasing czasowy. Stosowanie okien i zakładkowania prowadzi do błędnych wyników! Filtrację wykonuje się bez żadnych okien, stosując odpowiednio dłuższy blok transformaty sygnału uzupełnionego zerami (metody overlap-add i overlap-save, wyjaśnienie). Okna mają zastosowanie głównie do analizy widmowej i projektowania filtrów, a już zupełnym nieporozumieniem jest stosowanie do przetwarzania sygnału okna Kaisera, które zostało zaprojektowane wyłącznie do estymacji widmowej.


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

Re: Transformata Fouriera

Post autor: MB » poniedziałek 19 cze 2006, 10:08

a czy zmniejszając długość "okna" nie stracę informacji o basach? wydaje mi się, że jeśli transformata nie "zobaczy" całego okresu drgania (a może połowy?), to zinterpretuje to, co widzi przy użyciu wyższych harmonicznych - czy może przy odwrotnej transformacie basy się odtworzą?
**********************
Nic podobnego. Zmniejszając długość bloku transformaty zmniejszasz rozdzielczość częstotliwościową. Pojedynczy współczynnik FFT ("prążek") reprezentuje zgrubsza przedział częstotliwości o szerokości fs/N, gdzie fs jest częstotliwością próbkowania a N długością bloku. Informacje o najniższych częstotliwościach są więc "sklejane" z informacją o składowej stałej (współczynnik o indeksie 0) - to jest właśnie ta utrata rozdzielczości. Jeśli w sygnale występują składowe o okresie dłuższym niż blok (w warunkach naturalnych - prawie zawsze) to objawi się to specyficznym "pulsowaniem" tego F(0) z bloku na blok. Ale po obliczeniu odwrotnego FFT dostaniesz z powrotem te same składowe.

Awatar użytkownika
Bart709man
Posty: 9
Rejestracja: wtorek 21 lut 2006, 00:00

Re: Transformata Fouriera

Post autor: Bart709man » poniedziałek 19 cze 2006, 12:59

Dzięuje za konkretne wyjaśnienie... sam zajmowałem się mową więc co do muzyki to jeszcze przede mną ,więc sam mam pytania:

MB napisałeś:
"Stosowanie okien i zakładkowania prowadzi do błędnych wyników! Filtrację wykonuje się bez żadnych okien, Filtrację wykonuje się bez żadnych okien, stosując odpowiednio dłuższy blok transformaty sygnału uzupełnionego zerami (metody overlap-add i overlap-save, wyjaśnienie).
Okna mają zastosowanie głównie do analizy widmowej i projektowania filtrów... "

ale przykłądowo dość proste filtrowanie oparte na dekompozycji FFT na podpasma stosowane w MPEG Audio.. oparte jest na transformacie FFT z wykorzystaniem okna Hanninga. .. Jezeli pobieram po prostu N próbek do analizy to chyba też to jest okienkowanie tylko oknem prostokątnym. Ogólnie z teori okienkowanie jest procesem zawsze poprzedzającym FFT. Napisz co miałeś na myśłi..
Cchyba że chodzi tylko o zakłądkowanie.. rozumiem ze przy oknie prostokątnym nie ma sensu, ale jeżeli chce zroibioć filtr który w czasie zmienia swoje parametry to kolejne bloki musiałyby chyba zachodzić na siebie żeby to jakoś brzmiało... ciekaw jestem... Poczatkujący jestem więc prosze o wyjasnienie.

" ...a już zupełnym nieporozumieniem jest stosowanie do przetwarzania sygnału okna Kaisera, które zostało zaprojektowane wyłącznie do estymacji widmowej".

Okno parametrycze Kaisera jest dość uniwersalne no i ma najpepsze parametry.. Czy chodzi o trudną realizację sprzętową ?

Pozdrawiam

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

Re: Transformata Fouriera

Post autor: MB » poniedziałek 19 cze 2006, 16:06

ale przykłądowo dość proste filtrowanie oparte na dekompozycji FFT na podpasma stosowane w MPEG Audio.. oparte jest na transformacie FFT z wykorzystaniem okna Hanninga.
****************************
Ależ nic podobnego!
Po pierwsze: w MPEG-u nie ma filtracji tylko rozkład sygnału na subpasma w zespole filtrów, połączony z decymacją. W poszczególnych subpasmach są składowe aliasowe ale zespół jest tak skonstruowany, że te składowe się znoszą w dekoderze, przy odtwarzaniu sygnału. Gdybyś usunął jakieś pasmo, to dostaniesz bardzo silny aliasing.
Po drugie: tam wcale nie ma FFT (przynajmniej bezpośrednio). Zespół filtrów QMF z MPEG-a oparty jest na przekształceniu DCT-2 i DCT-4, które mają inne właściwości symetrii - aliasing w sąsiednich oknach ma przeciwne znaki i się znosi (zupełnie inaczej niż w FFT).


.. Jezeli pobieram po prostu N próbek do analizy to chyba też to jest okienkowanie tylko oknem prostokątnym. Ogólnie z teori okienkowanie jest procesem zawsze poprzedzającym FFT. Napisz co miałeś na myśłi..
*****************************
To, czy pobranie bloku próbek bez modyfikacji nazwiemy oknem prostokątnym czy nie, to nie ma w sumie znaczenia. W przypadku mnożenia transformaty przez jakieś współczynniki mamy do czynienia z filtracją, co jest równoważne w dziedzinie czasu splotowi z odpowiedzią impulsową filtru. Jednak w przypadku FFT ten splot to splot kołowy a nie liniowy. To powoduje, że ogony odpowiedzi impulsowej zawijają się wokół krańców bloku i powstaje bardzo brzydki aliasing czasowy. Żadne okienkowanie tego nie wyeliminuje. No chyba, że mówimy o okienkowaniu oknem prostokątnym z 50% marginesem zer, co jest równoważne wspomnianym przeze mnie metodom OLA/OLS. Nie ma przed tym ucieczki.


Cchyba że chodzi tylko o zakłądkowanie.. rozumiem ze przy oknie prostokątnym nie ma sensu, ale jeżeli chce zroibioć filtr który w czasie zmienia swoje parametry to kolejne bloki musiałyby chyba zachodzić na siebie żeby to jakoś brzmiało... ciekaw jestem... Poczatkujący jestem więc prosze o wyjasnienie.
*****************************
Filtr o charakterystyce zmiennej w czasie można realizować przez FFT stosując odpowiednie wygładzanie charakterystyki, aby nie zmieniała się gwałtownie z okna na okno. Ewentualnie można stosować nadmiarowość i zakładkowanie (tylko po stronie rekonstrukcji), jednak pod warunkiem wcześniejszego zadbania o brak aliasingu czasowego (i wracamy do punktu wyjścia).


" ...a już zupełnym nieporozumieniem jest stosowanie do przetwarzania sygnału okna Kaisera, które zostało zaprojektowane wyłącznie do estymacji widmowej".

Okno parametrycze Kaisera jest dość uniwersalne no i ma najpepsze parametry.. Czy chodzi o trudną realizację sprzętową ?
**********************
Po pierwsze, nie ma czegoś takiego jak uniwersalne okno i najlepsze parametry. Kryteria najlepszości silnie zależą od zastosowań, a zastosowaniem okna Kaisera jest estymacja widmowa, a nie przetwarzanie sygnału.
Po drugie, okno Kaisera nie nadaje się do przetwarzania sygnału z zakładką bo jego kształt nie spełnia zasady dopełnienia do 1. Suma poprzesuwanych okien Kaisera nie daje wartości stałej, czyli efektem ważenia przez te okna jest pasożytnicza modulacja amplitudy. Można tę modulację skompensować odpowiednią funkcją zmiennego w czasie wzmocnienia, ale de facto jest to tożsame z modyfikacją kształtu okna, które tym samym przestaje być oknem Kaisera.

ODPOWIEDZ