Computer Vision Group Prof. Daniel Cremers€¦ · j m m ijk c m ijk c n ijk c n ijk c n ijk vc m k...

56
Computer Vision Group Prof. Daniel Cremers Die Schnelle Fourier-Transformation

Transcript of Computer Vision Group Prof. Daniel Cremers€¦ · j m m ijk c m ijk c n ijk c n ijk c n ijk vc m k...

  • Computer Vision Group Prof. Daniel Cremers

    Die Schnelle Fourier-Transformation

  • Dr. Rudolph TriebelNumerisches Programmieren

    Komplexe Zahlen und trigonometrische Interpolation

    2

    1−=i

    x=a+ib=(a,b)Imaginärteil Betrag r b=r⋅sin(ϕ) ϕ

    a = r⋅cos(ϕ) = Realteil

    Komplexe Zahl: Vektor (a,b) in der Ebene mit spezieller Multiplikation

  • 3

    x = a + i b = r ⋅ ( cos(ϕ) + i ⋅ sin(ϕ) ) = r ⋅ exp( i ϕ) = ( a , b ) = r ⋅ ( cos (ϕ) , sin(ϕ) ).

    ab

    baxr =+== )tan(,22 ϕ

    )sin()cos()!12(

    )1()!2(

    )1(

    )!12()(

    )!2()(

    !)(

    0

    12

    0

    2

    0

    12

    0

    2

    0

    ϕϕϕϕ

    ϕϕϕϕ

    ⋅+=+

    −⋅+

    −=

    =+

    +==

    ∑∑

    ∑∑∑∞

    =

    +∞

    =

    =

    +∞

    =

    =

    ik

    ik

    ki

    ki

    nie

    k

    kk

    k

    kk

    k

    k

    k

    k

    n

    ni

    Mögliche Darstellungen:

    mit

    x * y = (a+ib)*(c+id) = (ac-bd)+i(ad+bc) =

    = r exp(i ϕ) * s exp(i θ) = rs exp(i (ϕ+θ))

    (Beträge multipliziert, Winkel addiert)

    Multiplikation:

  • 4

    ϕieribax −⋅=−=konjugiert komplexe Zahl:

    -ϕϕ

    n-te Einheitswurzeln: xn = 1 = e2πi hat n Lösungen

    1,...,0),2sin()2cos()2exp( −=+=⋅ njnji

    nj

    nji πππ

    ( ) 1)2(8)4/( == ii ee ππ-i

    i exp(iπ/4) !!π/4 -1 1 für n=8

    e2πi - 1 = 0

  • 5

    Wir betrachten nun ein komplexes Interpolationsproblem mit den n-ten Einheitswurzeln als Stützstellen:

    )2exp(:1,...,1,0, nimitnjj πωω =−=

    Zu den n Stützstellen ωj und vorgegeben Werten vj, j=0,1,...,n-1, finde man das Polynom mit den Koeffizienten cj, j=0,1,...,n-1, so dass gilt: p(ωj) = vj, für j=0,1,...,n-1 , also

    ∑∑∑−

    =

    =

    =

    =⋅=⋅=

    =−⋅++⋅+=

    =$%&'

    ()==

    1

    0

    1

    0

    1

    0

    110

    )()2exp(

    ))1(2exp()2exp(

    )2exp()(

    n

    k

    kjk

    n

    k

    jkk

    n

    kk

    n

    jj

    ccnijkc

    nnijcn

    ijcc

    nijppv

    ωωπ

    ππ

    πω

    !

    für j=0,1,...,n-1

    . . .

  • 6

    Wie üblich erhalten wir lineares n x n – Gleichungssystem zur Bestimmung der cj:

    Diese Matrix Fn hat spezielle Eigenschaften:

    )(, 1 nnnHnn

    Tn FinvnFnFFFF ⋅=⋅===

    (dabei ist AH:= conj(AT) das Hermite’sche von A ) Damit erhält man die Lösung durch c = inv(Fn)*v

    ( ) kknn

    j

    jk

    ω

    ωω

    −=∑

    = 111

    0

    0BBBBBBBBBBBBBBBBBBBB@

    1 1 1 · · · 11 ! !2 · · · !n�11 !2 !4 · · · !2(n�1)...

    ......

    . . ....

    1 !n�1 !2(n�1) · · · !(n�1)(n�1)

    1CCCCCCCCCCCCCCCCCCCCA

    ·

    0BBBBBBBBBBBBBBBBBBBB@

    c0c1c2...

    cn�1

    1CCCCCCCCCCCCCCCCCCCCA

    =

    0BBBBBBBBBBBBBBBBBBBB@

    ⌫0⌫1⌫2...⌫n�1

    1CCCCCCCCCCCCCCCCCCCCA

    Fnc = ⌫

  • 7

    1,...,1,0,11

    0−== ∑

    =

    nkvn

    c jkn

    jjk ω

    mit , also

    Dies beschreibt gerade die Diskrete Fourier- Transformation (DFT), also

    0BBBBBBBBBBBBBBBBBBBB@

    c0c1c2...

    cn�1

    1CCCCCCCCCCCCCCCCCCCCA

    =1n

    0BBBBBBBBBBBBBBBBBBBB@

    1 1 1 · · · 11 !�1 !�2 · · · !�(n�1)1 !�2 !�4 · · · !�2(n�1)...

    ......

    . . ....

    1 !�(n�1) !�2(n�1) · · · !�(n�1)(n�1)

    1CCCCCCCCCCCCCCCCCCCCA

    ·

    0BBBBBBBBBBBBBBBBBBBB@

    ⌫0⌫1⌫2...⌫n�1

    1CCCCCCCCCCCCCCCCCCCCA

    !̄ = !�1 = exp(�2⇡i

    n)

  • 8

    1,...,1,0,11

    0−== ∑

    =

    nkvn

    c jkn

    jjk ω

    1,...,1,0,1

    0−==∑

    =

    njcv jkn

    kkj ω

    Die inverse DFT entspricht dem ersten Matrix-Vektor-Produkt

    DFT beschreibt den Zusammenhang zwischen Funktionswerten und (Polynom)-Koeffizienten (Frequenzen)

    0BBBBBBBBBBBBBBBBBBBB@

    c0c1c2...

    cn�1

    1CCCCCCCCCCCCCCCCCCCCA

    = DFT

    0BBBBBBBBBBBBBBBBBBBB@

    ⌫0⌫1⌫2...⌫n�1

    1CCCCCCCCCCCCCCCCCCCCA

    0BBBBBBBBBBBBBBBBBBBB@

    ⌫0⌫1⌫2...⌫n�1

    1CCCCCCCCCCCCCCCCCCCCA

    = IDFT

    0BBBBBBBBBBBBBBBBBBBB@

    c0c1c2...

    cn�1

    1CCCCCCCCCCCCCCCCCCCCA

  • 9

    Normalerweise sind daher die Kosten für die Durchführung einer DFT gerade die Kosten eines Matrix*Vektor-Produkts, also O(n2). Mittels ‚divide & conquer’ werden wir ein rekursives Verfahren herleiten, um die DFT in O(n log(n) ) Operationen auszuführen, die sog. FFT = Fast Fourier Transform

    Vorsicht: In der Literatur unterscheiden sich die Definition von DFT und IDFT manchmal im Vorfaktor 1/n oder sind vertauscht: z.B. DFT und IDFT beide unitär mit Faktor , oder einmal Faktor 1 und einmal 1/n

    n1

    Ein schneller Algorithmus ist sehr wichtig und nützlich, da die DFT sehr oft gebraucht wird ( ! Frequenzanalyse)

  • Dr. Rudolph TriebelNumerisches Programmieren

    Die Schnelle Fourier-Transformation (FFT)

    5.2.1. Rekursive Formulierung der IDFT: !Die IDFT besteht aus n Summen mit n Summanden, die aus Produkten mit n-ten Einheitswurzeln bestehen.

    10

    Idee: Zerlege die Summen geschickt in zwei Teilsummen halber Länge, aus denen sich die ursprünglichen Summen leicht gewinnen lassen.

    Dazu notwendig: n=2m gerade! Oder m=n/2. Aufteilung in Summanden zu geradem und ungeradem Index.

  • 11

    1,...,1,0,2

    exp2

    exp

    )12(2exp

    22exp

    2exp

    1

    012

    1

    02

    12/

    012

    12/

    02

    1

    0

    −="#

    $%&

    '⋅⋅+"#

    $%&

    '⋅=

    "#

    $%&

    ' +⋅+"#

    $%&

    '⋅=

    ="#

    $%&

    '⋅=

    ∑∑

    ∑∑

    =+

    =

    =+

    =

    =

    mjmijkc

    mijkc

    nkijc

    nkijc

    nijkcv

    m

    kk

    jm

    kk

    n

    kk

    n

    kk

    n

    kkj

    πω

    π

    ππ

    π

    j-te Komponente ! ωj .

    Daher erhält man also die erste Hälfte der Komponenten von v aus zwei IDFT’s halber Länge m, einmal angewendet auf den Vektor der geradzahligen Indizes von c, und einmal auf den Vektor der ungeradzahligen Indizes von c.

    Für j=0,1,...,m-1 erhält man die erste Hälfte der Komponenten

  • 12

    Daher ergibt sich die zweite Hälfte des Vektors v aus denselben Fouriertransformierten halber Länge wie vorher, diesmal aber aus der Differenz.

    11)2exp(2exp ===!"

    #$%

    & kikmimk

    ππ

    1)sin()cos()exp()2exp( −=⋅+=== ππππω iinimm

    und

    da

    ∑∑

    ∑∑−

    =+

    =

    =+

    +−

    =

    +

    #$

    %&'

    (⋅⋅−#$

    %&'

    (⋅=

    #$

    %&'

    ( +⋅⋅+#$

    %&'

    ( +⋅=

    =

    1

    012

    1

    02

    1

    012

    1

    02

    2exp2exp

    )(2exp)(2exp

    m

    kk

    m

    k

    jk

    m

    kk

    mjm

    kk

    jm

    mijkc

    mijkc

    mkmjic

    mkmjic

    v

    πω

    π

    πω

    π

    Entsprechend muss noch die zweite Hälfte von v bestimmt werden:

  • 13

    Gerade/ungerade in c ! erste Hälfte/zweite Hälfte in v Entsprechend wird die IDFT der halb so langen Vektoren wieder auf jeweils zwei IDFT (viertelter Länge) zurückgeführt.

    )()()()( uj

    jgjmj

    uj

    jgjj vvvundvvv ⋅−=⋅+= + ωω

    mit der Kombination für j=0,1,...,m-1:

    und

    zurückführen auf

    Damit lässt sich also

    (⌫0 . . . ⌫n�1) = IDFT(c0 . . . cn�1)

    (⌫(g)0 . . . ⌫(g)m�1) = IDFT(c0 c2 . . . cn�2)

    (⌫(u)0 . . . ⌫(u)m�1) = IDFT(c1 c3 . . . cn�1)

  • 14

    Grundidee: Rekursive Aufteilung des aktuellen Vektors in geraden und ungeraden Anteil; falls die Ergebnisse der beiden IDFT’s halber Länge vorliegen, werden die beiden Teile zum Ergebnis doppelter Länge kombiniert mittels

    bj aj - ωj bj

    aj aj + ωj bj ωj

    Anstelle einer IDFT Länge n sind also nun vier IDFT’s der Länge n/4 zu berechnen. Allgemein dazu notwendig: n=2p ist Zweierpotenz; Dann kann dieses Verfahren rekursiv durchgeführt werden, bis man eine IDFT der Länge n ausgedrückt hat durch n IDFT’s der Länge 1.

  • 15

    Rekursives Programm für IFFT:

    FUNCTION(v0,...,vn-1) = IDFT(c0,…,cn-1,n) IF n==1 v0 = c0 ; ELSE m=n/2 ; (g0,…, gm-1) = IDFT(c0, c2,…, cn-2,m) ; (u0,…, um-1) = IDFT(c1, c3,…, cn-1,m) ; ω = exp(2iπ/n) ; FOR j=0:m-1 vj = gj + ωj uj ; vj+m = gj - ωj uj ; END END

  • 16

    Ziffern 0 bis 6 bezeichnen die unterschiedlichen rekursiven Aufrufe des Programms IDFT mit neuen Parametern (roter Pfeil: Aufruf, blauer Pfeil: Werterückgabe und Ende). Insgesamt 3n-1 Programmaufrufe IDFT.

    5.2.2 Analyse des rekursiven Programms: Aufrufabfolge als binärer Baum (hier n=4):

    (v0) (v2) (v1) (v3)

    0 (c0,c1,c2,c3)

    1 4 ! (c0,c2) (c1,c3)

    2 3 5 6 !(c0) (c2) (c1) (c3)

  • (c0, c1, c2, c3, c4, c5, c6, c7)

    (c0, c2, c4, c6)

    (c0, c4)

    (c0)

  • (c0, c1, c2, c3, c4, c5, c6, c7)

    (c0, c2, c4, c6)

    (c0, c4)

    (c0) (c4)

  • (c0, c1, c2, c3, c4, c5, c6, c7)

    (c0, c2, c4, c6)

    (c0, c4)

    (c0) (c4)

  • (c0, c1, c2, c3, c4, c5, c6, c7)

    (c0, c2, c4, c6)

    (c0, c4) (c2, c6)

    (c0) (c4) (c2)

  • (c0, c1, c2, c3, c4, c5, c6, c7)

    (c0, c2, c4, c6)

    (c0, c4) (c2, c6)

    (c0) (c4) (c2) (c6)

  • (c0, c1, c2, c3, c4, c5, c6, c7)

    (c0, c2, c4, c6)

    (c0, c4) (c2, c6)

    (c0) (c4) (c2) (c6)

  • (c0, c1, c2, c3, c4, c5, c6, c7)

    (c0, c2, c4, c6)

    (c0, c4) (c2, c6)

    (c0) (c4) (c2) (c6)

  • (c0, c1, c2, c3, c4, c5, c6, c7)

    (c0, c2, c4, c6)

    (c0, c4) (c2, c6)

    (c0) (c4) (c2) (c6)

    (c1, c3, c5, c7)

    (c1, c5)

    (c1)

  • (c0, c1, c2, c3, c4, c5, c6, c7)

    (c0, c2, c4, c6)

    (c0, c4) (c2, c6)

    (c0) (c4) (c2) (c6)

    (c1, c3, c5, c7)

    (c1, c5)

    (c1) (c5)

  • (c0, c1, c2, c3, c4, c5, c6, c7)

    (c0, c2, c4, c6)

    (c0, c4) (c2, c6)

    (c0) (c4) (c2) (c6)

    (c1, c3, c5, c7)

    (c1, c5)

    (c1) (c5)

  • (c0, c1, c2, c3, c4, c5, c6, c7)

    (c0, c2, c4, c6)

    (c0, c4) (c2, c6)

    (c0) (c4) (c2) (c6)

    (c1, c3, c5, c7)

    (c1, c5) (c3, c7)

    (c1) (c5) (c3)

  • (c0, c1, c2, c3, c4, c5, c6, c7)

    (c0, c2, c4, c6)

    (c0, c4) (c2, c6)

    (c0) (c4) (c2) (c6)

    (c1, c3, c5, c7)

    (c1, c5) (c3, c7)

    (c1) (c5) (c3) (c7)

  • (c0, c1, c2, c3, c4, c5, c6, c7)

    (c0, c2, c4, c6)

    (c0, c4) (c2, c6)

    (c0) (c4) (c2) (c6)

    (c1, c3, c5, c7)

    (c1, c5) (c3, c7)

    (c1) (c5) (c3) (c7)

  • (c0, c1, c2, c3, c4, c5, c6, c7)

    (c0, c2, c4, c6)

    (c0, c4) (c2, c6)

    (c0) (c4) (c2) (c6)

    (c1, c3, c5, c7)

    (c1, c5) (c3, c7)

    (c1) (c5) (c3) (c7)

  • (c0, c1, c2, c3, c4, c5, c6, c7)

    (c0, c2, c4, c6)

    (c0, c4) (c2, c6)

    (c0) (c4) (c2) (c6)

    (c1, c3, c5, c7)

    (c1, c5) (c3, c7)

    (c1) (c5) (c3) (c7)

  • (c0, c1, c2, c3, c4, c5, c6, c7)

    (c0, c2, c4, c6)

    (c0, c4) (c2, c6)

    (c0) (c4) (c2) (c6)

    (c1, c3, c5, c7)

    (c1, c5) (c3, c7)

    (c1) (c5) (c3) (c7)

  • (c0, c1, c2, c3, c4, c5, c6, c7)

    (c0, c2, c4, c6)

    (c0, c4) (c2, c6)

    (c0) (c4) (c2) (c6)

    (c1, c3, c5, c7)

    (c1, c5) (c3, c7)

    (c1) (c5) (c3) (c7)

    Kosten: ! 2·n/2 !!!! 4·n/4 !!!!! 8·n/8

  • 34

    Kosten für n=2p (p=log(n)): Auf jeder Ebene sind jeweils 2k Vektoren der Länge 2n-k zu bearbeiten (umsortieren und zusammenkombinieren): Kosten Ebene 1: 2 Vektoren der Länge n/2 O(n) Ebene 2: 4 Vektoren der Länge n/4 O(n) .... Ebene p: n Vektoren der Länge 1 O(n)

    Die Aufrufe auf der untersten Ebene sind trivial, da mit Vektoren der Länge 1 als Eingabe.

    Gesamtkosten daher: O(p*n) = O(p*2p) = O(log2(n)*n)

    anstatt O(n2), wie sonst für Matrix-Vektor-Multiplikation.

  • 35

    Rekursives Programm zwar in O(pn) sehr schnell, hat aber großen Overhead für Aufrufe: Es muss dynamisch laufend neuer Speicherplatz angelegt werden.

    Ziel ist es im Folgenden, die Rekursion besser durch einfache For-Loops darzustellen.

    Frage: Optimaler Algorithmus für Matrix-Matrix-Produkt? Optimale Kosten?

  • 36 Sortierphase Kombinationsphase

  • c0

    c1

    c2

    c3

    c4

    c5

    c6

    c7

    c0

    c2

    c4

    c6

    c1

    c3

    c5

    c7

    c0

    c4

    c2

    c6

    c1

    c5

    c3

    c7

    c0

    c2

    c1

    c3

    c4

    c6

    c5

    c7

    g0

    g1

    g2

    g3

    u0

    u1

    u2

    u3

    v0

    v1

    v2

    v3

    v4

    v5

    v6

    v7

    g0

    g0

    u0

    g0

    u0

    g0

    u0

    u0

    g0

    g1

    u0

    u1

    g0

    g1

    u0

    u1

    Sortierphase mit Kombinationsphase Stück für Stück:

  • c0

    c1

    c2

    c3

    c4

    c5

    c6

    c7

    c0

    c2

    c4

    c6

    c1

    c3

    c5

    c7

    c0

    c4

    c2

    c6

    c1

    c5

    c3

    c7

    c0

    c2

    c1

    c3

    c4

    c6

    c5

    c7

    Sortierphase = Aufrufphase:

  • c0

    c1

    c2

    c3

    c4

    c5

    c6

    c7

    c0

    c2

    c1

    c3

    c4

    c6

    c5

    c7

    Sortierphase = Aufrufphase in einem Schritt:

  • c0

    c1

    c2

    c3

    c4

    c5

    c6

    c7

    c0

    c2

    c1

    c3

    c4

    c6

    c5

    c7

    g0

    u0

    g0

    u0

    g0

    u0

    g0

    u0

    v0

    v1

    v0

    v1

    v0

    v1

    v0

    v1

    Kombinationsphase ! spaltenweise

  • c0

    c1

    c2

    c3

    c4

    c5

    c6

    c7

    c0

    c2

    c1

    c3

    c4

    c6

    c5

    c7

    g0

    u0

    g0

    u0

    g0

    u0

    g0

    u0

    g0

    g1

    u0

    u1

    g0

    g1

    u0

    u1

    u0 v2

    g0 v0

    u1 v3

    g1 v1

    g0 v0

    u0 v2

    g1 v1

    u1 v3

  • c0

    c1

    c2

    c3

    c4

    c5

    c6

    c7

    c0

    c2

    c1

    c3

    c4

    c6

    c5

    c7

    g0

    u0

    g0

    u0

    g0

    u0

    g0

    u0

    g0

    g1

    u0

    u1

    g0

    g1

    u0

    u1

    g0

    g1

    g2

    g3

    u0

    u1

    u2

    u3

    g0 v0

    u0 v4

    g3 v3

    u3 v7

    g1 v1

    u1 v5

    g2 v2

    u2 v6

  • 43

    Passendes ω=exp(iπ/m): ω zu n=2: exp(iπ), j=0; ω zu n=4: exp(iπ/2), j=0,1 ω zu n=8: exp(iπ/4), für Potenzen j=0,1,2,3 Der Faktor, der im Butterfly bei einem Kombinationsschritt verwendet werden muss, hängt ab - von der aktuellen Länge der zu kombinierenden Vektoren - und vom Index j, der die Stelle der Komponenten angibt, die gerade kombiniert werden.

    Idee: Schreibe zwei einfache Loop-Programme, eines für die Sortierphase und eines für die Kombinationsphase.

    In jeder Spalte werden gleiche Komponenten von g und u zu Index j neu kombiniert zu v (das dann auch wieder g oder u für die nächsten Spalte ist).

  • 44

    Sortierphase !

    Betrachte Indizes k von Eingabevektor ck im Binärsystem:

    In jedem Schritt wird nach gerade/ungerade sortiert, also im ersten Schritt nach der letzten Binär-Stelle b0: Alle Komponenten, mit b0=0 kommen nach vorne, alle mit b0=1 nach hinten.

    Im zweiten Schritt wird wieder nach gerade/ungerade sortiert in den beiden Teilvektoren, d.h. in den zwei Teilvektoren b1=0 nach vorne, b1=1 nach hinten, also die mit Zweierstelle 1 nach hinten ! usw.

    k = (bp�1 . . . b1b0)2 mit n = 2p

  • 45

    Dies entspricht einer Sortierung von hinten! Bei der üblichen Sortierung stehen Zahlen mit bp-1=1 hinten und mit bp-1 = 0 vorne. Danach wird bei der üblichen Sortierung dasselbe bezüglich bp-2 wiederholt. ... So entsteht die üblich sortierte Reihenfolge. !In unserer neuen Sortierphase passiert dasselbe, aber von hinten her, beginnend mit b0.

    Insgesamt wird durch die rekursiven Aufrufe also die Folge 0,1,...,n-1 nun aufsteigend sortiert, aber von hinten her! Daher stehen die Elemente nach den rekursiven Aufrufen in dieser sortierten Reihenfolge, die Indizes bitmäßig umgekehrt. Neuer Index = neue Position: Drehe Bitreihenfolge um. !Wir bezeichnen mit π(k)=π((bp-1...b1b0)2)=(b0...bp-1)2 das Ergebnis dieser Vertauschungen ! Bitreversal.

  • 0 000 000 000 0 1 001 010 100 4 2 010 100 010 2 3 011 110 110 6 4 100 001 001 1 5 101 011 101 5 6 110 101 011 3 7 111 111 111 7

    k ! π(k)

    46

    Letzte Spalte mit Bitwerte in ‚reverser’ Reihenfolge, sortiert nach Stellen in der Binärdarstellung in umgekehrter Reihenfolge.

  • 47

    Beispiel: p=3, n=8: k = 5 = (101)2 ! π(k) = (101)2 = 5 k = 3 = (011)2 ! π(k) = (110)2 = 6 k = 1 = (001)2 ! π(k) = (100)2 = 4

    Sei k-1 = (bp-1bp-2 ... 011...11)2 , und daherπ(k-1) = (11...110 ... bp-2bp-1)2 ;

    Daher ist dann k = (bp-1bp-2 ... 100...00)2 , und daher

    π(k) = (00...001 ... bp-2bp-1)2 ;

    Programmidee für Bit-Reversal: Zähle für k=0,1,...,n-1 beginnend mit π(0)=0 mit π(k) ‚hoch’, also berechne aus π(k-1) jeweils das nächste π(k).

  • 48

    Um aus π(k-1) also π(k) zu erhalten, muss das erste (von links) zusammenhängende Einserpaket in π(k-1) durch ein Nullerpaket ersetzt werden, und die in π(k-1) daran anschließende erste 0 durch eine 1 in π(k) ersetzt werden. Der Rest bleibt unverändert.

  • 49

    Programm Bitreversal:

    π(0) = 0 ; FOR k = 1:n-1 π(k) = π(k-1) ; FOR j = 1 : p IF j-tes Bit von π(k) ist 0: Setze j-tes Bit von π(k) gleich 1 ; % 0!1 break ; % k fertig ELSE Setze j-tes Bit von π(k) gleich 0 ; % 1!0 ENDIF ENDFOR ENDFOR

  • 50

    Für jedes k: Frage von links her ab, ob aktuelle Stelle zu erstem Einserpaket gehört: - Wenn nein, dann ersetze durch 1, und die Bearbeitung für dieses k ist fertig; k wird um 1 erhöht ! - Wenn ja, dann ersetze diese 1 durch 0, und gehe zur nächsten Stelle eine Position nach rechts

    Anstatt des rekursiven Durchlaufs durch das Berechnungstableau führen wir die Umsortierung der Vektorkomponenten in einem Schritt durch. Genauso sollen die Schmetterlinge jetzt auch spaltenweise ausgeführt werden!

  • 51

    Kombinationsphase !Die umsortierten Komponenten sind nun paarweise in der Form (als Butterfly)

    zu kombinieren, und zwar mit wechselndem ωj=exp(2ijπ/n), je nach Länge n des durch die Kombination entstehenden Gesamtvektors und je nach Stelle j im Teilvektor.

    bj aj - ωj bj

    aj aj + ωj bj ωj

  • 52

    ω ist dabei also abhängig von der Spalte, in dem Tableau (rechte Spalte bezieht sich auf Maximallänge n, usw.). j ist davon abhängig, die wievielte Komponente in den beiden Vektoren gerade mittels Butterfly kombiniert wird. Der Abstand zwischen zwei zu kombinierenden Einträgen ist die aktuelle Vektorlänge.

    Im Folgenden bezeichnet k: die jeweilige zu bearbeitende Spalte. ωj :⇐ ωj j: Komponente j in den zu kombinierenden Teilvektoren s: die in Spalte k auftretenden Vektor-Paar-Kombinationen

  • 53

    Programm Kombinationsphase


    r = 1 ; FOR k = 1:p m = r ; r = 2m ; FOR j = 0:m-1 ωj= cos(πj/m) + i sin(πj/m); FOR s = 0:r:n-r g = vj+s ; h = ωj⋅vj+s+m ; vj+s = g + h ; vj+s+m = g - h ; ENDFOR ENDFOR ENDFOR

  • 54

    Setze , n=2p oder p=log2(n) Dann gilt !fp+1 = 2*fp + a*n = 2*fp + a*2p , * xp , ∑

    np TTf p == 2:

    ∑∑∑∞

    =

    =

    =+ ⋅+⋅=

    0001 22

    p

    pp

    p

    pp

    p

    pp xaxfxf

    F(x)

    Kosten !Kosten für IDFT der Länge 2n = (2 * Kosten für IDFT der Länge n) + a*n also T2n = 2*Tn + a*n

  • 55

    (F(x)-f0) / x = 2*F(x) +a / (1-2x) F(x)*(1-2x) = ax / (1-2x) + f0 F(x) = ax / (1-2x)2 + f0 / (1-2x) heißt ‘Erzeugende Funktion’ der Folge fp .

    ( ) pp

    p

    p

    p

    pp

    pp

    p

    pp

    p

    xfpaf

    xfppaf

    xfxppa

    ∑∑

    =

    =

    =

    +∞

    =

    ++=

    =⋅%%&

    '(()

    *+

    −+=

    =⋅⋅++

    1

    100

    10

    10

    00

    1

    0

    22

    22)!1(!

    22!)!1(

    Reihenentwicklung von F(x):

  • 56

    ( ) 10 22 −+= pp fapf

    ( ) ))(log()(log2

    22 2021

    02nnOnfnnafapTT pn p ⋅=+⋅=+==

    und daher für p=1,2,... oder

    Durchführbarkeit der Divide & Conquer – Idee ist so nur möglich, wenn n in viele Faktoren zerfällt (z.B. wenn n eine Zweier-Potenz ist).

    f0 =T1 : Kosten für IDFT der Länge 1 a : Kosten für Operationen in einem Butterfly