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 » wtorek 27 cze 2006, 14:21

Zapomniałbym... odejmowanie spektralne... :/
Jak odejmować od siebie dwie składowe o różnych fazach?

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

Re: Transformata Fouriera

Post autor: MB » wtorek 27 cze 2006, 15:59

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?...
**********************
Po prostu projektuje się filtry odpowiednimi technikami, które symulują pracę układu analogowego (najprościej: stosując tę samą odpowiedź impulsową jaką ma układ analogowy), a następnie wylicza się transformatę Fouriera z tej odpowiedzi. Ta transformata jest zespolona, zatem zawiera w sobie właściwą charakterystykę fazową. Filtracja oparta na FFT polega wtedy na wymnożeniu transformat i zastosowaniu operacji OLA (lub OLS).



Zapomniałbym... odejmowanie spektralne... :/
Jak odejmować od siebie dwie składowe o różnych fazach?
***********************
Ha, to jest clou odejmowania widmowego. Istnieje przynajmniej kilka (jeśli nie kilkanaście) odpowiedzi na to pytanie, wybór podejścia zależy od tego o jakiej konkretnej technice odejmowania widmowego rozmawiamy. W podejściu najbardziej chyba klasycznym zakłada się przede wszystkim, że moc szumu jest znacznie mniejsza niż moc sygnału. Amplituda każdego współczynnika transformaty obliczana jest jako różnica odpowiedniego współczynnika sygnału zaszumionego minus amplituda współczynnika uśrednionej transformaty szumu, ale pod warunkiem, że ta różnica jest większa od zera (lub pewnego ustalonego minimum). Faza powinna być obliczona jako wypadkowa faz, ostatecznie można jednak zostawić fazę sygnału oryginalnego niezmienioną.

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

Re: Transformata Fouriera

Post autor: Krizz » wtorek 27 cze 2006, 19:48

No i przysiadłem, przerobiłem swój program wg wszystkich wypisanych tu wskazówek. Spostrzeżenia: działa. Tzn. filtr dolnoprzepustowy zwraca mój sygnał (a nie, czego sie obawiałem, jakiś przypadkowy szum :) ). Ale... mój filtr stopniowo (ale zdecydowanie) wyciszający część rzeczywistą składowych powyżej któregośtam indeksu (na tyle niskiego by było słychać działanie filtra) i nieruszający faz składowych (zgodnie z tym co mówiłeś, zerofazowy), daje na wyjściu... nie to czego można by sie spodziewać. Regulowałem stromość zbocza filtru, aż zdecydowałem się na zerowanie re składowych powyżej indeksu granicznego... ale wciąz na wyjściu nie słychac filtra dolnoprzepustowego... zamiast tego słychać coś jakby echo, odbicia, dosyć osobliwie to brzmi :). Pragnę nadmienić, iż przypadkowo z początku mnożyłem też część im składowych przez współczynnik tłumienia, i wtedy filtr działał tak jak można sie tego po nim spodziewać, lecz niestety słychać było pstryki w punktach łączeń bloków (sprawdziłem w edytorze). Jestem w punkcie wyjścia.

I jedno pytanie: co fizycznie oznacza ujemna wartość re składowej? Pomyślałbym że oznacza amplitudę o odwróconej fazie, ale skoro za fazę odpowiada część im, to... o co chodzi?

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

Re: Transformata Fouriera

Post autor: MB » wtorek 27 cze 2006, 20:02

I jedno pytanie: co fizycznie oznacza ujemna wartość re składowej? Pomyślałbym że oznacza amplitudę o odwróconej fazie, ale skoro za fazę odpowiada część im, to... o co chodzi?...
**********************
ojojoj, a gdzie Ty wyczytałeś, że składowa urojona to faza??? Nigdzie czegoś takiego nie napisałem!

Wydawało mi się oczywiste, że wiesz tak elementarne rzeczy. Amplituda i faza (czyli kąt) to biegunowa reprezentacja wektora zespolonego, tymczasem re i im to są jego składowe w układzie kartezjańskim!

Chcąc modyfikować amplitudę i fazę musisz zrobić przeliczenie:
amp=sqrt(re*re+im*im)
ph=atan2(re,im) atan2 to arc tangens 4-połówkowy

Po manipulacji sygnałem odtwarzasz składowe re i im następująco:
re=amp*cos(ph)
im=amp*sin(ph)

Słuchaj, obawiam się, że musisz douczyć się trochę matematyki, bo trudno, żebyśmy zamienili forum EiS w korepetytorium. I tak podziwiam Wojtka, że jeszcze nas stąd nie przepędził

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

Re: Transformata Fouriera

Post autor: Krizz » wtorek 27 cze 2006, 20:27

No i kolejne olśnienie... Rzeczywiście, teraz pamiętam, choć podejrzewam że za późno na tłumaczenie się :P
Nadal jednak mam pstryki na łączeniach bloków, ale jak sądzę, sam będę musiał sobie z tym poradzić...

Wielkie dzięki MB.

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

Re: Transformata Fouriera

Post autor: senjin » wtorek 27 cze 2006, 22:09

dziś trochę poeksperymentowałem.

raczej nie zauważyłem pstryków w miejscu połączeń okienek, za to całemu sygnałowi towarzyszą bardzo głośne dźwięki o okresie równym długości mojego okienka + harmoniczne.

to może ja teraz się przyznam, co ja robię temu sygnałowi :)

nie interesuje mnie filtracja, ale po prostu generacja nowego sygnału w oparciu o podany. konkretnie: pokazuję sieci neuronowej widmo jakiegoś dźwięku i widmo tego samego dźwięku zmienionego efektem (na razie wałkuję przester) i chcę ją nauczyć aplikować ten efekt do dowolnych innych dźwięków...

i mam wrażenie, że w ten sposób nic nie uda mi się osiągnąć... zwłaszcza, że moja sieć wymyśla dość radykalne przekształcenia transformaty - to musi się skończyć brzydkimi przydźwiękami.

nie wiem, co zrobili ludzie z line6 - jeśli w ogóle operowali na widmie dźwięku - ale to był kawał dobrej roboty.

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

Re: Transformata Fouriera

Post autor: MB » wtorek 27 cze 2006, 23:06

raczej nie zauważyłem pstryków w miejscu połączeń okienek, za to całemu sygnałowi towarzyszą bardzo głośne dźwięki o okresie równym długości mojego okienka + harmoniczne.
**********************
Jak dla mnie to to są właśnie pstryki, wynikające z nieciągłości sygnału na granicy bloków. jeśli robisz operacje nieliniowe na widmie (a skoro zatrudniasz sieć neuronową to chyba tak) to takie nieciągłości jak najbardziej mają prawo się pojawić. Aby ich uniknąć musiałbyś zastosować okienkowanie z zakładką 50% o którym była mowa na samym początku tego wątku, ale przed FFT uzupełniać ciąg próbek na początku i na końcu o odpowiednio dużą liczbę zer (conajnmniej po 50% długości bloku). Nie gwarantuję, że to wystarczy - wiele zależy od tego, jak silnie niestacjonarna jest modyfikacja, którą wprowadzasz.


nie interesuje mnie filtracja, ale po prostu generacja nowego sygnału w oparciu o podany. konkretnie: pokazuję sieci neuronowej widmo jakiegoś dźwięku i widmo tego samego dźwięku zmienionego efektem (na razie wałkuję przester) i chcę ją nauczyć aplikować ten efekt do dowolnych innych dźwięków...

i mam wrażenie, że w ten sposób nic nie uda mi się osiągnąć... zwłaszcza, że moja sieć wymyśla dość radykalne przekształcenia transformaty - to musi się skończyć brzydkimi przydźwiękami.

nie wiem, co zrobili ludzie z line6 - jeśli w ogóle operowali na widmie dźwięku - ale to był kawał dobrej roboty....
**********************
Słusznie przypuszczasz, że tak się raczej nie da. Po pierwsze dlatego, że symulacja zniekształcenia nieliniowego powinna naśladować zjawisko zachodzące w rzeczywistym układzie, a ten układ reaguje nieliniowo przede wszystkim na wartość chwilową sygnału, tymczasem robiąc FFT de facto pozbawiasz się informacji o kształcie sygnału w dziedzinie czasu.
Po drugie, sieć neuronowa jest narzędziem pozwalającym zidentyfikować zależności statystyczne wyższych rzędów w sygnale, co daje się zaprząc do rozwiązania problemów o nieznanej strukturze. Problem jest jednak w tym, że często zbyt wielkie nadzieje pokłada się w możliwościach sieci NN. Np. nigdy nie uda nam się nauczyć dwuwarstwowej sieci neuronowej obliczania FFT, bo do tego są potrzebne interakcje w log2(n) etapach.

O symulacji dynamicznych układów nieliniowych jest sporo prac w materiałach serii konferencji DaFX. Poszukaj TUTAJ.

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

Re: Transformata Fouriera

Post autor: senjin » środa 28 cze 2006, 01:24

...raczej nie zauważyłem pstryków w miejscu połączeń okienek, za to całemu sygnałowi towarzyszą bardzo głośne dźwięki o okresie równym długości mojego okienka + harmoniczne.
**********************
Jak dla mnie to to są właśnie pstryki, wynikające z nieciągłości sygnału na granicy bloków. jeśli robisz operacje nieliniowe na widmie (a skoro zatrudniasz sieć neuronową to chyba tak) to takie nieciągłości jak najbardziej mają prawo się pojawić. Aby ich uniknąć musiałbyś zastosować okienkowanie z zakładką 50% o którym była mowa na samym początku tego wątku, ale przed FFT uzupełniać ciąg próbek na początku i na końcu o odpowiednio dużą liczbę zer (conajnmniej po 50% długości bloku). Nie gwarantuję, że to wystarczy - wiele zależy od tego, jak silnie niestacjonarna jest modyfikacja, którą wprowadzasz.


ok. jeszcze raz przyjrzałem się temu sygnałowi i rzeczywiście jest nieciągły. ale stosuję dopełnianie zerami - do każdego okienka dodaję na końcu drugie tyle zer. czy to zrobi różnicę, jeśli dodam je na początku?! czy dodanie większej ilości zer poprawi sytuację? (sorry, jeszcze nie odrobiłem pracy domowej, sporo lektury przede mną...)


Słusznie przypuszczasz, że tak się raczej nie da. Po pierwsze dlatego, że symulacja zniekształcenia nieliniowego powinna naśladować zjawisko zachodzące w rzeczywistym układzie, a ten układ reaguje nieliniowo przede wszystkim na wartość chwilową sygnału, tymczasem robiąc FFT de facto pozbawiasz się informacji o kształcie sygnału w dziedzinie czasu.
Po drugie, sieć neuronowa jest narzędziem pozwalającym zidentyfikować zależności statystyczne wyższych rzędów w sygnale, co daje się zaprząc do rozwiązania problemów o nieznanej strukturze. Problem jest jednak w tym, że często zbyt wielkie nadzieje pokłada się w możliwościach sieci NN. Np. nigdy nie uda nam się nauczyć dwuwarstwowej sieci neuronowej obliczania FFT, bo do tego są potrzebne interakcje w log2(n) etapach.


moja pierwsza próba polegała na pokazywaniu po prostu przebiegu sygnału mojej sieci - ale niewiele potrafiła się z niego nauczyć. mimo, że wydaje mi się, że bardzo dobrze zsynchronizowałem sygnał czysty i przesterowany w czasie, to rzut oka na przebieg obu sygnałów pokazywał, że zniekształcenie nie polega po prostu na przypisaniu każdej wartości wejściowej innej wartości obliczonej na podstawie jakiejś nieliniowej funkcji. może podczas przesterowywania następowały jakieś przesunięcia fazowe?!

w każdym razie uznałem, że niezależnie od zjawisk fazowych, przesterowanie to dodanie harmonicznych - dlatego coś mogę uzyskać operując na widmie. np. częstotliwość 1kHz mogłaby się nauczyć, że nawet jeśli w widmie wejściowym 1kHz jest małe, ale składowa np. 333 Hz jest duża, to harmoniczna 1kHz może się wygenerować.

póki co, efekty są tragiczne, ale mam jeszcze kilka pomysłów, więc może nie warto jeszcze składać broni.

O symulacji dynamicznych układów nieliniowych jest sporo prac w materiałach serii konferencji DaFX. Poszukaj TUTAJ....

wielkie dzięki, ale jest taki feler, że ja właśnie piszę ten program na zaliczenie zajęć z sieci neuropodobnych :) więc będę się upierał, żeby je właśnie zastosować. ale chyba w tym momencie wypada zakończyć zadawanie pytań, bo o ile sposób posługiwania się fft przeze mnie nie będzie oceniany, to sieci powinienem się nauczyć sam :)

ODPOWIEDZ