Szybka transformacja Fouriera (FFT – Fast Fourier Transform)
Plan wykładu:
1. Transformacja Fouriera, iloczyn skalarny 2. DFT - dyskretna transformacja Fouriera 3. FFT – szybka transformacja Fouriera
a) algorytm PFA
b) algorytm Cooleya-Tukeya (radix-2) c) wielowymiarowe FFT
4. Przykłady zastosowań: mnożenie wielomianów, odszumianie sygnału, rozwiązanie równania Poissona, całkowanie.
2 Jeśli funkcja f(x) jest okresowa wówczas
zamiast wielomianów do jej interpolacji (aproksymacji) lepiej użyć wielomianów trygonometrycznych tj. rozwinąć funkcję w szereg Fouriera. Dla funkcji okresowej o okresie 2π:
Funkcję możemy też zapisać w postaci zespolonego szeregu Fouriera
f (x) = a
02 +
X
1 k=1(a
kcos(kx) + b
ksin(kx))
a
k= 1
¼
Z
¼¡¼
f (t)cos(kt)dt
b
k= 1
¼
Z
¼¡¼
f (t)sin(kt)dt
Jeśli funkcja f(x) jest rzeczywista wówczas „zwykły”
szereg Fouriera jest częścią
rzeczywistą zespolonego szeregu Fouriera:
Dla ciągu współczynników
definiujemy
Co prowadzi do zależności pomiędzy szeregiem rzeczywistym i zespolonym
[a
k]
1k=0[b
k]
1k=1b
0= 0 a
¡k= a
kb
¡k= ¡b
kf (x) »
X
1 k=¡1f (k)e b
Ikxf (k) = b 1 2¼
Z
¼¡¼
f (t)e
¡Iktdt
f (k) b = 1 2¼
Z
¼¡¼
f (t)[cos(kt) ¡ Isin(kt)]dt
= 1
2 (a
k¡ Ib
k)
k ¸ 0
c
k= 1
2 (a
k¡ Ib
k)
a
02 +
X
n k=1(a
kcos(kx) + b
ksin(kx)) =
X
n k=¡nc
ke
IkxFunkcje
generują ciąg ortonormalnych funkcji w zespolonej przestrzeni Hilberta.
Iloczyn skalarny w tej przestrzeni:
Dysponując tablicą wartości funkcji f i g w węzłach siatki, iloczyn wewnętrzny
można zapisać w postaci dyskretnej:
hf; gi = 1 2¼
Z
¼¡¼
f (x)g
¤(x)dx
Własności iloczynu wewnętrznego/skalarnego:
oraz związek z normą euklidesową
Dla każdego
Dowód
hf; fi
N¸ 0
hf; gi
N= hg; fi
¤Nkf k
N= p
hf; fi
Nhf; gi 1
NX
¡1 ¤N ¸ 1
h®f + ¯g; hi
N= ® hf; hi
N+ ¯ hg; hi
NE
k(x) = e
Ikx; k = 0; §1; §2; : : :
hE
k; E
ni = 1 2¼
Z
¼¡¼
E
k(x)E
n¤(x)dx
= 1
2¼
Z
¼¡¼
e
ikxe
¡Inxdx
= 1
2¼
Z
¼¡¼
e
I(k¡n)xdx
= 1
2¼
e
I(k¡n)xI(k ¡ n)
¯ ¯
¯ ¯
x=¼ x=¡¼
= 0
hE
k; E
mi
N=
½ 1
k¡mN2 Z Z Z 0
k¡mN2 Z = Z Z
1 N
N
X
¡1 j=0E
kµ 2¼j N
¶ E
m¤µ 2¼j N
¶
=
= 1 N
N
X
¡1 j=0h e
2¼I(k¡m)=Ni
j4 Dla pozostałych przypadków można się posłużyć
wyrażeniem na sumę szeregu:
co daje
ze względu na postać licznika.
Funkcje Ek(x) tworzą ciąg ortogonalnych (ortonormalnych) jednomianów
eksponencjalnych, z których można utworzyć wielomian:
Wielomian eksponencjalny może posłużyć do interpolacji funkcji f(x).
N
X
¡1 j=0¸
j= ¸
N¡ 1
¸ ¡ 1 ; ¸ 6= 1
Załóżmy, że jej wartości są określone na siatce zbudowanej z równoodległych węzłów:
Wielomian interpolujący ma wówczas postać
Współczynniki znajdziemy licząc iloczyny skalarne (lewa i prawa strona) z kolejnymi jednomianami Em
Ciąg współczynników cm wyznaczanych zgodnie z powyższym wzorem definiuje dyskretną
transformatę Fouriera (DFT – to wynik przekształcenia).
W metodzie najmniejszych kwadratów wielomian ten może posłużyć do
aproksymacji funkcji f(x) gdy stopień wielomianu aproksymującego jest mniejszy od N-1.
f (x) = P (x) =
N
X
¡1 k=0c
kE
k(x) x
j= 2¼j
N ; j = 0; 1; : : : ; N ¡ 1 e
2¼I(k¡m)=N= 1 , k ¡ m
N 2 Z Z Z
e
2¼I(k¡m)¡ 1
e
2¼I(k¡m)=N¡ 1 = 0
P (x) =
N
X
¡1 k=0c
ke
Ikx=
N
X
¡1 k=0c
k(e
Ix)
k=
X
n k=0c
kE
k(x)
hf; E
mi =
N
X
¡1 k=0c
khE
k; E
mi =
N
X
¡1 k=0c
k±
k;m= c
mf (x) = P (x) =
N
X
¡1 k=0hf; E
kiE
kDFT można zapisać wykorzystując postać macierzową
Transformatę można znaleźć wykonując „tylko” mnożenie wektora przez macierz. Ale w ten sposób należy wykonać O(N2) operacji arytmetycznych.
Jednakże macierz E ma specyficzną postać – jej elementy są ze sobą ściśle powiązane co można wykorzystać w celu
zmniejszenia nakładu obliczeń.
Dzięki FFT liczba wykonywanych operacji może zmaleć do wartości O(Nlog2N).
0 B B B @
E
0(x
0) E
0(x
1) : : : E
0(x
N¡1) E
1(x
0) E
1(x
1) : : : E
1(x
N¡1)
.. . .. . . .. .. .
E
N¡1(x
0) E
N¡1(x
1) : : : E
N¡1(x
N¡1) 1 C C C A
0 B B B @
f (x
0) f (x
1)
.. . f (x
N¡1)
1 C C C A =
0 B B B @
c
0c
1.. . c
N¡11 C C C A Ef = c
N N
2N ¢ log
2(N )
1024 1048576 10240
4096 16777216 49152
16384 268435456 229375
6 FFT z rozkładem na czynniki pierwsze
(PFA - Prime Factor Algorithm)
Liczbę naturalną możemy zapisać jako
gdzie: ri są liczbami pierwszymi przykład
Idea algorytmu PFA polega na zastąpieniu
obliczeń DFT w jednym wymiarze (skala N2), na obliczeniu iloczynu p transformat DFT
skalujących się jak
Algorytm PFA zmniejsza nakład obliczeń z N2 do N(r1+r2+...+rp)
Zakładamy, że funkcja f(x) jest stablicowana w n węzłach
Funcję rozwijamy w bazie wielomianów eksponencjalnych
N = r
1r
2: : : r
pr
12; r
22; : : : ; r
p2; N = 56 = 2 ¢ 2 ¢ 2 ¢ 7
x
j= 2¼j
n ; j = 0; 1; : : : ; n ¡ 1
Wykorzystując własności wielomianów, współczynniki rozwinięcia zapisujemy w postaci
Oznaczenia:
Rozkładamy liczbę węzłów na iloczyn liczb pierwszych:
i wprowadzamy kolejne oznaczenia:
n = r
1r
2: : : r
pn
º= r
º+1r
º+2: : : r
p=
Y
p i=º+1r
iº = 0; 1; : : : ; p ¡ 1
n
p= 1
n = r
1r
2: : : r
ºn
ºF (x) =
n
X
¡1 k=0c
ke
Ikxc
k= 1 n
n
X
¡1 j=0f (x
j)e
¡Ikxj; k = 0; 1; : : : ; n ¡ 1
w = exp ¡
¡
I2¼n¢ a
j=
n1f ¡
2¼jn
¢
¾
c
k=
n
X
¡1 j=0a
jw
kjZmienną k zapisujemy w postaci:
i podobnie ułamek j/n:
k = ®
1n
1+ ®
2n
2+ : : : + ®
pn
p®
12 f0; 1; : : : ; r
1¡ 1g
®
22 f0; 1; : : : ; r
2¡ 1g .. .
®
p2 f0; 1; : : : ; r
p¡ 1g
l
12 f0; 1; : : : ; r
1¡ 1g l
22 f0; 1; : : : ; r
2¡ 1g
.. .
l
p2 f0; 1; : : : ; r
p¡ 1g
k
º=
X
p i=º+1®
in
ij
ºn
º=
p¡1
X
i=º
l
i+1n
ik
º< n
º; º = 0; 1; : : : ; p
j
n = l
1n
0+ l
2n
1+ : : : l
pn
p¡1M 2 Z Z Z k ¢ j
n =
Ã
pX
i=1
®
in
i! Ã
p¡1X
º=0
l
º+1n
º!
=
p¡1
X
º=0
l
º+1n
ºÃ
pX
i=º+1
®
in
i!
+ M
=
p¡1
X
º=0
l
º+1k
ºn
º+ M
8 Wykorzystujemy uzyskany wynik do
obliczenia wkj
Chcemy znaleźć wartość współczynników ck
Wykorzystujemy teraz zależność pomiędzy wskaźnikiem j a l1,l2,...,lp
w sumowaniu. Sumę po j możemy zapisać jako
ponieważ każdą wartość j realizuje odpowiednia kombinacja wskaźników l1,l2,...,lp.
To przejście pozwala zapisać współczynnik ck
jako iloczyn p transformat DFT jednowymiarowych.
j = l
1+ l
2r
1+ : : : + l
pr
1r
2: : : r
pn¡1
X
j=0
!
r
X
1¡1 l1=0r
X
2¡1 l2=0: : :
r
X
p¡1 lp=0w
kj= exp µ
¡2¼I kj n
¶
= exp Ã
¡2¼I
Ã
p¡1X
º=0
l
º+1k
ºn
º+ M
!!
=
p
Y
¡1 º=0exp µ
¡2¼I l
º+1k
ºn
º¶
=
p
Y
¡1 º=0w
kººlº+1c
k=
n
X
¡1 j=0f (x
j) n exp
µ
¡Ik 2¼j n
¶
=
n
X
¡1 j=0f (x
j)
n w
kjStartujemy od obliczenia jednowymiarowego DFT dla wartości funkcji w węzłach, których indeksy zależą od aktualnych wartości l1,l2,...,lp
Takich transformat będzie n/rp , a wyznaczenie każdej z nich wiąże się z nakładem obliczeń rzędu (rp)2
następnie obliczamy
Po wyznaczeniu w ten sposób p transformat dostajemy żądany współczynnik ck (procedurę powtarzamy dla każdej wartości k).
c
(1)(l
1; l
2; : : : ; ®
p) =
r
X
p¡1 lp=0c
(0)(l
1; l
2; : : : ; l
p)w
pk¡1p¡1lpc
(2)(l
1; l
2; : : : ; ®
p¡1; ®
p) =
rp¡1
X
¡1 lp¡1=0c
(1)(l
1; l
2; : : : ; l
p¡1; ®
p)w
kp¡2p¡2lp¡1c
k= c
(p)(®
1; ®
2; : : : ; ®
p¡1; ®
p) =
r
X
1¡1c
(p¡1)(l
1; ®
2; : : : ; ®
p¡1; ®
p)w
0k0l1c
k= c(l
1; l
2; : : : ; l
p)
=
r
X
1¡1 l1=0r
X
2¡1 l2=0: : :
r
X
p¡1 lp=0c
(0)(l
1; l
2; : : : ; l
p)w
0k0l1w
k11l2: : : w
kpp¡1¡1lpc
0= f (x
j)
n ; j = l
1+ l
2r
1+ : : : + l
pr
1r
2: : : r
p10 Algorytm radix-2
Najprostszy algorytm FFT to radix-2 (Cooley- Tukey) opracowany w latach 60 XX wieku w celu szybkiej analizy danych sejsmologicznych.
Naszym zadaniem jest obliczenie
współczynników transformaty Fouriera (DFT) ck, ale wykonując jak najmniej obliczeń.
Zakładamy że całkowita liczba węzłów jest potęgą 2:
x
j= 2¼ N j
j = 0; 1; 2; : : : ; N ¡ 1 N = 2
r; r 2 N N N
Osobno grupujemy składniki a) parzyste
b) nieparzyste
j = 2m j = 2m + 1
c
k= hE
k; f i =
N
X
¡1 j=0f (x
j)E
k(x
j)
=
N
X
¡1 j=0f (x
j)exp ( ¡Ix
jk)
=
N
X
¡1 j=0f
jexp µ
¡I 2¼ N jk
¶
c
k=
N 2 ¡1
X
m=0
f
2mexp µ
¡I 2¼
N (2m)k
¶
+
N 2 ¡1
X
m=0
f
2m+1exp µ
¡I 2¼
N (2m + 1)k
¶
c
k=
N 2 ¡1
X
m=0
f
2mexp µ
¡I 2¼
N=2 mk
¶
+exp µ
¡I 2¼ N k
¶
NX
2 ¡1 m=0f
2m+1exp µ
¡I 2¼
N=2 mk
¶
c
k= p
k+ '
kq
kKorzystamy teraz z okresowości wyrazów pk oraz qk:
Natomiast czynnik fazowy ma następującą własność:
p
k+N=2= p
kq
k+N=2= q
kUwagi:
a) współczynniki pk oraz qk można wyliczyć dzięki DFT nakładem O(N/2)2=O(N2/4)
b) dodatkowo oszczędzamy czas wyznaczając tylko współczynniki dla
ponieważ
Kolejnym krokiem w FFT jest podział sum w pk oraz w qk na sumy zawierające tylko elementy parzyste i nieparzyste. Po podziale liczba elementów w każdej z dwóch powstałych sum jest dwukrotnie mniejsza niż w elemencie macierzystym.
Proces rekurencyjnego podziału kończymy gdy liczba elementów jest równa 1.
k < N 2
c
k= 8 <
:
p
k+ '
kq
k; k <
N2p
k¡N2
¡ '
kq
k¡N2
; k ¸
N2p
k=
N 2 ¡1
X
m=0
f
2mexp µ
¡I 2¼
N=2 mk
¶
q
k=
N 2 ¡1
X
m=0
f
2m+1exp µ
¡I 2¼
N=2 mk
¶
'
k= exp µ
¡I 2¼ N k
¶
'
k+N=2= exp µ
¡I 2¼ N
µ
k + N 2
¶¶
= exp µ
¡I 2¼ N k
¶ exp
µ
¡I 2¼ N
N 2
¶
= ¡exp µ
¡I 2¼ k
¶
= ¡'
12 Inne algorytmy FFT
1) Algorytm Winograda/Radera – DFT jest sformułowane w postaci cyklicznego splotu. Modyfikacja Winograda algorytmu FFT działa gdy N=pm , p -liczba pierwsza.
2) Split-radix – modyfikacja algorytmu Cooleya-Tukeya. W każdym kroku DFT jest wyrażana jako suma DFT dla N/2 oraz dwóch DFT dla N/4. Jest to najszybszy algorytm FFT.
3) DST (discrete sine transform) oraz DCT (discrete cosine transform) – transformaty sinusowa i kosinusowa, opłaca się je stosować gdy transformację przeprowadzamy na funkcjach rzeczywistych. Unikamy w ten sposób operacji na liczbach zespolonych co jest kosztowne.
Wielowymiarowa FFT
Współczynnki wyznacza się stosując algorytm
jednowymiarowego FFT kolejno dla każdego z wymiarów.
N = N
1N
2: : : N
dc
k1;k2;:::;kd=
N1
X
j1=0 N2
X
j2=0
: : :
Nd
X
jd=0
f
j1;j2;:::;jdexp µ
¡i2¼
µ j
1k
1N
1+ j
2k
2N
2+ : : : + j
dk
dN
d¶¶
Zastosowania FFT:
1) interpolacja, aproksymacja 2) szybkie mnożenie
3) cyfrowe przetwarzanie sygnału (np. odszumianie – widmo częstotliwości) 4) kompresja danych
5) analiza sygnałów czasowych (korelacja, splot)
6) rozwiązywanie równań różniczkowych (rów. Poissona)
14 Szybkie mnożenie wielomianów przy
użyciu FFT
Chcemy obliczyć iloczyn dwóch wielomianów
Jeśli stopnie wielomianów są różne to je
wyrównujemy dodając do wielomianu niższego stopnia współczynniki równe 0.
Iloczyn wielomianów
Dokonujemy reindeksacji wskaźników
P (x) =
n
X
¡1 i=0a
ix
iQ(x) =
n
X
¡1 i=0b
ix
ii + j = k ! j = k ¡ i R(x) = P (x)Q(x) =
n
X
¡1 i=0a
ix
in
X
¡1 j=0b
jx
j=
n
X
¡1 i;j=0a
ib
jx
i+jR(x) =
2n
X
¡2 k=0n
X
¡1 i=0a
ib
k¡ix
k=
2n
X
¡1 k=0c
kx
kc
k=
n
X
¡1 i=0a
ib
k¡iJeśli współczynniki wielomianów ai oraz bi potraktujemy jako współrzędne wektorów
to wektor c jest ich splotem:
Korzystając z definicji tranformacji Fouriera dla splotu funkcji możemy zapisać
a a a = [a
0; a
1; : : : ; a
n¡1] bbb = [b
0; b
1; : : : ; b
n¡1]
ccc = a a a ¤ bbb
ccc = F F T
¡1h
F F T (~ a ~ a a)F F T (~b~b~b) ~ i
~
a~ a ~ a = [a
0; a
1; : : : ; a
n¡1; a
n; : : : ; a
2n¡1]
~b~b~b = [b
0; b
1; : : : ; b
n¡1; b
n; : : : ; b
2n¡1] c
2n¡1= 0
a
i; b
i= 0 , i > n ¡ 1
Filtracja sygnału
FFT
Dyskryminacja szumu
FFT-1
f (x) = cos(x) + cos(2x) + cos(3x)
16 Rozwiązywanie równania Poissona (2D, 3D)
dokonujemy transformacji (FFT) całego równania (do przestrzeni odwrotnej)
skąd już łatwo wyznaczymy Vk
i gotowe rozwiązanie (w przestrzeni rzeczywistej)
Uwaga: musimy jeszcze uwzględnić warunki brzegowe (WB) .
1) jeśli WB są typu Dirichleta
to wykonujemy DST-FFT dla wnętrza obszaru, a WB uwzględniamy dokonując transformat
potencjału na brzegach – wyniki dodajemy 2) jeśli WB są typu Neumanna
r
2V
r= ½
rk
2V
k= ½
kV
k= ½
kk
2V
r= F F T
¡1fV
kg
V
rj
brzeg= V
b6= 0
@V
r@~n j
brzeg= 0
to wówczas stosujemy DCT-FFT dla wnętrza obszaru. WB są automatycznie spełnione.
Całkowanie
Chcemy obliczyć całkę oddziaływania dwóch gęstości ładunku/materii
która zawiera osobliwość. Całkę możemy zapisać nieco inaczej
Potencjał V(r1) jest splotem dwóch funkcji:
gęstości i funkcji f. Można więc wykorzystać tu twierdzenie o splocie i jego transformacie:
Transformata odwrotna ostatniego iloczynu daje poszukiwany potencjał.
F F T fV g = F F T f½
2¤ fg
= F F T f½
2g ¢ F F T f½
2g j~r
1¡ ~r
2j
¡1= f (~r
1¡ ~r
2) = f (~r
2¡ ~r
1)
C = Z
ba
d~r
1Z
ba
d~r
2½
1(~r
1)½
2(~r
2) j~r
1¡ ~r
2j
C = Z
ba