Jak obliczyć całkowite przesunięcie fazy z Transformaty Fouriera

0

Cześć,
mam pytanie chyba bardziej matematyczne niż programistyczne. No ale to sprawy pokrewne, może ktoś będzie tak dobry i mi pomoże :)

Potrzebuję obliczyć faktyczne przesunięcie fazy dla danej częstotliwości, korzystając z Transformaty Fouriera.
Standardowo korzystam z funksji:

atan2(real, imag) * 180 / M_PI

Ale to oczywiście (niestety) daje mi wyniki zawsze pomędzy -180° a +180°.
I jeżeli dana częstotliwość jest przesunięta np. o +200°, to otrzymam wartość -160°. Co jest oczywiście nie prawdą, bo czętotliwość nie jest przesunięta w tył.

Oczywiście wiem, że są algorytmy pozwalające na tak zwany "phase unwrapping", ale one optrzebują przynajmniej dwóch sampli aby porównać ze sobą. Pozwalają one na obliczenie prawdziwego przesunięcia fazy, ale dopiero od drugiego sampla w zwyż.
Korzystam z tego algorytmu, ale potrzebuję także obliczyć przesunięcie fazy dla pierwszego sampla.
Czy ktoś mógłby pomóc?

Nie ukrywam, że zależy mi na jakimś konkretnym rozwiązaniu, bo przekopałem się już przez różne artykuły po angielsku i po polsku o FFT, o przesunięciach fazowych, itp. Ale tej konkretnej informacji, której potrzebuję, nie mogę wychwycić z tej całej masy wiedzy jaką można znaleźć w sieci.
Za pomoc z góry serdecznie dziękuję :)

0

Przede wszystkim atan2(real, imag) a nie atan2(real/imag)

I jeżeli dana częstotliwość jest przesunięta np. o +200°, to otrzymam wartość -160°. Co jest oczywiście nie prawdą, bo czętotliwość nie jest przesunięta w tył.

Ale przecież fizycznie nie ma różnicy między częstotliwością przesuniętą o +200°, a tą -160°. Przesunięcie w fazie masz zawsze względne. Jeśli wiesz, że Twoje sygnały mogą być przesunięte tylko do przodu, to dodajesz do nich 360 i tyle.

0

Po pierwsze wyznaczanie przesunięcia fazowego względem początki próbkowania, zwykle nie ma sensu, bo w rzeczywistych pomiarach nie niesie to żadnej informacji.
Przesunięcie fazowe powiano być wyznaczane np między pomiędzy jedną częstotliwością, ale dla rożnych kanałów (np wyznaczanie kierunku dźwięku).
Albo dwoma różnymi częstotliwościami, ale to jest bardziej skomplikowane i nie wiem czy ma praktyczne zastosowanie.

Po drugie, co za problem dodać 360 jeśli wynik jest ujemny?

0

No niby (a nawet na pewno) fizycznie nie ma różnicy czy sinusoida jest przesunięta o +200°, czy o -160°. Ale...
Jeżeli sygnał potraktuję np. bardzo stromym filtrem górno przepustowym, to te niskie czestotliwosci przesuwaja sie w fazie nawet o kilka okresów, w związku z tym na wykresie fazy wyswietla sie „grzebień” taki okropny.
Jeżeli tych okresów jest kilkadziesiąt, a czasami nawet i więcej, to taki wykres robi się kompletnie nieczytelny. Natomiast jeżeli zastosuję "phase unwrapping" to na wykresie pojawia mi się tylko fragmencik grafiki, bo na początku jest to największe przesunięcie, a potem cała reszta wykresu jest schowana (wychodzi poza wykres).

A ja bym chciał aby taki wykres ładniej wyglądał, aby te najbardziej przesunięte częstotliwości wychodziły poza wykres, a w centrum aby były tylko te, które mieszczą się w jednym okresie.

Chyba mam pomysł. Policzę sobie ile tych przejść przez okres jest (ilość zębów grzebienia) i po prostu na końcu, cały wykres przesunę o tę ilość razy.

Jeszcze nie wiem czy to zadziała, ale coś czuję, że to niezły pomysł.

0

A nie prościej zastosować wykres polarny?

0

Hmm... Brzmi ciekawie, ale przyznam, ze sie jeszcze z tym nie spotkalem. Musze pogrzebac w googlach. A moze masz jakis fajny przyklad jak to wyglada?

0

Kurde szukam tego polarnego wykresu, ale jakos nic interesującego nie mogę znaleźć. Albo nie potrafię tego czytać. Rozumiem, że na osie reprezentują kąty Y to 90° oraz 279°, a X to 0° i 180°. Ale jak są wyrażone częstotliwości? Odległością od środka (punktu przecięcia osi)? Czy jak...?

0

A ja bym chciał aby taki wykres ładniej wyglądał

Wykres brzydki to tym gorzej dla danych...

Jeśli chcesz żeby wykres od -180° do +180° zmienił się w wykres od 0° do 360° to do ujemnych wartości dodaj 360°.
Jeśli chcesz by wartości większe niż 360° były w zakresie od 0 do 360° to odejmuj 360° w pętli aż uzyskasz wartość mniejszą niż 360°.
Jeśli nie chcesz rysować wartości większych niż 360° to ich nie rysuj.

0

Chyba się nie rozumiemy. Wzór atan2(real, imag) * 180 / M_PI nigdy mi nie da wartości większych niż 180°, a tym bardziej 360°, ani mniejszych niż -180°. Oczywiście mogę sobie dodać te 360° tak jak mówisz, ale wtedy wszystkie wyniki się podniosą o 360°, nawet te, które pierwotnie mieściły się w zakresie. Ale to nie ważne, znalazłem już rozwiązanie. Opisałem je powyżej.
Ale i tak wielkie dzięki za próbę pomocy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1