Dlaczego FFT tworzy liczby zespolone zamiast liczb rzeczywistych?

83

Wszystkie implementacje FFT, z którymi się zetknęliśmy, dają w wyniku wartości zespolone (z częściami rzeczywistymi i urojonymi), nawet jeśli dane wejściowe do algorytmu były dyskretnym zbiorem liczb rzeczywistych (liczb całkowitych).

Czy nie jest możliwe przedstawienie dziedziny częstotliwości wyłącznie za pomocą liczb rzeczywistych?

steve landiss
źródło

Odpowiedzi:

88

FFT to zasadniczo zmiana podstawy. Podstawą, na którą FFT zmienia twój oryginalny sygnał, jest zamiast tego zestaw fal sinusoidalnych. Aby ta podstawa mogła opisać wszystkie możliwe wejścia, musi być w stanie przedstawić zarówno fazę, jak i amplitudę; faza jest reprezentowana za pomocą liczb zespolonych.

Na przykład, załóżmy, że FFT sygnał zawierający tylko jedną falę sinusoidalną. W zależności od fazy możesz uzyskać całkowicie prawdziwy wynik FFT. Ale jeśli zmienisz fazę wejścia o kilka stopni, jak inaczej wyjście FFT może reprezentować to wejście?

edycja: To jest nieco luźne wyjaśnienie, ale staram się tylko zmotywować intuicję.

zmccord
źródło
3
Bardzo pomaga odpowiedzieć. Jeśli wynik FFT zawiera tylko częstotliwość i fazę, w jaki sposób przechwytuje informacje o amplitudzie w próbce w dziedzinie czasu? To znaczy, jak odtwarza prawidłowe amplitudy w iFFT?
steve landiss
7
Cóż, każda wartość w FFT odpowiada innej składowej częstotliwości. Wielkość tej wartości jest amplitudą składowej, a kąt zespolony jest fazą tej składowej.
zmccord
54

FFT podaje amplitudę i fazę. Amplituda jest kodowana jako wielkość liczby zespolonej (sqrt (x ^ 2 + y ^ 2)), podczas gdy faza jest kodowana jako kąt (atan2 (y, x)). Aby uzyskać ściśle rzeczywisty wynik z FFT, przychodzący sygnał musi mieć równą symetrię (tj. X [n] = spój (x [Nn])).

Jeśli zależy ci tylko na intensywności, wielkość liczby zespolonej wystarczy do analizy.

antijon
źródło
41

Tak, możliwe jest przedstawienie wyników w dziedzinie częstotliwości FFT dla ściśle rzeczywistych danych wejściowych przy użyciu tylko liczb rzeczywistych.

Te liczby zespolone w wyniku FFT to po prostu 2 liczby rzeczywiste, które są wymagane do podania współrzędnych 2D wektora wynikowego, który ma zarówno długość, jak i kąt kierunku (lub wielkość i fazę). Każda składowa częstotliwości w wyniku FFT może mieć unikalną amplitudę i unikalną fazę (w odniesieniu do pewnego punktu w aperturze FFT).

Pojedyncza liczba rzeczywista nie może reprezentować zarówno wielkości, jak i fazy. Jeśli wyrzucisz informacje o fazie, może to łatwo znacznie zniekształcić sygnał, jeśli spróbujesz go odtworzyć za pomocą iFFT (a sygnał nie jest symetryczny). Tak więc pełny wynik FFT wymaga 2 liczb rzeczywistych na paczkę FFT. Te 2 liczby rzeczywiste są zebrane razem w niektórych FFT w złożonym typie danych według wspólnej konwencji, ale wynik FFT może łatwo (i niektóre FFT robią) po prostu wytworzyć 2 rzeczywiste wektory (jeden dla współrzędnych cosinusowych i jeden dla współrzędnych sinusoidalnych).

Istnieją również procedury FFT, które bezpośrednio wytwarzają wielkość i fazę, ale działają wolniej niż FFT, co daje złożony (lub dwa rzeczywiste) wynik wektorowy. Istnieją również procedury FFT, które obliczają tylko wielkość i po prostu odrzucają informacje o fazie, ale zwykle działają nie szybciej niż pozwalają zrobić to samemu po bardziej ogólnym FFT. Może zaoszczędzą koderowi kilka wierszy kodu kosztem niemożności ich odwrócenia. Ale wiele bibliotek nie zawraca sobie głowy włączaniem tych wolniejszych i mniej ogólnych form FFT i po prostu pozwala koderowi konwertować lub ignorować to, czego potrzebują lub nie.

Ponadto wielu uważa, że ​​matematyka jest o wiele bardziej elegancka przy zastosowaniu złożonej arytmetyki (gdzie, dla ściśle rzeczywistych danych wejściowych, korelacja cosinusowa lub nawet składnik wyniku FFT jest umieszczany w składowej rzeczywistej, a korelacja sinusoidalna lub nieparzysta składowa Wynik FFT jest umieszczany w urojonym składniku liczby zespolonej).

(Dodano :) Jako kolejną opcję możesz rozważyć dwa składniki każdego pojemnika wyników FFT, zamiast jako składniki rzeczywiste i urojone, jako składniki parzyste i nieparzyste, oba rzeczywiste.

hotpaw2
źródło
19

Jeśli twój współczynnik FFT dla danej częstotliwości fwynosi x + i y, możesz spojrzeć na xwspółczynnik cosinusa przy tej częstotliwości, podczas gdy yjest to współczynnik sinusa. Jeśli dodasz te dwie fale dla określonej częstotliwości, otrzymasz falę z przesunięciem fazowym na tej częstotliwości; wielkość tej fali jest sqrt(x*x + y*y)równa wielkości współczynnika zespolonego.

Dyskretnej transformacji kosinusowej (DCT) jest spokrewniony z transformacją Fouriera, który dostarcza wszystkich rzeczywistych współczynników. Dwuwymiarowy DCT jest używany przez wiele algorytmów kompresji obrazu / wideo.

nadchodząca burza
źródło
9
  1. Dyskretna transformata Fouriera jest zasadniczo transformacją z wektora liczb zespolonych w „dziedzinie czasu” do wektora liczb zespolonych w „dziedzinie częstotliwości” (używam cudzysłowów, ponieważ jeśli zastosujesz odpowiednie współczynniki skalowania, DFT jest swoją własną odwrotność). Jeśli twoje wejścia są prawdziwe, wtedy można wykonać dwa Fouriera naraz: Take wektory wejściowe x i y i obliczenia F ( x  +  i  y ). Zapomniałem, jak później oddziela się DFT, ale podejrzewam, że chodzi o symetrię i złożone koniugaty.

  2. Dyskretnej transformaty cosinus sort-of pozwala reprezentować „domeny częstotliwości” z liczb rzeczywistych, i jest powszechne w algorytmach kompresji stratnej (JPEG, MP3). Zaskakujące (dla mnie) jest to, że działa, mimo że wydaje się odrzucać informacje o fazie, ale wydaje się to również zmniejszać użyteczność dla większości celów przetwarzania sygnału (nie jestem świadomy łatwego sposobu na splot / korelację z DCT).

Pewnie pomyliłem się w niektórych szczegółach;)

tc.
źródło
1
Chciałbym znaleźć więcej informacji na temat, jak to ująłeś - oddzielając później DFT - dla przypadku transformacji F (x + iy).
CatsLoveJazz