]> mj.ucw.cz Git - ads2.git/blob - 9-fft/9-fft.tex
b2e0639e5df2b456038f1130888abbf6cf154526
[ads2.git] / 9-fft / 9-fft.tex
1 \input lecnotes.tex
2 \def\imply{\Rightarrow}
3 \prednaska{8}{Fourierova transformace}{ \vbox{\hbox{(K.Jakubec, M.Polák
4         a~G.Ocsovszky,}\hbox{\ V.Tùma, M.Kozák)}}}
5
6 Násobení polynomù mù¾e mnohým pøipadat jako pomìrnì (algoritmicky) snadný
7 problém. Asi ka¾dého hned napadne \uv{hloupý} algoritmus -- vezmeme
8 koeficienty prvního polynomu a~vynásobíme ka¾dý se v¹emi koeficienty druhého
9 polynomu a~pøíslu¹nì u~toho seèteme i~exponenty (stejnì jako to dìláme, kdy¾
10 násobíme polynomy na~papíøe). Pokud stupeò prvního polynomu je $n$ a~druhého
11 $m$, strávíme tím èas $\Omega(mn)$. Pro $m=n$ je to kvadraticky pomalé.
12 Na~první pohled se mù¾e zdát, ¾e rychleji to prostì nejde (pøeci musíme
13 v¾dy vynásobit \uv{ka¾dý s~ka¾dým}). Ve skuteènosti to ale rychleji fungovat
14 mù¾e, ale k~tomu je potøeba znát trochu tajemný algoritmus FFT neboli {\I Fast
15 Fourier Transform}.
16
17
18 \ss{Trochu algebry na~zaèátek:}
19 \>Libovolný polynom $P$ stupnì $n$ lze reprezentovat dvìma rùznými zpùsoby:
20
21 \itemize\ibull
22 \:svými koeficienty, èili èísly $p_{0}, p_{1}, \ldots ,p_{n}$, nebo
23 \:svými hodnotami v~$n$ rùzných bodech $x_{0}, x_{1}, \ldots , x_{n}$, èili
24 èísly $P(x_{0}),$ $P(x_{1}),$ $\ldots , P(x_{n})$.
25 \endlist
26
27 \>Dostateènost $n+1$ hodnot pro urèení druhým zpùsobem lze dokázat
28 následnovnì: polynom stupnì $n$ má maximálnì $n$ koøenù (indukcí, je-li
29 $k$ koøenem $P$, pak lze $P$ napsat jako $(x-k)Q$ kde $Q$ je polynom stupnì
30 o~jedna men¹í, pøitom polynom stupnì 1 má jediný koøen); uvá¾íme-li
31 dva rùzné polynomy $P$ a~$Q$ stupnì $n$ nabývající v~daných bodech stejných
32 hodnot, tak $P-Q$ je polynom stupnì maximálnì $n$, ka¾dé
33 z $x_{0}\ldots x_{n}$ je koøenem tohoto polynomu $\imply$ spor, polynom stupnì
34 $n$ má $n+1$ koøenù $\imply$ $P-Q$ musí být nulový polynom $\imply$ $P=Q$.
35 \medskip        
36
37 \ss{Konvence:}
38 Celé polynomy oznaèujeme velkými písmeny, jednotlivé èleny polynomù pøíslu¹nými
39 malými písmeny (pø.: polynom $W$ stupnì $n$ má koeficienty $w_{0}, w_{1},
40 w_{2},\ldots, w_{n}$).
41
42 Pov¹imnìme si jedné skuteènosti -- máme-li dva polynomy $A$ a~$B$ stupnì $n$
43 a~body $x_{0}, \ldots, x_{k}$, dále polynom $C=A \cdot B$ (stupnì $2n$), pak
44 platí $C(x_{k}) = A(x_{k}) \cdot B(x_{k}), k = 0,1,2, \ldots, n.$ Toto èiní
45 tento druhý zpùsob reprezentace polynomu velice atraktivním pro násobení.
46 Problémem je, ¾e typicky máme polynom zadaný koeficienty a~ne hodnotami
47 v~bodech. Tím pádem potøebujeme nìjaký hodnì rychlý algorimtus (tj.
48 rychlej¹í ne¾ kvadratický, jinak bychom si nepomohli oproti hloupému
49 algoritmu) na~pøevod polynomu z jedné reprezentace do druhé a~zase zpìt.
50
51 Dále bychom si mìli uvìdomit, ¾e stupeò na¹eho výsledného polynomu $C$ bude
52 $\leq 2n$ (kde $n$ je stupeò výchozích polynomù). Pokud chceme polynom $C$
53 reprezentovat pomocí jeho hodnot v~bodech, musíme tedy vzít alespoò $2n$
54 bodù. Tímto konèí malá algebraická vsuvka.
55
56 \s{Idea, jak by mìl algoritmus pracovat:}
57 \algo
58 \:Vybereme $2n$ bodù $x_{0}, x_{1}, \ldots , x_{2n-1}$.
59 \:V tìchto bodech vyhodnotíme polynomy $A$ a~$B$.
60 \:Nyní ji¾ v~lineárním èase získáme hodnoty polynomu $C$ v~tìchto bodech
61         (viz vý¹e).
62 \:Pøevedeme hodnoty polynomu $C$ na~jeho koeficienty.
63 \endalgo
64
65 \>Je vidìt, ¾e klíèové jsou kroky 2 a~4. Vybrání bodù jistì stihneme pohodlnì
66 v~lineárním èase a~vynásobení samotných hodnot té¾ (máme $2n$ bodù a~$C(x_{k})
67 = A(x_{k}) \cdot B(x_{k}), k = 0,1,2, \ldots , 2n-1$, tak¾e na~to nepotøebujeme
68 více ne¾ $2n$ násobení).
69
70 Celý trik spoèívá v~chytrém vybrání onìch bodù, ve kterých budeme polynomy
71 vyhodnocovat. Je na~to potøeba vìdìt pár zajímavostí o~komplexních èíslech,
72 na~webové stránce pøedná¹ky jsou k dispozici slajdy, zde to bude zapsáno
73 o~trochu struènìji.
74
75 \ss{  Vyhodnocení polynomu metodou Rozdìl a~panuj (algoritmus FFT):}
76 Mìjme polynom $P$ øádu $n$ a~chtìjme jej vyhodnotit v~$n$ bodech. Vybereme si
77 body tak, aby byly spárované, èili $\pm x_{0}, \pm x_{1}, \ldots , \pm
78 x_{n/2-1} $. To nám výpoèet urychlí, proto¾e pak se druhé mocniny $x_{j}$
79 shodují s~druhými mocninami $-x_{j}$.
80
81 Polynom $P$ rozlo¾íme na~dvì èásti, první obsahuje èleny se sudými exponenty,
82 druhá s~lichými:
83 $$P(x) = (p_{0}x^{0} + p_{2}x^{2} + \ldots + p_{n-2}x^{n-2}) + (p_{1}x^{1} +
84         p_{3}x^{3} + \ldots + p_{n-1}x^{n-1})$$
85 \>se zavedením znaèení:
86 $$P_s(x^{2}) = p_{0}x^{0} + p_{2}x^{2} + \ldots + p_{n - 2}x^{n - 2}$$
87 $$P_l(x^{2}) = p_{1}x^{1} + p_{3}x^{3} + \ldots + p_{n - 1}x^{n - 1}$$
88
89 \>Dohromady $P(x) = P_s(x^{2}) + xP_l(x^{2})$ a~$P(-x) = P_s(x^{2}) -
90 xP_l(x^{2})$. Jinak øeèeno, vyhodnocování $P$ v~$n$ bodech se nám smrskne
91 na~vyhodnocení $P_s(x)$ a~$P_l(x)$ (oba jsou polynomy stupnì $n/2$ 
92 a~vyhodnocujeme je nyní v~$x^{2}$) v~$n/2$ bodech (proto¾e $(x_{i})^{2} =
93 (-x_{i})^{2}$).
94
95 \s{Pøíklad:}
96 $3 + 4x + 6x^{2} + 2x^{3} + x^{4} + 10x^{5} = (3 + 6x^{2} + x^{4}) + x(4 +
97 2x^{2} + 10x^{4})$.
98
99 Teï nám ov¹em vyvstane problém s~oním párováním -- druhá mocina pøece nemù¾e
100 být záporná a~tím pádem u¾ v~druhé úrovni rekurze body spárované nebudou.
101 Z~tohoto dùvodu musíme pou¾ít komplexní èísla -- tam druhé mocniny záporné býti
102 mohou. Jako $x_{0}, \ldots , x_{n-1} $ si zvolíme mocniny
103 $n$-té primitvní odmocniny z jedné (oznaèíme si ji jako $\omega$). Pøipomeòme:
104 $\omega$ je $n$-tá odmocnina z $1$ je {\it primitivní} $\equiv$ $(\forall k)
105 (k<n)\ \omega^k \neq 1$ a~$\omega^n = 1$. Máme $n$ navzájem rùzných odmocnin
106 z~jednièky, rovnomìrnì rozesetých po jednotkové kru¾nici, BÚNO $n=2^{k}, k \in
107 N$ (jinak viz slajdy Martina Mare¹e). Jednotlivé $x$ vypadají takto: $1,
108 \omega, \omega^{2}, \ldots , \omega^{n - 1} $, kde $\omega = e^{2 \pi i/ n}$.
109
110 \s{Pìt poznámek:}
111 \itemize\ibull
112 \:Pro $k\neq j,\ 0\leq k<j<n$ je $\omega^k \neq \omega^j$, nebo» $\omega^j /
113 \omega^k = \omega^{j-k}\neq 1$, proto¾e $j-k < n$ a~$\omega$ je $n$-tá
114 primitivní (a~tedy $\omega^0, \ldots, \omega^{n-1}$ jsou rùzné).
115 \:$\overline{\omega} = \omega^{-1}$, nebo» $\omega^{-1} = \omega^{-2\pi i/n}$
116 a~tedy èísla $\omega,\omega^{-1}$ svírají vùèi reálné ose opaèný úhel a~jsou
117         komplexnì sdru¾ená.
118 \:mocniny $\omega$ jsou spárované, èili $\omega^{j} = -\omega^{n/2 + j}$
119         (staèí si uvìdomit, ¾e $\omega^{n/2} = -1$ pro $n$ sudé)
120 \:umocníme-li v¹echny $\omega^{0},\ldots, \omega^{n-1}$ na~druhou, vzniknou nám
121         odmnocniny z~$1$ které budou i~nadále spárované: $\omega^n$ je toti¾
122         $1$ a~exponenty lze tedy poèítat$\mod n$, $n$ je sudé $\imply$
123         dostaneme pùvodní posloupnost ze které zmizí liché mocniny $\omega$, ale $n$
124         je mocnina dvojky a~tedy i~$n/2$ je sudé (pro $n=2$ ne, ale tam je to
125         triviální), tak¾e sudé mocniny jsou spárované navzájem..
126 \:$\omega^2$ je $n/2$-tá primitivní odmocnina z 1 -- je toti¾ $(\omega^{-2\pi
127         i/n})^2 = \omega^{-2\pi i/(n/2)}$ a~$n$ je mocnina dvojky.
128 \endlist
129
130 \ss{Celý algoritmus bude vypadat takto:}
131 \>FFT($P$, $ \omega$)
132
133 \>{\sl Vstup:} $p_{0}, \ldots , p_{n-1}$, koeficienty polynomu $P$, a~$\omega$,
134 $n$-tá primitivní odmocina z jedné.
135
136 \>{\sl Výstup:} Hodnoty polynomu v~bodech $1, \omega, \omega^{2}, \ldots ,
137 \omega^{n - 1}$, èili èísla $P(1), P(\omega), P(\omega^{2}),$ $\ldots ,
138 P(\omega^{n - 1})$.
139
140 \algo
141 \:Pokud $n = 1$, vrátíme $p_{0}$ a~skonèíme.
142 \:Jinak rozdìlíme $P$ na~sudé a~liché koeficienty a~rekurzivnì zavoláme
143         FFT($P_s$, $\omega^{2}$) a~FFT($P_l$, $\omega^{2}$) -- $P_l$ i~$P_s$
144         jsou stupnì max. $n/2-1$ a~$\omega^2$ je $n/2$-tá primitivní odmocnina.
145 \:Pro $j = 0, \ldots , n/2 - 1$ spoèítáme:
146
147 \:\qquad $P(\omega^{j}) = P_s(\omega^{2j}) + \omega^{j}\cdot P_l(\omega^{2j})$.
148
149 \:\qquad $P(\omega^{j+n/2})=P_s(\omega^{2j})-\omega^{j}\cdot P_l(\omega^{2j})$.
150
151 \endalgo
152
153
154 \s{Èasová slo¾itost:}
155 \>$T(n)=2T(n/2) + \Theta(n) \Rightarrow$ slo¾itost $\Theta(n \log n)$, jako
156 MergeSort.
157
158
159 Máme tedy algoritmus, který pøevede koeficienty polynomu na~hodnoty tohoto
160 polynomu v~rùzných bodech. Potøebujeme ale také algoritmus, který doká¾e
161 reprezentaci polynomu pomocí hodnot pøevést zpìt na~koeficienty polynomu.
162 K~tomu nám pomù¾e podívat se na~ná¹ algoritmus trochu obecnìji.
163
164
165 \s{Definice:}
166 \>{\I Diskretní Fourierova transformace} $(DFT)$
167 je zobrazení $f: { {\bb C} ^n} \rightarrow { {\bb C} ^n}$, kde $$y=f(x) \equiv
168 \forall j \ y_{j} = \sum \limits ^{n-1}_{k=0} x_{k} \cdot \omega ^{jk}$$
169 (pøestavme si ji jako funkci vyhodnocující polynom s~koeficienty $x$ v~bodech
170 $\omega^j$). Takovéto zobrazení je lineární a~tedy popsatelné maticí $\Omega$
171 s~prvky $\Omega_{jk} = \omega^{jk}$
172
173
174 \s{Jak najít inverzní matici?} Znaème $\overline{\Omega}$ matici, její¾ prvky
175 jsou komplexnì sdru¾ené odpovídajícím prvkùm $\Omega$, a vyu¾ijeme následující
176 lemma:
177
178 \ss{Lemma:}$\quad \Omega\cdot \overline{\Omega} = n\cdot E$
179
180 \proof $$ (\Omega\cdot \overline{\Omega})_{jk} = \sum_{l=0}^{n-1} \omega^{jl}
181 \cdot \overline{\omega^{lk}} = \sum \omega^{jl} \cdot \overline{\omega}^{lk} =
182 \sum \omega^{jl} \cdot \omega^{-lk} = \sum \omega^{l(j-k)}$$
183 \itemize\ibull
184 \:Pokud $j=k$, pak $ \sum \limits ^{n-1}_{l=0} (\omega ^{0}) ^{l} = n$.
185
186 \:Pokud $j\neq k$, pou¾ijeme vzoreèek pro souèet geometrické posloupnosti, kde
187 $a_{1}=1$ a~$q=\omega ^{(j-k) }$ a~dostaneme ${{\omega^{(j-k)n} -1} \over
188 {\omega^{(j-k)} -1}} ={1-1 \over r- 1} = {0 \over \neq 0} = 0$, kde $r$
189 je èíslo rùzné od jednièky (nebo» $\omega$ je $n$-tá primitivní odmoncina).
190 \endlist
191 \qed
192
193
194 \>Na¹li jsme inverzi:
195 $\Omega({1 \over n} \overline{\Omega}) = {1 \over n}\Omega \cdot
196 \overline{\Omega} = E$, \quad $\Omega^{-1}_{jk} = {1 \over n}\overline{\omega^
197 {jk}} = {1 \over n}\omega^{-jk} = {1 \over n} {(\omega^{-1})}^{jk}$, \quad
198 (pøipomínáme, $\omega^{-1}$ je $\overline{\omega}$, $\omega$ je $n$-tá
199 primitivní odmocnina z jednièky).
200
201 Ná¹ algoritmus poèítá tedy i~inverzní transformaci, pouze místo $\omega_n$
202 pou¾ijeme komplexnì zdru¾ené $\overline{\omega_n}$ a~matici vynásobíme $(1/n)$.
203 Co¾ je skvìlé -- staèí znát pouze jeden algoritmus u~kterého staèí v~jednom
204 pøípadì pou¾ít transformovanou matici a~vydìlit $n$.
205
206 \s{Výsledek:} Pro $n= 2^k$ lze DFT na~${\bb C}^n$ spoèítat v~èase $\Theta(n
207 \log n)$ a~DFT$^{-1}$ takté¾.
208
209 \s{Dùsledek:}
210 Polynomy stupnì $n$ lze násobit v~èase $\Theta(n \log n)$:
211 $\Theta(n \log n)$ pro vyhodnocení, $\Theta(n)$ pro vynásobení a~$\Theta(n
212 \log n)$ pro pøevedení zpìt.
213
214 \s{Pou¾ití:}
215
216 \itemize\ibull
217
218 \:Zpracování signálu -- rozklad na~siny a~cosiny o~rùzných frekvencích
219 $\Rightarrow$ spektrální rozklad.
220 \:komprese dat -- napøíklad formát JPEG.
221 \:Násobení dlouhých èísel v~èase $\Theta(n \log n)$.
222 \endlist
223
224 \s{Hardwarová implementace FFT}
225
226 \figure{img.eps}{Pøíklad prùbìhu algoritmu na~vstupu velikosti 8}{3in}
227
228
229 \>Obrázek ukazuje zapojení kombinaèního obvodu pro DFT pro vstup velikosti~8.
230 Hladin bude v¾dy $\log_2 n$, tj. v~na¹em pøípadì $\log_2 8 = 3$ hladiny.
231
232 \>Podívejme se na~pravou èást obrázku, tedy výstup celého obvodu. Èerná koleèka
233 pøedstavují podobvody, rovnice vedle nich operaci, kterou provádìjí. Hodnoty
234 $y_j$ znaèí hodnotu polynomu $P$ v~bodì $\omega^j$ kde $\omega^j$ je $j-tá$
235 mocnina primitivní $n$-té odmocniny z jednièky. K jejímu spoètení ale
236 potøebujeme znát hodnoty $s_k$ a~$l_k$ kde $k$ je z intervalu $[0, {n/2} -1]$
237 a~$s_k$ a~$l_k$ jsou hodnoty polynomu stupnì ${n/2}$ v~bodì $\omega^{2k}$.
238 V polynomu $s$ jsou sudé koeficienty a~v polynomu $l$ liché koeficienty
239 polynomu $P$. Vidíme, ¾e se jedná pøesnì o~ná¹ rekurzivní algoritmus pro
240 poèítání FFT a~tímto zpùsobem postavíme celou sí».
241 \>Tímto obvodem jsme tedy získali nerekurzivní algoritmus pro poèítání FFT.
242 V¹imìme si poøadí vstupních hodnot (koeficientù). Èísla jsou v~binárním tvaru
243 0--7 pøeètená pozpátku. Pro pøedstavu jaké koeficienty polynomu $P$ se objevují
244 v~rùzných hladinách, na~obrázku jsou naznaèena jejich èísla spolu s~pøíslu¹nými
245 mocninami primitivní $n$-té odmocniny z jednièky.
246
247 \s{Z~toho:}
248
249 \itemize\ibull
250 \:Kombinaèní obvod pro DFT
251 s~$\Theta(\log n)$ hladinami
252 a $\Theta(n)$ hradly na~hladinì.
253 \:Nerekurzivní algoritmus (postupujeme zleva) v~èase $\Theta(n \log n)$.
254
255 \endlist
256 \bigskip
257
258 \>Nakonec dodejme, ¾e poèítat lze nejen nad tìlesem komplexních èísel, ale
259 v podstatì nad ka¾dým komutativním tìlesem s~$n$-tou primitivní odmocninou
260 (pøíkladem jsou tìlesa øádu $p = 2^k + 1$, $p$ prvoèíslo) èi dokonce
261 komutativním okruhem s~multiplikativními inversemi pro øád vektoru
262 a~primitivní odmocninu.
263
264 \bye