Fast Fourier Transform

FFT (eng. Fast Fourier Transform) er en algoritme til beregning af Fouriertransformationen af en diskret serie af værdier. Den anvendes til digital signalbehandling.

Et signal kan være en optagelse af lyd. Når lyden er digitaliseret, som den er på en musik-CD, kan den Fouriertransformeres med FFT. I den transformerede serie kan udvalgte frekvenser forstærkes eller dæmpes. Derefter kan serien transformeres tilbage og afspilles som lyd, hvor f.eks. diskant eller bas er hævet eller sænket.

Ved at fjerne frekvenser fra serien kan signalet komprimeres. Det således komprimerede signal kan overføres over langsomme dataforbindelser og efter modtagelsen transformeres tilbage. Det signal, som høres i den anden ende, er ikke identisk med det oprindelige signal, men hvis frekvenserne vælges rigtigt vil man kun kunne høre en mindre forskel.

Metoden anvendes også videnskabeligt. Det er muligt ved hjælp af FFT at sammenligne to signaler og identificere komponenter, som med en relativ tidsforskydning indgår i begge signaler. Det anvendes indenfor seismologi til at analysere seismiske signaler, som er registreret på forskellige geografiske positioner. De komponenter i signalerne, som stammer fra samme jordskælv, kan udskilles fordi de ligner hinanden. Tidsforskellen bruges til at fastslå hvor skælvet fandt sted.

Et digitalt foto kan opfattes som en todimensional serie af diskrete værdier. FFT kan også anvendes på todimensionale serier, og anvendes således til komprimering af billedet ved at fjerne frekvenser, som ikke indeholder væsentlig billedinformation.

Den første matematiker, som anvendte FFT, var Gauss omkring 1805. Pga. af hans store grundighed nåede han, som så meget andet, ikke at publicere sine resultater. Det medførte, at de gik i glemmebogen, indtil de genopdagedes af James W. Cooley og John W. Tukey i 1965.

Algoritme

De hyppigst anvendte algoritmer bygger på et "del og hersk"-princip. I den såkaldte radix 2-FFT opdeles Serien i to mindre serier, som derefter hver især opdeles igen ved rekursion, indtil man når frem til så små serier, at de nemt kan transformeres. Metoden beskrives her ved pseudo-kode.

Serien udtrykkes ved en vektor af komplekse værdier:

er det imaginære grundtal, og de indicerede værdier af og er målte serier. Det kunne være venstre og højre kanal i et stereosignal. Tidsforskellen mellem de målte værdier bestemmes af den ønskede øvre frekvens, og længden af serien bestemmes af den ønskede nedre frekvens; disse to størrelser bestemmer værdien af , som i dette eksempel er en potens af 2:

hvor er et naturligt tal.

FFT udføres ved hjælp af funktionen :

Serien opdeles på denne måde:

Beregningstid

Man kan beregne fouriertransformationen for en diskret serie ved at gå ud fra udtrykket:

Det vil kræve beregninger af den komplekse exponentialfunktion og det samme antal komplekse multiplikationer.
Ved at benytte FFT reduceres antallet af beregninger af exponentialfuktionen til og antallet af multiplikationer til .
Hvis n eksempelvis er 1024, så reduceres antallet af trigonometriske beregninger og multiplikationer fra 1.048.576 til 10 og 10240, hhv. Alt andet lige reducerer det beregningstiden med mindst en faktor 100.

Et enkelt eksempel

For at vise hvordan metoden virker er her et eksempel med en serie med længden 8.

I eksemplet benyttes størrelsen:

I beregningerne udnyttes at:

Det medfører yderligere at:

Her benyttes regnereglerne:

og:

Skemaet illustrerer hvordan beregningerne udføres:

f0f1f2f3f4f5f6f7beregning
F0
f0•κ0=f0f1•κ0=f1f2•κ0=f2f3•κ0=f3f4•κ0=f4f5•κ0=f5f6•κ0=f6f7•κ0=f7((f0+f4)+(f2+f6))+((f1+f5)+(f3+f7))
F1f0•κ0=f0f1•κf2•κ²f3•κ3f4•κ4f5•κ5f6•κ6f7•κ7((f0+f4•κ4)+(f2+f6•κ4)•κ²)+((f1+f5•κ4)+(f3+f7•κ4)•κ²)•κ
F2f0•κ0=f0f1•κ²f2•κ4f3•κ6f4•κ8=f4f5•κ10=f5•κ²f6•κ12=f6•κ4f7•κ14=f7•κ6((f0+f4)+(f2+f6)•κ4)+((f1+f5)+(f3+f7)•κ4)•κ²
F3f0•κ0=f0f1•κ3f2•κ6f3•κ9=f3•κf4•κ12=f4•κ4f5•κ15=f5•κ7f6•κ18=f6•κ²f7•κ21=f7•κ5((f0+f4•κ4)+(f2+f6•κ4)•κ6)+((f1+f5•κ4)+(f3+f7•κ4)•κ6)•κ3
F4f0•κ0=f0f1•κ4f2•κ8=f2f3•κ12=f3•κ4f4•κ16=f4f5•κ20=f5•κ4f6•κ24=f6f7•κ28=f7•κ4((f0+f4)+(f2+f6))+((f1+f5)+(f3+f7))•κ4
F5f0•κ0=f0f1•κ5f2•κ10=f2•κ²f3•κ15=f3•κ7f4•κ20=f4•κ4f5•κ25=f5•κf6•κ30=f6•κ6f7•κ35=f7•κ3((f0+f4•κ4)+(f2+f6•κ4)•κ²)+((f1+f5•κ4)+(f3+f7•κ4)•κ²)•κ5
F6f0•κ0=f0f1•κ6f2•κ12=f2•κ4f3•κ18=f3•κ²f4•κ24=f4f5•κ30=f5•κ6f6•κ36=f6•κ4f7•κ42=f7•κ²((f0+f4)+(f2+f6)•κ4)+((f1+f5)+(f3+f7)•κ4)•κ6
F7f0•κ0=f0f1•κ7f2•κ14=f2•κ6f3•κ21=f3•κ5f4•κ28=f4•κ4f5•κ35= f5•κ3f6•κ42=f6•κ²f7•κ49=f7•κ((f0+f4•κ4)+(f2+f6•κ4)•κ6)+((f1+f5•κ4)+(f3+f7•κ4)•κ6)•κ7

Som det ses, er der mange udregninger, som kan genbruges. Eksempelvis indgår flere steder. I algoritmen udregnes denne størrelse kun én gang, og derved spares en del regnetid.

I dette eksempel, hvor serien af hensyn til overskueligheden er ganske lille, er besparelsen også lille. Når serien bliver stor, bliver besparelsen større.

Alternative metoder

Den her viste radix 2 FFT er den mest udbredte algoritme i DSP-kode. Den bygger på, at længden af serien reduceres ved at dele den lige over i to halvdele. Heraf kommer kravet om, at n skal være en potens af 2. Deles serien op i fire dele, kaldes algoritmen for en radix 4 FFT, og på en processor med mange dataregistre kan den være markant hurtigere end radix 2 FFT-algoritmen.

Der er senere udviklet metoder, hvor man udnytter primfaktoropløsning af n. Når m indgår som primfaktor i n, så kan serien opdeles i m mindre serier, som hver har længden n / m. Disse kan så igen opdeles, indtil længden af serierne selv bliver et primtal.

Se også