Univerzita Karlova v Praze Matematicko-fyzikální fakulta BAKALÁŘSKÁ PRÁCE Martina Klejchová Rychlá Fourierova transformace Katedra numerické matematiky Vedoucí bakalářské práce: Doc. RNDr. Najzar Karel, CSc. Studijní program: Matematika, Obecná matematika 2008
Na tomto místě bych chtěla poděkovat Doc. RNDr. Karlu Najzarovi, CSc. za zapůjčení veškeré potřebné literatury a za ochotu při vedení mé práce. Prohlašuji, že jsem svou bakalářskou práci napsala samostatně a výhradně s použitím citovaných pramenů. Souhlasím se zapůjčováním práce a jejím zveřejňováním. V Praze dne 29.5.2008 Martina Klejchová
Obsah 1 Úvod 5 2 Diskrétní Fourierova transformace 6 2.1 Definice diskrétní Fourierovy transformace............. 6 2.2 Vyjádření diskrétní Fourierovy transformace pomocí vybraných posloupností.................................. 7 3 Rychlá Fourierova transformace pro N = 2 m 9 3.1 Danielsonovo-Lanczosovo lemma................... 9 3.2 Algoritmus rychlé Fourierovy transformace metodou vybraných vstupních posloupností........................... 10 3.3 Znázornění algoritmu pomocí signálových grafů.......... 11 3.4 Složitost výpočtu........................... 13 3.5 Modifikace algoritmu......................... 14 3.6 Algoritmus rychlé Fourierovy transformace metodou vybraných obrazových posloupností.......................... 16 4 Rychlá Fourierova transformace s obecným základem 20 4.1 Rychlá Fourierova transformace pro N = r 1 r 2...r m......... 20 4.2 Rychlá Fourierova transformace pro N prvočíselné......... 21 5 Testování algoritmu na zadaných datech 22 Literatura 25 3
Název práce: Rychlá Fourierova transformace Autor: Martina Klejchová Katedra: Katedra numerické matematiky Vedoucí bakalářské práce: Doc. RNDr. Najzar Karel, CSc. e-mail vedoucího: Karel.Najzar@mff.cuni.cz Abstrakt: Diskrétní Fourierova transformace je nejrozšířenějším prostředkem pro numerický výpočet Fourierovy transformace a pro numerickou harmonickou analýzu. Obsahem této práce je podrobný popis asi nejznámějšího algoritmu pro její výpočet - algoritmu rychlé Fourierovy transformace (FFT). Je tu popsáno odvození algoritmu jak pro speciální případ posloupnosti dat s počtem členů 2 m, tak pro obecné posloupnosti vstupních dat. Algoritmus i některé jeho modifikace jsou zde též znázorněny pomocí signálových grafů. Práce pojednává také o výpočetní složitosti rychlé Fourierovy transformace v porovnání s přímým výpočtem diskrétní Fourierovy transformace. V závěru obsahuje konkrétní výsledky použití algoritmu na zadaných datech. Klíčová slova: rychlá Fourierova transformace, diskrétní Fourierova transformace, Danielsonovo- Lanczosovo lemma Title: Fast Fourier Transform Author: Martina Klejchová Department: Department of Numerical Mathematics Supervisor: Doc. RNDr. Najzar Karel, CSc. Supervisor s e-mail address: Karel.Najzar@mff.cuni.cz Abstract: Discrete Fourier transform is the most common tool for numeric calculation of Fourier transform and numeric harmonic analysis. This work contains detailed description of probably the most popular algorithm for its calculation - algorithm of Fast Fourier Transform (FFT). It describes the derivation of the algorithm for special case of data sequence with 2 m terms as well as for general input data sequence. The algorithm and some of its modifications are here depicted with the help of signal graphs. The work also deals with computing complexity of Fast Fourier Transform comparing to direct calculation of discrete Fourier transform. At the end of this work, there are concrete results of applying the algorithm on given data. Keywords: Fast Fourier Transform, Discret Fourier Transform, Danielson- Lanczos lemma 4
Kapitola 1 Úvod Rychlá Fourierova transformace je jedním z nejznámějších a také nejčastěji používaných algoritmů pro výpočet diskrétní Fourierovy transformace. Můžeme se s ní setkat všude, kde se používá diskrétní Fourierova transformace. Pro velké množství dat totiž nelze ani na současných počítačích diskrétní Fourierovu transformaci tak, jak je definována, spočítat v přijatelném čase. Využití nějakého efektivního postupu je tedy nutností. Diskrétní Fourierova transformace se uplatňuje v mnoha oborech - v elektrotechnice, při zpracování signálů, v akustice, geofyzice, seismologii, optice, při zpracování obrazů, spektrální analýze apod. Nalézáme ji především tam, kde nahrazuje spojitou Fourierovu transformaci, ale také například při matematickém a statistickém zpracovaní naměřených dat. O významu rychlé Fourierovy transformace tedy nemůže být pochyb. Algoritmus rychlé Fourierovy transformace byl poprvé publikován v roce 1965 J. W. Cooleyem a J. W. Tukeyem pod názvem Fast Fourier Transform (FFT). Po roce 1965 byl předmětem intenzivního zájmu a vznikaly různé modifikace. Pro běžné použití k výpočtům na počítačích jsou tyto modifikace víceméně ekvivalentní. V následující kapitole zavedu pojem diskrétní Fourierovy transformace a zmíním se o některých jejích vlastnostech důležitých pro popis rychlé Fourierovy transformace. Dále již přijde na řadu popis a odvození samotného algoritmu a také jeho znázornění pomocí signálových grafů, vše nejprve pro speciální případ posloupnosti dat délky N = 2 m, poté i pro obecnější posloupnost. Zmíním se také o počtu operací potřebných pro výpočet. Na závěr uvedu výsledky testování algoritmu na konkrétních datech. 5
Kapitola 2 Diskrétní Fourierova transformace 2.1 Definice diskrétní Fourierovy transformace Pod názvem diskrétní Fourierova transformace budeme rozumět jak přímou, tak i inverzní (zpětnou) Fourierovu transformaci. Definice přímé diskrétní Fourierovy transformace Mějme posloupnost N konečných komplexních čísel x j, j = 0, 1,..., N 1. Potom její přímá Fourierova transformace je definována jako posloupnost N komplexních hodnot X k daných vzorcem X k = N 1 j=0 x j e ijk2π/n, k = 0, 1,...N 1. (2.1) Posloupnost X k nazývame též obrazem posloupnosti x j. Definice inverzní diskrétní Fourierovy transformace Je-li X k, k = 0, 1,..., N 1, posloupnost N komplexních čísel, její zpětná Fourierova je dána posloupností x j, kde x j = 1 N N 1 k=0 X k e ijk2π/n, pro j = 0, 1,..., N 1. (2.2) Je-li posloupnost X k obrazem posloupnosti x j, potom jejím dosazením do vztahu (2.2) získáme původní posloupnost x j. Vztah (2.2) je tedy inverzní k vzorci (2.1) a oba vztahy vyjadřují jednoznačné přiřazení jedné posloupnosti k druhé. Z definic také vyplývá, že přímá diskrétní Fourierova transformace a inverzní diskrétní Fourierova transformace definují periodické posloupnosti x j = x j+µn, µ = 0, ±1, ±2,..., X k = X k+νn, ν = 0, ±1, ±2,... 6
To platí, neboť x j+µn = 1 N N 1 k=0 X k e i(j+µn)k2π/n = 1 N N 1 k=0 X k e ijk2π/n e iµnk2π/n = analogicky i pro X k. = 1 N N 1 k=0 X k e ijk2π/n = x j, V dalších kapitolách budeme používat pro zjednodušení zápis x i ˆ=X k pro vyjádření vzájemně jednoznačného přiřazení posloupností x i a X k pomocí diskrétní Fourierovy transformace. Dále potom budeme někdy pro větší přehlednost značit e i2π/n = W N. Algoritmus rychlé Fourierovy transformace budeme odvozovat pouze pro přímou diskrétní Fourierovu transformaci. Pro inverzní transformaci totiz stačí dosadit do algoritmu místo hodnot x j posloupnost 1 X N k a místo W N číslo komplexně sdružené, tedy WN = e 2π/N. 2.2 Vyjádření diskrétní Fourierovy transformace pomocí vybraných posloupností Mějmě posloupnost x j, j = 0, 1,..., N 1, a její diskrétní Fourierovu transformaci popsanou vzorcem X k = N 1 j=0 x j e ijk2π/n, k = 0, 1,...N 1. Pokud N lze napsat jako součin celých čísel p, M (tedy N = pm), můžeme diskrétní Fourierovu transformaci vyjádřit také pomocí diskrétní Fourierovy transformace vybraných posloupností vytvořených následujícím způsobem: Z posloupnosti x j vezmeme každý p-tý člen počínaje m-tým členem. Tak vznikne celkem p vybraných posloupností délky M = N/p. Diskrétní Fourierovu transformaci celé posloupnosti můžeme potom tedy napsat, pro k = 0, 1,..., N 1, ve tvaru X k = p 1 M 1 m=0 ν=0 x m+νp e ik(m+νp)2π/n = p 1 M 1 m=0 ν=0 7 x νp+m e ikν2π/m e ikm2π/n. (2.3)
Dále pokud vyjádříme index k ve tvaru k = µm + n, µ = 0, 1,..., p 1, n = 0, 1,..., M 1, dostaneme následující vzorec: X µm+n = p 1 m=0 [e imn2π/n ( M 1 ν=0 x νp+m e iνn2π/m )] e iµm2π/p. (2.4) Tato dvě vyjádření jsou důležitá pro pozdější odvození algoritmu rychlé Fourierovy transformace. Představují totiž základ pro snížení počtu početních úkonů. 8
Kapitola 3 Rychlá Fourierova transformace pro N = 2 m 3.1 Danielsonovo-Lanczosovo lemma Lemma: Mějme posloupnost x j ˆ=X k o N členech, kde N je sudé. Rozdělíme ji na posloupnost lichých členů a na posloupnost sudých členů, obě o N/2 členech. Potom posloupnost X k lze popsat následujícím vztahem: X k = N 1 j=0 x j e ijk2π/n = (N/2) 1 ν=0 Označíme obraz posloupnosti sudých členů (N/2) 1 ν=0 a obraz posloupnosti lichých členů (N/2) 1 ν=0 (N/2) 1 x 2ν e iνk2π/(n/2) + e ik2π/n ν=0 x 2ν+1 e iνk2π/(n/2), (3.1) k = 0, 1,..., N 1. x 2ν e iνk2π/(n/2) = X 0 k, k = 0, 1,..., N/2 1, (3.2) x 2ν+1 e iνk2π/(n/2) = X 1 k, k = 0, 1,...N/2 1. (3.3) Pak obraz původní posloupnosti můžeme zapsat ve tvaru X k = X 0 k + e ik2π/n X 1 k = X 0 k + W k NX 1 k, k = 0, 1,..., N 1. (3.4) Důkaz: Jde vlastně o speciální případ vzorce (2.3) pro p = 2. 9
Pokud si navíc uvědomíme, že posloupnosti hodnot X 0 k a X 1 k, k = 0, 1,..., N/2 1, jsou periodické s periodou N/2, a tudíž X 0 k = X 0 k+n/2, k = 0, 1,..., N/2 1, X 1 k = X 1 k+n/2, k = 0, 1,..., N/2 1, pro hodnoty obrazu původní posloupnosti platí následující dva vztahy: k = 0, 1,..., N/2 1. X k = X 0 k + W k NX 1 k, (3.5) X k+n/2 = X 0 k + W k+n/2 N X 1 k = X 0 k W k NX 1 k, (3.6) 3.2 Algoritmus rychlé Fourierovy transformace metodou vybraných vstupních posloupností Tato varianta algoritmu vytvořená J.W.Cooleyem a J. W. Tukeyem bývá též nazývána "algoritmem decimování v čase" neboli algoritmem DIT. Základem tohoto algoritmu je rekurentní vzorec (3.4) získaný z Danielsonova- Lanczosova lemmatu. Tento vzorec nám původní vztah (2.1) pro výpočet diskrétní Fourierovy transformace posloupnosti x j, j = 0, 1,..., N 1, rozdělí na součet diskrétních Fourierových transformací dvou podposloupností o polovičním počtu složek - posloupnosti sudých členů {Xk}, 0 popsané vzorcem (3.2) a posloupnosti lichých členů {Xk}, 1 dané pomocí (3.3). Posloupnost {X k } tedy můžeme vypočítat tak, že nejprve stanovíme posloupnosti {Xk} 0 a {Xk} 1, a potom pomocí vzorců (3.5) a (3.6) spočteme hodnoty X k, k = 0, 1,...N 1. Nic nám ovšem nebrání obě posloupnosti, {Xk} 0 i {Xk}, 0 každou zvlášť, znovu rozložit na podposloupnost sudých a podposloupnost lichých členů, a poté na ně opět aplikovat Danielsonovo- Lanczosovo lemma a vzorce (3.5) a (3.6). Při použití značení zavedeného v lemmatu, máme nyní čtyři posloupnosti (Xk 00, Xk 01, Xk 10, Xk 11 ) délky N/4 získané Fourierovou transformací členů posloupnosti {x j }. Pomocí nich můžeme vypočítat všechny prvky X k. Předchozí postup provádíme rekurzívně tak dlouho, dokud nemáme celou posloupnost X k, k = 0, 1,..., N 1, díky opakovanému užití vzorců (3.5) a (3.6) vyjádřenou jako lineární kombinaci N Fourierových transformací délky 1 vzniklých z některého prvku x j, j = 0, 1,..., N 1, původní posloupnosti. Tyto Fourierovy transformace označíme X 00...0 k, X 00...1 k,..., X 11...1 k, kde horních indexů je právě m (neboť N = 2 m ). Zjistit, které j odpovídá konkrétní posloupnosti indexů 0 a 1, můžeme tak, že posloupnost 0 a 1 čteme odzadu. Výsledkem je potom dvojkový zápis čísla j. 10
Jelikož N = 2 m, algoritmus má celkem m kroků. Některé operace s prvky se díky periodičnosti Fourierovy transformace během algoritmu opakují, proto pokud správně využijeme všechny mezivýsledky, výrazně snížíme počet potřebných komplexních sčítání i násobení. To bude dobře vidět v další kapitole, až si znázorníme algoritmus pomocí signálových grafů. 3.3 Znázornění algoritmu pomocí signálových grafů Během algoritmu se stále opakuje výpočet podle vzorců (3.5) a (3.6). Ten můžeme graficky znázornit pomocí tzv. motýlků, které odpovídají znázornění výpočtu diskrétní Fourierovy transformace pro N = 2. Obr.1: Motýlek (převzato z [1] str. 116). Nalevo ještě před zjednodušením, obsahuje dvě komplexní násobení, dvě komplexní sčítání. Napravo výhodnější varianta je zde pouze jedno komplexní násobení (násobení číslem -1 nepočítáme, jde jen o úpravu znaménka) a dvě komplexní sčítání. V jednom motýlku se provádí jedno komplexní sčítání, jedno komplexní odčítání a jedno komplexní násobení. Nyní si ukážeme jednotlivé kroky algoritmu znázorněné pomocí signálových grafů pro konkrétní případ N = 8: 11
Obr. 2: První krok výpočtu diskrétní Fourierovy transformace pro N = 8 vybíráním ze vstupní posloupnosti (převzato z [1] str. 116). Obr. 3: Druhý krok výpočtu diskrétní Fourierovy transformace pro N = 8 vybíráním ze vstupní posloupnosti (převzato z [1] str. 117). 12
Obr. 4: Celkový postup výpočtu diskrétní Fourierovy transformace pro N = 8 vybíráním ze vstupní posloupnosti - algoritmus rychlé Fourierovy transformace s neproměnným pořadím a s bitově invertovanou vstupní posloupností (převzato z [1] str. 118). 3.4 Složitost výpočtu Abychom zjistili počet komplexních operací, které musíme provést v průběhu algoritmu rychlé Fourierovy transformace, vyjdeme ze signálových grafů. Místo N = 8 budeme nyní uvažovat obecné N = 2 m. Počet sloupců v grafu bude v tomto případě roven číslu m, tedy log 2 N, a v každém sloupci je N/2 motýlků. Z obrázku 1 vidíme, že v každém motýlku se provádí jedno komplexní násobení a dvě komplexní sčítání (přesněji tedy jedno komplexní sčítání a jedno komplexní odčítání). Celkem nás tedy algoritmus rychlé Fourierovy transformace "stojí" N 2 log 2N komplexních násobení a Nlog 2 N komplexních sčítání. Pokud bychom chtěli vypočítat hodnoty X k, k = 0, 1,..., N 1, prostým dosazením do definičního vzorce diskrétní Fourierovy transformace X k = N 1 j=0 x j e ijk2π/n, k = 0, 1,...N 1, 13
museli bychom provést N 2 komplexních násobení a N 2 komplexních sčítání. Řádově tedy dojde k výrazné úspoře, místo původních O (N 2 ) operací se při Fourierově transformaci dostaneme na pouhých O (Nlog 2 N). Pro velká N, která při praktických výpočtech rozhodně nejsou výjimkou, se tento rozdíl projeví opravdu viditelně. 3.5 Modifikace algoritmu Výsledkem algoritmu popsaného v předchozích kapitolách jsou všechny hodnoty X k, k = 0, 1,..., N 1, získané v přirozeném pořadí. Vstupní posloupnost ovšem má v tomto případě bitově invertované pořadí indexů. Algoritmus však můžeme v případě potřeby snadno modifikovat tak, že vstupní posloupnost do něj dosazujeme v původním pořadí indexů a v bitově invertovaném pořadí jsou výstupní hodnoty X k (obr. 5). Případně lze graf upravit i tak, že v původním pořadí jsou obě posloupnosti, vstupní i výstupní (obr. 6). Další variantou je algoritmus s neproměnnou strukturou(tzn. všechny sloupce mají stejnou strukturu) s bitově invertovanou vstupní posloupností (obr. 7). Máme tedy celkem tři různé modifikace původního algoritmu, které si nyní znázorníme pro N = 8 pomocí signálových grafů. Obr. 5: Algoritmus rychlé Fourierovy transformace s neproměnným pořadím a s bitově invertovanou výstupní posloupností (převzato z [1] str. 119). 14
Obr. 6: Algoritmus rychlé Fourierovy transformace s proměnnou strukturou a přirozeným pořadím ve vstupní i obrazové posloupnosti (převzato z [1] str. 120). Obr. 7: Algoritmus rychlé Fourierovy transformace s neproměnnou strukturou a s bitově invertovanou vstupní posloupností (převzato z [1] str. 120). 15
3.6 Algoritmus rychlé Fourierovy transformace metodou vybraných obrazových posloupností Tuto variantu algoritmu můžeme v literatuře nalézt též pod názvem metoda decimování ve frekvencích nebo metoda DIF. Jde vpodstatě o jakési "obrácení" algoritmu decimování v čase. Tentokrát nejprve samostatně vyjádříme sudé a liché členy z obrazové posloupnosti X k, k = 0, 1,..., N 1: K tomu vvyužijeme vzorec (2.4). Máme tedy pro sudé členy výraz X 2µ = N/2 1 + j=0 N 1 j=0 pro liché členy pak X 2µ+1 = N 1 j=0 x j e ij2µ2π/n = x j+n/2 e ijµ2π/(n/2) = x j e ij(2µ+1)2π/n = N 1 j=0 N/2 1 j=0 N/2 1 j=0 x j e ijµ2π/(n/2) = N/2 1 j=0 x j e ijµ2π/(n/2) + ( xj e ijµ2π/(n/2) + x j+n/2 e ijµ2π/(n/2)), [ xj e ijµ2π/(n/2) x j+n/2 e ijµ2π/(n/2)] e ij2π/n, kde µ = 0, 1,..., N/2 1. Členy X 2µ tedy nyní máme vyjádřené ve tvaru diskrétní Fourierovy transformace posloupnosti { } x j + x j+n/2 a členy X2µ+1 počítáme jako diskrétní Fourierovu transformaci posloupnosti {( x j x j+n/2 ) e ij2π/n }, j = 0, 1,..., N 1. Z těchto dvou nově vzniklých Fourierových transformací opět zvlášť vyjádříme sudé a liché členy, tak jako jsme to provedli pro původní obrazovou posloupnost {X k }. Postupujeme analogicky, dokud nemáme posloupnost rozloženou na N transformací délky 1. Počet potřebných operací se nám sníží stejně jako v předchozích případech použitím motýlků: 16
Celý postup si znázorníme pro N = 8: Obr. 9: První krok výpočtu diskrétní Fourierovy transformace pro N = 8 vybíráním z obrazové posloupnosti (převzato z [1] str. 121). 17
Obr. 10: Druhý krok výpočtu diskrétní Fourierovy transformace pro N = 8 vybíráním z obrazové posloupnosti (převzato z [1] str. 122). Obr. 11: Celkový postup výpočtu diskrétní Fourierovy transformace pro N = 8 vybíráním z obrazové posloupnosti - algoritmus rychlé Fourierovy transformace s neproměnným pořadím a s bitově invertovanou výstupní posloupností (převzato z [1] str. 123). 18
Je vidět, že k tomu, abychom z grafu popisujícího metodu vybraných obrazových posloupností získali graf algoritmu založeného na vybraných vstupních posloupnostech, stačí pouze zaměnit směry všech šipek. Koeficienty u W N zůstávají stejné. Je tedy jasné, že co se týče počtu operací, jsou oba algoritmy stejně náročné. I u metody vybraných obrazových posloupností můžeme vytvořit další tři modifikace základního algoritmu, které odpovídají grafům na obrázcích 5, 6 a 7, pokud v nich změníme směry šipek a čteme je zprava doleva. 19
Kapitola 4 Rychlá Fourierova transformace s obecným základem 4.1 Rychlá Fourierova transformace pro N = r 1 r 2...r m Algoritmus rychlé Fourierovy transformace pro N = 2 M popsaný v předchozí kapitole lze snadno zobecnit pro N = r M, kde r 2 je celé číslo. Posloupnost {x j } rozdělíme na r vybraných podposloupností { } x m j, m = 0, 1,...r 1, délky r M 1 tak, že vždy bereme každý r-tý člen počínaje m-tým. Pro tyto posloupnosti použijeme opět vyjádření pomocí vztahu (2.4), tentokrát ovšem místo p = 2 dosazujeme p = r. Dále se postupuje analogicky jako pro případ p = 2, tedy rekurzivně rozkládáme vzniklé podposloupnosti vždy znovu na r dalších podposloupností, dokud neobdržíme podposloupnosti délky právě jedna, které odpovídají Fourierovým transformacím délky jedna členů původní posloupnosti {x j }. I v tomto případě využijeme periodičnosti diskrétní Fourierovy transformace - některé mezivýsledky budeme moci využít vícekrát, aniž bychom je vícekrát museli počítat, čímž snížíme počet potřebných operací (v grafu bychom toto znázornili pomocí motýlků). Podobně, opět s využitím vztahu (2.4), bychom mohli postupovat i pro obecné N = r 1 r 2...r m. Pro větší názornost zde uvedu znázornění algoritmu pro konkrétní případ N = 3.2 = 6 (obr. 12). Vzorec, který v tomto případě dostaneme z (2.4), je v následujícím tvaru: ( 1 2 ) X 3µ+n = e imn2π/6 x 2ν+m e inν2π/3 e imµ2π/2. m=0 ν=0 20
Obr. 12: Postup výpočtu diskrétní Fourierovy transformace pro N = 6, p = 2, M = 3 (převzato z [1] str. 127). 4.2 Rychlá Fourierova transformace pro N prvočíselné Pokud N je prvočíslo, nemůžeme algoritmy popsané výše použít. V tom případě je jednou z možností rozšířít původní posloupnost nulovými členy tak, aby počet členů takto vzniklé posloupnosti byl roven 2 m pro nějaké celé číslo m. Potom můžeme použít algoritmus rychlé Fourierovy transformace pro N = 2 m. 21
Kapitola 5 Testování algoritmu na zadaných datech Efektivitu algoritmu rychlé Fourierovy transformace jsem ověřila na konkrétním příkladě. Jako testovací vstupní data jsem použila posloupnost danou vzorcem x j = sin πj2, j = 0, 1,..., N 1 256 (viz [2], str.9, cvičení 1.2.3). Za N jsem postupně volila hodnoty 2 m pro m = 3,..., 9. Diskrétní Fourierovu transformaci jsem potom pro každé N vypočítala nejprve pomocí algoritmu rychlé Fourierovy transformace metodou vybraných vstupních posloupností s neproměnným pořadím a s bitově invertovanou vstupní posloupností, který je popsán v kapitole 3.2, potom i přímým dosazením do vzorce (2.1), kterým je diskrétní Fourierova transformace definována. Pro hodnoty N vyšší než 512 byl již výpočet diskrétní Fourierovy transformace dosazením do definičního vzorce příliš časově náročný, proto jsem pro N = 1024 a N = 2048 použila už jen rychlou Fourierovu transformaci. Doby výpočtů v sekundách jsou pro jednotlivá N pro oba algoritmy uvedeny v následující tabulce: 22
Jak je vidět z údajů uvedených v tabulce, výhodnost rychlé Fourierovy transformace se pro velké hodnoty N projevuje opravdu výrazně. Pro N = 128 je rychlá Fourierova transformace rychlejší téměř stokrát, pro N = 512 dokonce skoro tisíckrát. Rozdílu si však můžeme všimnout již u N = 32. Oba algoritmy jsem vytvořila v programu Mathematica 6. Zde jsou jejich realizace. Nejprve program pro výpočet diskrétní Fourierovy transformace dosazením do (2.1): (*delka vstupni posloupnosti*) n=128; (*vektor vstupni posloupnosti*) A=Array[Sin[(p*(#) 2 )/256]&,n,0]; W= - *2*p/n; Wk=Array[0,n]; X=Array[0,n]; For[k=0,k<n,k++,X[[k+1]]=0;] (*predpocitane hodnoty (W^k): *) For[k=0,k<n,k++,Wk[[k+1]]=W k ;] (*DFT vypocitana podle definicniho vzorce:*) For[k=0,k<n,k++, For[i=0,i<n,i++, X[[k+1]]=X[[k+1]]+A[[i+1]]*Wk[[Mod[k*i,n] +1]]; ] ] (*zobrazi hodnoty obrazove posloupnosti:*) Print[N[X]]; Na následující straně se potom nachází realizace algoritmu rychlé Fourierovy transformace metodou vybraných vstupních posloupností s neproměnným pořadím a s bitově invertovanou vstupní posloupností: 23
(*delka vstupni posloupnosti*) n=128; (*vektor vstupni posloupnosti*) A=Array[Sin[(p*(#)2)/256]&,n,0]; log=log[2,n]; W= - *2*p/n; X=Array[0,n]; (*bitova inverze:cleny vstupni posloupnosti se ulozi do pole X v poradi potrebnem pro algoritmus FFT, predstavuji vlastne jiz DFT delky 1 *) For[i=0,i<n,i++, k=mod[i,2]; t=integerpart[i/2]; For[j=1,j<log,j++, k=mod[t,2]+k*2; t=integerpart[t/2] ]; X[[k+1]]=A[[i+1]]; ]; (*predpocitani hodnot W^i,i=0,...,N/2-1, jsou ulozeny do pole A:*) For[i=0,i<n/2,i++,A[[i+1]]=Wi;] (*vlastni algoritmus FFT: d...aktualni delka posloupnosti, ze kterych v danem kroku vybirame liche a sude cleny pocetposl...pocet posloupnosti v danem kroku *) d=1; For[i=0,i<log,i++, d=d*2; pocetposl=n/d; For[k=1,k<(n+1),k=k+d, For[j=0,j<d/2,j++, (*MOTYLEK:*) X[[k+j+d/2]]=X[[k+j+d/2]]*A[[j*pocetposl+1]]; pom=x[[k+j+d/2]]+x[[k+j]]; X[[k+j+d/2]]=X[[k+j]]-X[[k+j+d/2]]; X[[k+j]]=pom; ]; ] ] Print[N[X]]; (* zobrazi obrazovou posloupnost*) 24
Literatura [1] Čížek V.: Diskrétní Fourierova transformace a její použití, SNTL, Praha, 1981. [2] Najzar K.: Základy teorie waveletů, Karolinum, Praha, 2004. [3] Segeth K.: Numerický software I, Karolinum, Praha, 1998. 25