Diskretna Fourierjeva transformacija/algoritem

Iz E-študij, proste zakladnice študentskega znanja

Skoči na: navigacija, iskanje
  • 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 e^{\frac{2 i \pi}{n}}
  • 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.

  1. zapišemo polinom po naraščajočih stopnjah
  2. če manjkajo koeficienti do 4 ali 8 dopišemo ničle
  3. v prvi delni polinom napišemo koeficiente, ki so poleg x-ov lihe stopnje, v drugi delno pa sode stopnje
  4. Točko 3 ponavljamo na delnih polinomih, dokler ne pridemo do polinoma stopnje 0
  5. vsakokrat ko obiščemo točko 4 razpolovimo n in se vračamo na 3
  6. zapišemo polinome po formuli 3.16 in knjige: formula zgleda:
pk) = ωk * p12k) + p22k)
pk + r) = ωk + r * p12(k + r)) + p22(k + r))
kar je enako
pk + r) = − ωk * p12k) + p22k)
vseskupaj izhaja iz: n=2r in ωj + r = − ωj velja še več j + r)2 = ω2j
  1. 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:

p10) = ω0 * p110) + p120) = 1 * 4 + 2 = 1

p_1(\omega^1)=\omega^1*p_{11}(\omega^2) + p_{12}(\omega^2)= -1*4 + 2 = -2 = 3;\ \ \omega^1 == -\omega^0,\  ker\ je\  r=1


p20) = ω0 * p210) + p220) = 1 * 3 + 1 = 4

p_2(\omega^1)=\omega^1*p_{21}(\omega^2) + p_{22}(\omega^2)= -1*3 + 1 = -2 = 3;\ \ \omega^1 == -\omega^0,\  ker\ je\  r=1

zdej se pa prestavimo nazaj na n=4, pa ponovimo

p0) = ω0 * p10) + p20) = 1 * 1 + 4 = 5 = 0

p1) = ω1 * p12) + p22) = 2 * 3 + 3 = 4

p(\omega^2)= \omega^2*p_1(\omega^4) + p_2(\omega^4) = -1*1+4 = 3\ ;\ r=2\ ;\  \omega^4 == (\omega^{0+{4 \over 2}})^2 == \omega^0

p(\omega^3)= \omega^3*p_1(\omega^6) + p_2(\omega^6) = -2*3+3 = 2\ ;\ r=2\ ;\  \omega^6 == (\omega^{1+{4 \over 2}})^2 == \omega^2

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

Konvolucija polinomov

Osebna orodja
Imenski prostori
Različice
Dejanja
navigacija

Tiskanje/izvoz
orodja