Diskretna Fourierjeva transformacija/algoritem
Iz E-študij, proste zakladnice študentskega znanja
- je linearna preslikava, ki slika iz enega vektorskega prostora v n-dimenzionalni prostor. Se pravi, da vektor slikamo v vektor v drugem prostoru. vektorski prostor je obseg in MORA vsebovati primitivni koren
- v kompleksnem prostoru za vsak n obstaja n-ti primitivni koren. Najosnovnejši primer primitivnega korena v kompleksnem prostoru je
- zahtevnost algoritma je reda n log(n)
Literatura (odlomek iz knjige Osnovni algoritmi): http://lalg.fri.uni-lj.si/~vilfan/DFT.pdf
Vsebina |
Rekurzivni algoritem
Nimam cajta za teorijo, bom samo postopek v praksi napisal.
- zapišemo polinom po naraščajočih stopnjah
- če manjkajo koeficienti do 4 ali 8 dopišemo ničle
- v prvi delni polinom napišemo koeficiente, ki so poleg x-ov lihe stopnje, v drugi delno pa sode stopnje
- Točko 3 ponavljamo na delnih polinomih, dokler ne pridemo do polinoma stopnje 0
- vsakokrat ko obiščemo točko 4 razpolovimo n in se vračamo na 3
- zapišemo polinome po formuli 3.16 in knjige: formula zgleda:
- p(ωk) = ωk * p1(ω2k) + p2(ω2k)
- p(ωk + r) = ωk + r * p1(ω2(k + r)) + p2(ω2(k + r))
- kar je enako
- p(ωk + r) = − ωk * p1(ω2k) + p2(ω2k)
- vseskupaj izhaja iz: n=2r in ωj + r = − ωj velja še več (ωj + r)2 = ω2j
- Nadaljujem s sestavljenjem in povečevanjem n dokler ne pridem do osnovnega n
Da bo stvar bolj jasna:
Primer
p(x) = 1 + 2x + 3x2 + 4x3 v Z5
Pa začnimo: ω je potemtakem 2, n=4
razbijemo na polinoma: p1(x) = 2 + 4x
p2(x) = 1 + 3x
ker še nimamo samo x^0 ponovimo vajo
p11(x) = 4
p12(x) = 2
p21(x) = 3
p22(x) = 1
pravtako, ker po prvem razbitju nismo imeli še rezultata smo razbili n=2, torej je naša nove omega 4, ker je 4^2=1, pa zdej začnimo sestavljat:
p1(ω0) = ω0 * p11(ω0) + p12(ω0) = 1 * 4 + 2 = 1
p2(ω0) = ω0 * p21(ω0) + p22(ω0) = 1 * 3 + 1 = 4
zdej se pa prestavimo nazaj na n=4, pa ponovimo
p(ω0) = ω0 * p1(ω0) + p2(ω0) = 1 * 1 + 4 = 5 = 0
p(ω1) = ω1 * p1(ω2) + p2(ω2) = 2 * 3 + 3 = 4
Torej je naš rezultat [ 0, 4, 3 ,2 ]
Iterativni algoritem
Imamo p(x), zanima nas pa p(ω0), p(ω1), ..., p(ωn-1).
p(x) lahko predstavimo tudi kot
p(x) = Q(x)(x-a) + r(x)
predvsem pa uporabljamo lastnost matematike:
p(x) mod(s(x)) = [p(x) mod(s(x))] mod(s(x))
Če uporabimo nekaj srednješolske matematike in se spomnimo, da je stopnja ostanka manjša od deljitelja
st(r(x)) < st(x-a) = 1
in da velja
p(a) = r(a)
Zanima nas torej ostanek r(x)
p(x) = Q(x)(x-a)(x-b)...(x-ž) + r(x)
Pri tem računanju je veliko dragih deljenj, ki pa jih je možno s pravilno razporeditvijo ugodno "poceniti". ω0, ω1, ..., ωn-1 premešamo in premešane poimenujemo v c0, c1, ..., cn-1.
Za manj operacij vzamemo 2r = n in razdelimo računanje DFT na dva podproblema:
q1(x) = (x-c0)(x-c1)...(x-cr-1) q2(x) = (x-cr)(x-cr+1)...(x-cn-1)
"Mešanje" potenc ω poteka po točno določeni formuli
- cj = ωrev(j),
kjer funkcija rev() pomeni operacijo zamenjave vrstnega reda bitov, bit reverse. Tako se npr. pretvorijo indeksi, če imamo 4 potence:
j -> j2 -> rev(j)2 -> rev(j) 0 -> 00 -> 00 -> 0 1 -> 01 -> 10 -> 2 2 -> 10 -> 01 -> 1 3 -> 11 -> 11 -> 3