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)