A definíció szerinti megfogalmazásban a diszkrét Fourier-transzformáció időbonyolultsága
. Az időbonyolultság az algoritmuselmélet területén az algoritmusok
számításigényének jellemzésére kidolgozott mérőszám, melyet esetünkben úgy
értelmezhetünk, hogy a diszkrét Fourier-transzformáció algoritmusa N hosszúságú bemenet
esetén nagyságrendileg
lépést hajt végre az eredmény meghatározásához.
A gyors Fourier-transzformáció (Fast Fourier Transform – FFT) valójában
nem egyetlen módszer, hanem inkább egy algoritmuscsalád, amely N hosszúságú bemenet
diszkrét Fourier-transzformáltját -nel arányos lépésben számítja ki. A
művelet miatt az FFT jóval hatékonyabb, mint a klasszikus, definíció szerinti DFT,
mégis ugyanarra az eredményre vezet. Könnyen látható, hogy egy kicsinek tekinthető, 128 elemű
vektor diszkrét Fourier-transzformációjának definíció szerinti kiszámításához
nagyságrendileg 16384 számítási műveletet kell végrehajtani, míg egy
időbonyolultságú algoritmus esetén csak 1024-et. Az FFT bevezetése J. W. Cooley és J. Tukey
nevéhez fűződik, akik az IBM alkalmazásában dolgozták ki az első FFT algoritmust 1965-ben.
Az 1994-ben megjelent, Linear Algebra and Its Applications című klasszikus matematikai
művében Gilbert Strang „napjaink legfontosabb numerikus algoritmusa”-ként hivatkozik rá,
mely „milliárdszor fut nap mint nap”. Természetesen azóta ez a szám ezermilliárdokra
tehető.
A számos gyors Fourier-transzformáció variáns közül a klasszikus Cooley–Tukey algoritmust
vezetjük le és mutatjuk be a szakasz hátralévő részében. Az FFT módszerek közös
tulajdonsága, hogy egyaránt az oszd meg és uralkodj elv alapján, rekurzívan működnek. A
Cooley–Tukey algoritmus méretű vektorok transzformáltjának
kiszámítására ad megoldást, de mint látni fogjuk, a gyakorlati alkalmazások szempontjából ez
egyáltalán nem jelent megszorítást.
Az egyszerűbb leírás kedvéért vezessünk be néhány új jelölést. Legyen ,
, és jelölje
az N
elemű vektorok diszkrét Fourier-transzformáltját kiszámító függvényt. Jelölje
az x páros,
a
páratlan koordinátájú elemeinek diszkrét Fourier-transzformáltját, azaz
Az algoritmus fő gondolata az, hogy a DFT-t előbb a vektor páros, majd páratlan
indexű elemeire alkalmazzuk és az így kapott, hosszúságú vektorokból
kombináljuk ki az eredményt. Amint az az alábbi levezetésből látható, mindez tényleg
megvalósítható.
A definíció szerinti diszkrét Fourier-transzformáció felbontható két részösszeg összegére az alábbi módon
A második összegzés exponenciális tagjában van egy összeadás, így felbontva az exponenciális kifejezést, kiemelhetjük a szumma kvantor által kötött n indexet nem tartalmazó tényezőt:
Az egyenlőség jobb oldalának két összegzése az eredeti x vektor páros és páratlan indexű
elemeiből álló hosszúságú vektorok DFT-jének a k indexű elemeit adja,
azaz
Azonban, az x vektor páros indexű elemeinek DFT-jére és páratlan indexű elemeinek DFT-jére újra alkalmazhatjuk a fenti dekompozíciót, így rekurzívan eljuthatunk a 2 elemű vektorok DFT-jéig. Kettő elemű vektorok diszkrét Fourier-transzformációja pedig
így nagyon gyorsan kiszámítható.
A fenti levezetés egyetlen szépséghibája, hogy miután felbontottuk az N hosszúságú
vektor DFT-jét két hosszúságú vektor DFT-jére, azokkal csak a
indexű elemeket számítjuk ki direkt
módon. Ennek megfelelően némi kiegészítést kell tennünk, hogy a kettő elemű
vektorok Fourier-transzformáltjaiból valóban visszakapjuk az eredeti, N elemű vektor
transzformáltját. Kihasználva a DFT periodicitásáról szóló tétel állítását,
könnyen látható, hogy
és
. Lássuk, hogyan alakul a páratlan
részből kiemelt szorzó tényező, ha azt a
helyen értékeljük
ki:
ahol az utolsó lépésben kihasználtuk, hogy , azaz a kiemelt szorzó
faktor előjelet vált. Ezek alapján a diszkrét Fourier-transzformáció gyors, rekurzív
kiszámítására az alábbi formulát kapjuk:
Az inverz gyors Fourier-transzformációt analóg módon levezetve az alábbi formális kifejezéshez jutunk:
A gyors Fourier-transzformáció és inverz gyors Fourier-transzformáció közötti különbség egyedül a komplex hullámok kitevőjében jelentkezik.
8.5.1. Megjegyzés. Megjegyezzük, hogy további feltételek (például cirkuláris szimmetria) esetén a gyors Fourier-transzformáció tovább optimalizálható.
A Cooley–Tukey-féle gyors Fourier-transzformáció méretű vektorokra van
kidolgozva. Felmerülhet az olvasóban a kérdés, hogy mi a teendő, ha a vektorunk nem
hosszúságú? A válaszokat az alábbiakban foglaljuk össze.
Az klasszikus javaslat az, hogy
ilyen esetekben egészítsuk ki a vektort nullákkal hosszúságúra (angol
terminológiában erre zero-padding-ként hivatkoznak). Ezen művelet hatása hasonló
ahhoz, amikor a folytonos Fourier-transzformáció bevezetésénél a négyszöghullám
periódushosszát növeltük: az alapharmonikus frekvenciája
csökken, így a frekvenciatér felbontása növekszik, a maximum és minimumhelyek,
azaz a frekvenciakomponensek egymáshoz viszonyított nagyságai nem változnak.
A vektorok nullákkal történő kiegészítése azonban nem minden esetben
szerencsés, ugyanis méretű vektorok esetén ez
hosszra történő kiegészítést jelent, ami gyakorlatilag megduplázza a vektor
hosszát. Például egy
hosszúságú vektort ezek alapján
hosszúságúra kell kiegészíteni. Hosszú vektorok esetén a vektorok hosszának
duplázása azért érezhetően növeli a számításigényt és az is előfordulhat,
hogy memóriakorlátokba ütközünk, azaz egyszerűen nem áll rendelkezésre elegendő
fizikai memória, hogy a nullákkal történő kiegészítést végrehajtsuk. Az elterjedt
FFT implementációk fel vannak készítve ilyen esetekre és tetszőleges hosszúságú
vektor esetén képesek gyors Fourier-transzformációt alkalmazni. Ilyen esetekben a
rekurziót addig hajtják végre, amíg a vektor hossza osztható kettővel. Ha a vektor
hossza már nem osztható kettővel, akkor rekurzió helyett magasan optimalizált módon
számítják ki a kapott 3, 5, 7 elemű vektorok diszkrét Fourier-transzformáltját. Ekkor
a transzformáció még mindig jóval gyorsabb, mint a definíció szerinti végrehajtás.
Probléma akkor jelentkezik, ha a vektor N hossza olyan, hogy prímfaktorokra bontva
nagy prímszámokat tartalmaz, például egy
elemű vektor esetén
és a 613 prímszám. Ekkor ugyanis a rekurziónak
csak egy lépése hajtható végre, s ezt követően a definíció szerinti DFT-t fogja
alkalmazni a gyors Fourier-transzformáció a rekurzívan nem feldolgozható részek
kiszámítására. Mivel a legtöbb gyors Fourier-transzformáció csak a legkisebb
néhány prímszám DFT-jét tudja kiszámítani optimalizált módon, ezért az ilyen
vektorokra a gyors Fourier-transzformáció is közel négyzetes időbonyolultságú.
Az általános javaslat a használt gyors Fourier-transzformáció implementációtól
függ: addig egészítsük ki a vektort nullákkal, amíg a kapott vektor hossza a
gyors Fourier-transzformáció által optimalizáltan kezelt hosszúságok szorzataként
elő nem állítható. Például tegyük fel, hogy a használni kívánt gyors
Fourier-transzformáció a rekurzió miatt kettő és ezen kívül még háromelemű
vektorokra van optimalizálva. Ekkor az előző pontban említett elemű
vektor esetén, célszerű választásnak tűnik az 1152 hosszra történő kiegészítés,
ugyanis
.