FFT. oldal A DFT alkalmas valamely időüő jel Fourier transzormáltjának előállítására és íy a spektrum elvételére is. Futási ideje azonban o(n ) ami ien korlátozottá teszi használatát - a spektrum uyanis annál pontosabb, minél több mérési pontból indulunk ki. Emiatt nem ritka a több ezer adatot tartalmazó minták elemzése, sőt, ha (a ehérzajok hatásait) a spektrum átlaolásával szeretnénk javítani, yakran több száz, esetle ezernél is több ilyen mintát kell kielemezni. Ey - ezres minta esetén, spektrumból való átlaolás DFT-nél közelítőle nel összemérhető műveletet jelent. Ez mé a modern asztali számítóépeknél is hosszú, akár több tíz perci is eltartó műveletet jelent. Szerencsére bizonyos eltételek mellett ey N-elemű tömb DFT-je visszavezethető két N/ elemszámú tömb DFT-jére és ez a résztömbökre is iaz lesz. A olyamatos visszavezetetés eészen addi vihető, amí már csak eyelemű tömbök DFT-jét kell vérehajtani. A lépésről lépésre való kettéosztoatásból adódik, hoy az elemszám ekkor csak kettő valamely hatványa lehet (,,8,,,...). Az íy számított speciális DFT-t nevezik FFT-nek (Fast Fourier Transormation (-radix FFT)). Számítási ideje az oszd me és uralkodj elépítés révén jóval kisebb, o(n*lo(n)). Az előző példára vetítve ez * műveletet jelent csak, ami nayjából -szoros sebessénövekedést jelent, a hayományos DFT-hez képest. Elsőként belátjuk, hoy a DFT valóban visszavezethető két meelelő elépítésű résztömb eldolozására, ey példán keresztül pedi metekintjük az aloritmus működését. A DFT átalakítási szabályai diszkrét esetben:..! " # $ $ %..! Leyen az ú.n. eyséyök a következő deinícióval meadva: &# Nézzük me, milyen tulajdonsáokkal rendelkezik és hoyan jeleníthető me ez a jelölésben is. (A továbbiakban a nn/ a minta elemszámának elét jelenti.) ' ( ( ) * +,- /!+-% /!" ' ( ( ) * ) * ' ( ' ( ) * +,- /!+-% /! " ' ( ) * 8 9 '
Ezzel a DFT kiejezése a következő alakba írható:. oldal &# ;h, > Most belátjuk, hoy a DFT valóban visszavezethető két kisebb tömb DFT-jére. Ehhez az összeet páros és páratlan k-hatványok szempontjából vizsáljuk me. 8 Első eset Th.: Nn km Ekkor: - tehát a tömb két, eleakkora, uyanakkora elemszámú résztömbre bontható - a k-hatványok közül csak a párosakat vesszük iyelembe A szumma két élre bontásával:! #? &# 9! &# A > &#! + &#!! B A > &# + &#! B > &# + &#! H I CDDEDDF > +! &# " J K ' K? KL A kapott összeüés jól láthatóan a l elemekre vonatkozó DFT, ami a páros indexekhez tartozó transzormált elemeket (N/ db) állítja elő. Leyen ey N-hosszú tömb. A l elemek deiníciója: Mivel nn/, a deiníció a tömb első elét tölti el. M > > +,........ n-... n- n n+..... n- Második eset Th.: Nn - N-ről most is azt eltételezzük, hoy páros km+ - a k-hatványok közül csak a páratlanokat vesszük iyelembe Ekkor:! #?" &# > &# &#! > &# &#
Itt is szétválasztva a szummát két élre: > &# &# A > &# &# + &# &#! B P O > &# &# + &# &# H TUI R CDDDDDEDDDDDF >! &# S &# " I &# P &# Q J K ' K? KL. oldal A kapott összeüés a n+l elemekre vonatkozó DFT, ami a páratlan indexekhez tartozó transzormált elemeket (ismét N/ db) állítja elő. A indexében található n+l lényee, hoy az előző tömb másik elét szeretnénk elhasználni tárolásra, ezáltal eyajta helyben rendezést előállítani a következő iterációhoz. A l+n elemek deiníciója: ami íy a tömb második elét tölti el: M >! &#,........ n- n n+...... n-... n- n n+..... n- A szeparáló műveletet aztán ezekre a résztömbökre ismét mehívjuk, mínem már csak ey elemű tömbök maradnak. A sok cseréletés miatt azonban az eyes transzormált értékek sorrendje is összekeveredik, ezt a véén mé ey úynevezett bittükröző operátor seítséével rendezni kell. Leyenek az utoljára kapott -tömb elemei # -vel, a transzormáltakat helyes sorrendben tartalmazó képzeletbeli tömb elemei pedi -val jelölve. Ekkor a két tömb elemei közötti kapcsolatot az ún. bittükröző operátor ( V ) biztosítja: # V ahol V a k-index bináris alakját (bitjeinek sorrendjét) tükrözi ( Pl. V RL"L""SR""L"LS ). Fontos, hoy implementáláskor nem az eész tárolási osztályra vonatkozik a tükrözés! Az int tárolási osztály pl. általában bájton, azaz biten tárolódik. Fontos, hoy a csak annyi alsó bit tükrözésére van szüksé, amennyi N tárolásához szüksées: Tükrözendő alsó bitek száma,m!
. oldal A következő példában ey 8 elemű tömb FFT lépéseit ojuk paraméteresen véikísérni. A kékkel jelölt -mezők a páros, a pirossal jelöltek a páratlan indexekre vonatkozó szabályokkal vannak képezve az előző tömb meelelő darabjaiból. + + + + + + ( ) W ( ) ( + ) W + ( ) ( ) ( ) ( ) ( ) W + + W ( + ) ( ) W ( ) ( + ) W ( ) ( ) W ( ) W N8 N 8 n W 8 e π 8 N n π ( j) W e N n π ( ) W e Ahol N az adott művelethez tartozó orrástömb mérete, n a keletkező két résztömb mérete, WN -az adott szinten használandó eyséyök (melynek hatványaival kell bizonyos lépésekben a piros mezők enerálásakor - szorozni). Az eredménytömb indexei azonban már nem eleltethetők me az eredeti indexek helyeinek az FFT speciális ún. pillanó struktúrája miatt. Nézzük me, hoy az eredeti indexeknek meelelő helyek hová keveredtek! Az alábbi ábrán a páros és páratlan indexekre vonatkozó lépésenkénti szétváloatás ((),()) hatásait követhetjük nyomon (az eyes oszlopokban az eredeti tömbindexek láthatóak, mí az oszlopok mellett az aktuális résztömbökre vonatkozó indexelés látható, amely szerint a következő lépés résztömbjeinek enerációja történik):
. oldal Fiyeljük me, hoy bizonyos indexek (kiemelve) véül a saját helyükön maradnak! Érdekes módon ezek éppen olyan indexek, melyek bináris alakja a bitek elhelyezkedésére nézve szimmetrikus. Példánkban N8, ez biten ábrázolható. Írjuk el az összes előorduló indexet ilyen bites bináris számként: Index Bináris alak (biten) Bináris alak A tükrözött alaknak tükrözve (a bitet) meelelő számérték A táblázat és a változások entebbi nyomon követése alapján ey nayon ontos észrevétel tehető: a kiindulási helyek indexük tükrözött bináris meelelőjének helyére kerülnek. Ezt iyelembe véve a transzormált tömb elemeinek helyes sorrendjét is könnyen visszakaphatjuk: amenynyiben az elem indexe nem eyezik me bittükrözött meelelőjével, az ezeknek meelelő elemeket elcseréljük (ezt elé csak N/-i metenni, mert a továbbiakban a már kicserélt elemeket cserélnénk újra vissza!). Mindezek alapján ey eyszerű mevalósítása az FFT-nek a következő rekurzív pszeudokód: void FFT(Cx*, int startind, int N, bool elso) // ejléc int nn/, i; Cx p, m, W, WN; // inicializálás, a Cx típusú osztály az alapműveletekre zárt WN.Recos(-PI/N); WN.Imsin(-PI/N); WWN; // az értékadást is implementálja i(n<) return; // kilépési eltétel a rekurzív híváshoz else i (elso) or(istartind; i<n; i++) [i][i]/n; // /N előállítása minden tömbelemre or(istartind; i<startind+n; i++) // indexelés: az aktuális tömbdarabban kell dolozni i (i>) WW*WN; // menetközben leyártódnak a hatványok (*) elvárt p[i]+[i+n]; // páros kiválasztási szabály (pluszos) m([i]-[i+n])*w; // páratlan kiválasztási szabály (mínuszos) [i]p; [i+n]m; // tömbelemek utólaos értékadása } FFT(, startind, N/, alse); // rekurzív hívás az új tömb első elére FFT(, startind+n/, N/, alse); // rekurzív hívás az új tömb második elére i (elso) // ha minden visszatért a leelső üvénybe // akkor rendbe rakjuk az indexeket or (i; i<n/; i++) i (i!bittukroz(i)) Cserel(,i,BitTukroz(i)); } // BitTukroz() csak az indexet tényleesen leíró bináris } // számot tükrözi, nem az eész tárolási típust! } // A tároló bitek száma: lo(n) } Mehívása: FFT(,, N, true); Ahol a BitTukroz() az adott index bittükrözött értékével tér vissza, a Cserel() pedi az arumentumban meadott indexű értékeket cseréli ki az komplex tömbben. Az inverz FFT-re az elmondottak uyanúy iazak maradnak, mindössze a kezdeti tömb N-nel való normálása marad el, az eyséyök helyett pedi annak komplex konjuáltja veendő (()-() szerint).