Szybkie przekszta³cenie Fouriera (FFT – ang
Transkrypt
Szybkie przekszta³cenie Fouriera (FFT – ang
Zakład Elektrotechniki Teoretycznej 1 Szybkie przekształcenie Fouriera (FFT – ang. Fast Fourier Transform) Rozpatrzymy sygnał o długości N f [ 0] , f [1] ,… , f [ N − 1] (1) dla którego chcemy obliczyć dyskretną transformatę Fouriera (DFT). Rozłożymy ten sygnał na dwa sygnały w ten sposób, g[n] będzie zawierał kolejne próbki parzyste f[n], a sygnał h[n] będzie równy nieparzystym próbkom f[n]. g [ n] = f [ 2n ] , n = 0,1,… , N2 − 1 (2) h [ n ] = f [ 2n + 1] , n = 0,1,… , N2 − 1 (3) Dyskretna transformata Fouriera sygnału g[n] (N/2 punktowa ) jest określona wzorem: N 2 −1 G ( k ) = ∑ g [ n] e − jnk 2π / ( N / 2 ) n =0 , k = 0,1,… , N2 − 1 (4) Należy zwrócić uwagę, że w wyrażeniu (4) pojawia się N/2 zamiast N (definicja DFT), ponieważ sygnał na długość N/2. Jeżeli zastąpimy k przez (k+N/2), to wyrażenie (4) pozostanie nie zmienione, ponieważ powoduje to dodanie wielokrotności 2πj do wykładnika. Stąd można zapisać: G ( k + N2 ) = G ( k ) (5) W analogiczny sposób możemy obliczyć transformatę sygnału h[n]: N 2 −1 H ( k ) = ∑ h [n] e − jnk 2π / ( N / 2 ) n=0 , k = 0,1,… , N2 − 1 (6) oraz zgodnie z wyrażeniem okresowości H (k + N 2 ) = H (k ) (7) Obliczenie wyrażenia (4), tak jak (6) wymaga (N/2)2 mnożeń, a więc razem potrzeba 2(N/2)2 mnożeń aby otrzymać: G ( k ) , k = 0,1,… N − 1 H ( k ) , k = 0,1,… N − 1 (8) Zakład Elektrotechniki Teoretycznej 2 Transformatę sygnału f[n] można otrzymać jako kombinację G(k) oraz H(k). Rozważymy wyrażenie G ( k ) + e− jk 2π / N H ( k ) = N 2 −1 ∑ g [ n] e − jnk 2π / ( N / 2 ) +e − jk 2π / N n =0 N 2 −1 ∑ h [ n] e − jnk 2π / ( N / 2 ) (9) n=0 dla k = 0,1,… , N − 1 Zastępując zgodnie z definicją: g [ n ] ← f [ 2n ] (10) h [ n ] ← f [ 2n + 1] i przenosząc mnożnik wykładniczy pod znak sumowania otrzymamy: N 2 −1 ∑ n =0 f [ 2n ] e − j ( 2 n ) k 2π / N N −1 2 + ∑ f [ 2n + 1] e − j ( 2 n +1) k 2π / N n=0 parzyste N −1 = ∑ f [ n] e − jnk 2π / N (11) n=0 nieparzyste Tak więc: F ( k ) = G ( k ) + e − jk 2π / N H ( k ) (12) Wzór (12) pokazuje, jak można otrzymać transformatę sygnału f[n] jako kombinację dwóch „subtransformat”. Proces łączenia G(k) i H(k) wymaga dodatkowo N mnożeń, zatem razem wykonuje się 2(N/2)2+N mnożeń, natomiast obliczanie DFT na podstawie definicji wymaga N2 mnożeń oszczędza się zatem: ( ) N2 − N2 /2+ N = N2 / 2− N N 1000 N2 1000000 (13) 2(N/2)2+N 501000 Oszczędzamy 499000 Nie ma przeszkód aby „subtransformaty” G(k) oraz H(k) obliczać posługując się tą samą metodą, to znaczy podzielić teraz sygnał g[n] na dwie części: parzystą g[2n] i nieparzystą g[2n+1] obliczając DFT każdej części i łącząc je w celu otrzymania G(k). Wtedy obliczenie G(k) wymaga 2(N/4)2+N/2 mnożeń tak jak i H(k). Obliczenie F(k) wymaga wtedy 4 ( N / 4 ) + 2 N mnożeń. 2 N 1000 N2 1000000 4 ( N / 4) + 2N Oszczędzmy 252000 748000 2 Zakład Elektrotechniki Teoretycznej 3 Jeżeli N jest potęgą liczby 2, proces ten możemy powtarzać log2N razy. W ostatnim kroku DFT dla N=1 nie wymaga mnożeń i znika składnik N2 w wyrażeniu na liczbę mnożeń. Za każdym razem dzielenia sygnału na dwie części wprowadzamy N mnożeń, a ponieważ robimy to log2N razy to potrzebujemy razem Nlog2N mnożeń. Jest to jedna z postaci FFT (algorytm dziesiątkowania w czasie), wymaga aby N było całkowitą potęgą liczby 2. Dla N=210=1024 oszczędność operacji mnożenia jest ponad 100 krotna. Programowanie FFT (struktury motylkowe) Obliczymy 8 punktową DFT, sygnału f[n]. 1. Zgodnie z przestawionym algorytmem FFT rozdzielamy próbki na parzyste i nieparzyste. Próbki parzyste umieszczamy w pierwszej połowie tablicy jako g[n], a próbki nieparzyste w drugiej połowie jako h[n]. f0 g0 f1 g1 f2 g2 f3 g3 f4 h0 f5 h1 f6 h2 f8 h3 Jeżeli byśmy policzyli DFT sygnałów g[n] i h[n] to możemy połączyć G(0) i H(0), G(1) i H(1), G(2) i H(2) ......... 2. Aby obliczyć transformaty G(k) i H(k) rozdzielamy sygnały g[n] oraz h[n] na część parzystą i nieparzystą analogicznie jak dla f[n]. Otrzymujemy 4 tablice dwupunktowe. Zakład Elektrotechniki Teoretycznej 4 f g h Ostatnie rozdzielanie sygnału daje w wyniku 8 tablic jednopunktowych. Można zauważyć, że proces „tasowania” próbek polega na odwróceniu bitów wskaźników próbek sygnału. 000 000 001 001 010 010 011 011 100 100 101 101 110 110 111 111 Jeżeli operacja zmiany porządku jest wykonana na wstępie, poprzez łączenie sąsiednich podtablic w odwrotnej kolejności możemy otrzymać w ostatnim kroku DFT sygnału f[n]. Zakład Elektrotechniki Teoretycznej 5 F1 G1 F5 H1 F (1) = G (1) + e− j 2π /8 H (1) = G (1) + B F ( 5 ) = G ( 5 ) + e − j 5⋅2π / 8 H ( 5 ) = G (1) − e − j 2π /8 H (1) = G (1) − B (14) Obliczając pierwszą połowę tablicy F(k), mnożymy przez funkcję wykładniczą zespoloną H(k) co daje B a następnie dodajemy B do G(k). Dla odpowiedniego punktu w drugiej połowie tablicy obliczany G(k) –B, przez co oszczędzamy połowę obliczeń. Ważną zaletą algorytmu jest możliwość odwracania bitów i łączenia w ramach jednej tablicy bez przepisywania jej w czasie obliczeń, zatem algorytm potrzebuje względnie mało pamięci. Przetwarzanie danych czasowych przed wyznaczeniem FFT Możemy odrzucić tyle próbek danych, aby długość pozostałego ciągu wejściowego FFT była całkowitą potęgą dwójki. (zmniejsza się rozdzielczość) Lepszym podejściem jest dodanie wymaganej liczby próbek o wartościach zerowych do części końcowej ciągu danych czasowych, aby dopasować liczbę jego punktów do kolejnego rozmiaru FFT o podstawie 2. Na przykład, jeśli mamy do przetransformowania 1000 próbek czasowych, wówczas zamiast analizować jedynie Zakład Elektrotechniki Teoretycznej 6 512 spośród nich za pomocą 512-punktowej FFT, powinniśmy dodać 24 kolejne próbki o wartościach zerowych do ciągu oryginalnego i użyć 1024-punktowej FFT. FFT obarczone jest negatywnymi skutkami przecieku widmowego (jak dla DFT). Możemy przemnażać dane czasowe przez funkcje okien, aby złagodzić problem przecieku. Bądźmy jednak przygotowani na degradację rozdzielczości częstotliwościowej, nieuchronnie występującą, jeśli są używane okna. Przy okazji, jeśli dołączenie zer jest niezbędne do rozszerzenia zbioru danych ciągu czasowego, musimy być pewni, że dołączamy zera po przemnożeniu oryginalnego ciągu danych czasowych przez funkcję okna. Zastosowanie funkcji okna do ciągu próbek uzupełnionego próbkami o zerowych wartościach zniekształci wynikowe okno i powiększy przeciek FFT. Próbkowanie wystarczająco szybkie i wystarczająco długie Powinniśmy podejrzewać powstanie aliasingu, jeśli istnieją jakiekolwiek składowe widmowe, których częstotliwości okazują się zależnymi od szybkości próbkowania. Jeśli podejrzewamy, że pojawia się aliasing, lub że sygnał ciągły zawiera szum szerokopasmowy będziemy musieli użyć analogowego filtru dolnoprzepustowego przed przetworzeniem A/C. Częstotliwość graniczna filtru dolnoprzepustowego musi być większa, niż zakres częstotliwości, jaki nas interesuje, ale mniejsza od połowy szybkości próbkowania. Przedział czasu, w którym zbieramy dane, musi być wystarczająco długi, aby spełnić wymagania dotyczące rozdzielczości częstotliwościowej FFT przy zadanej szybkości próbkowania. Przedział czasu, w którym zbieramy dane, jest odwrotnością wymaganej rozdzielczości FFT i im dłużej próbkujemy z ustaloną szybkością próbkowania fp, tym lepsza będzie rozdzielczość częstotliwościowa. Na przykład, jeśli wymagana jest rozdzielczość widmowa wynosi 5 Hz, to liczba niezbędnych próbek wynosi: N= fp wymagana rozdz. = fp 5 = 0, 2 ⋅ f p Opracowano na podstawie: R. G. Lyons „Wprowadzenie do cyfrowego przetwarzania sygnałów” 1999 K. Steiglitz „Wstęp do systemów dyskretnych” 1977 (15)