Snabb fouriertransform

Den här artikeln behöver källhänvisningar för att kunna verifieras. (2020-11)
Åtgärda genom att lägga till pålitliga källor (gärna som fotnoter). Uppgifter utan källhänvisning kan ifrågasättas och tas bort utan att det behöver diskuteras på diskussionssidan.

En snabb fouriertransform (en: Fast Fourier Transform FFT) är en effektiv algoritm för att beräkna en diskret, begränsad fouriertransform. Vanligtvis kräver en diskret fouriertransform av en signal med N {\displaystyle N} sampelpunkter N 2 {\displaystyle N^{2}} multiplikationer, men med hjälp av FFT sjunker denna siffra till i storleksordningen N log N {\displaystyle N\log N} multiplikationer.

Det finns olika FFT-algoritmer med egenskaper som passar för olika definitionsmängder. En av de vanligaste algoritmerna är Cooley–Tukey-algoritmen där radix-2 DIT är det vanligaste fallet.

Historia

Cooley–Tukey-algoritmens historia börjar kring år 1805 då Carl Friedrich Gauss sökte samband för 2 Pallas och Junos asteroidbanor. Eftersom Gauss artikel kring detta endast publicerades postumt och dessutom på latin blev detta inte vida uppmärksammat. I mitten på 1960-talet sammanfördes J. W. Cooley(en) på IBM och John W. Tukey på Princeton University av Richard Garvin på IBM då de hade intresse för liknande algoritmer. De publicerade sedan 1965 en artikel[1] där de återuppfann FFT och visade på hur deras algoritmer kunde användas i datorberäkningar.

Algoritmer

En komplex vektor x = ( x 0 , x 1 , x 2 , , x N 1 ) {\displaystyle x=(x_{0},x_{1},x_{2},\ldots ,x_{N-1})} har diskret fouriertransform x ^ = F ( x ) {\displaystyle {\hat {x}}={\mathcal {F}}(x)} , båda med N {\displaystyle N} element, enligt definition:

x ^ k = n = 0 N 1 x n e i 2 π n k N {\displaystyle {\hat {x}}_{k}=\sum _{n=0}^{N-1}x_{n}\cdot e^{\frac {-i2\pi nk}{N}}} (1)

Det har visat sig att beräkningen kan förenklas långt om antalet element N {\displaystyle N} är en tvåpotens av ett naturligt tal, dvs N {\displaystyle N} = 2 j , j N {\displaystyle =2^{j},j\in \mathbb {N} } .

Radix-2-algoritmen

Redan om antalet element N {\displaystyle N} är jämnt delbart med två kan summan i (1) skrivas om som två hälften så långa summor med udda respektive jämna element vilket är samma som en enda hälften så lång summa med två termer i taget enligt följande:

x ^ k = m = 0 N 2 1 x 2 m e i 2 π 2 m k N + m = 0 N 2 1 x 2 m + 1 e i 2 π ( 2 m + 1 ) k N {\displaystyle {\hat {x}}_{k}=\sum _{m=0}^{{\frac {N}{2}}-1}x_{2m}e^{\frac {-i2\pi 2mk}{N}}+\sum _{m=0}^{{\frac {N}{2}}-1}x_{2m+1}e^{\frac {-i2\pi (2m+1)k}{N}}}

Exponentialuttrycket i båda summorna är lika sånär som på faktorn e i 2 π k N {\displaystyle e^{\frac {-i2\pi k}{N}}} som för ett stort antal element kan beräknas en gång för alla:

x ^ k = m = 0 N 2 1 x 2 m e i 2 π 2 m k N + e i 2 π k N m = 0 N 2 1 x 2 m + 1 e i 2 π 2 m k N {\displaystyle {\hat {x}}_{k}=\sum _{m=0}^{{\frac {N}{2}}-1}x_{2m}e^{\frac {-i2\pi 2mk}{N}}+e^{\frac {-i2\pi k}{N}}\sum _{m=0}^{{\frac {N}{2}}-1}x_{2m+1}e^{\frac {-i2\pi 2mk}{N}}}

Så här långt har ingenting vunnits med dessa omskrivningar, då varje element av x ^ k {\displaystyle {\hat {x}}_{k}} måste fortfarande räknas ut med lika många multiplikationer och additioner som tidigare. Vinsten från dessa omskrivningar kommer av att den övre halvan av elementen använder samma delsummor som den undre halvan, vilket kan visas genom att utnyttja att e i π = 1 {\displaystyle e^{i\pi }=-1} och bryta ut detta:

x ^ k + N / 2 = m = 0 N 2 1 x 2 m e i 2 π 2 m ( k + N / 2 ) N + e i 2 π ( k + N / 2 ) N m = 0 N 2 1 x 2 m + 1 e i 2 π 2 m ( k + N / 2 ) N = m = 0 N 2 1 x 2 m e i 2 π 2 m k N e i 2 π k N m = 0 N 2 1 x 2 m + 1 e i 2 π 2 m k N {\displaystyle {\begin{alignedat}{2}{\hat {x}}_{k+N/2}&=\sum _{m=0}^{{\frac {N}{2}}-1}x_{2m}e^{\frac {-i2\pi 2m(k+N/2)}{N}}+e^{\frac {-i2\pi (k+N/2)}{N}}\sum _{m=0}^{{\frac {N}{2}}-1}x_{2m+1}e^{\frac {-i2\pi 2m(k+N/2)}{N}}\\&=\sum _{m=0}^{{\frac {N}{2}}-1}x_{2m}e^{\frac {-i2\pi 2mk}{N}}-e^{\frac {-i2\pi k}{N}}\sum _{m=0}^{{\frac {N}{2}}-1}x_{2m+1}e^{\frac {-i2\pi 2mk}{N}}\\\end{alignedat}}}

Det framgår att summorna för x ^ k + N / 2 {\displaystyle {\hat {x}}_{k+N/2}} är identiska med summorna för x ^ k {\displaystyle {\hat {x}}_{k}} bortsett från tecknet på den andra summan, vilket innebär att algoritmen räknar ut båda element på en gång.

Algoritmen bygger sedan på att förenklingen drivs vidare så länge antalet termer är jämnt delbart med två, och vinsten är allra störst när totala antalet element x ^ k {\displaystyle {\hat {x}}_{k}} respektive x m {\displaystyle {x}_{m}} är en tvåpotens av ett naturligt tal.

Effektivitet

Om x ^ {\displaystyle {\hat {x}}} beräknas med (1) kommer antalet multiplikationer vara av storleksordningen N 2 {\displaystyle N^{2}} . Om N istället är en tvåpotens kan antalet multiplikationer reduceras till 2 N ( log 2 N ) {\displaystyle 2N(\log _{2}N)} .

Exempel

För att beräkna den diskreta fouriertransformen för en samplad signal med 4096 mätvärden behövs 4096 2 1 , 7 10 7 {\displaystyle 4096^{2}\approx 1,7\cdot 10^{7}} komplexa multiplikationer. Med FFT sjunker antalet till 2 4096 log 2 4096 = 8192 12 9 , 8 10 4 {\displaystyle 2\cdot 4096\cdot \log _{2}4096=8192\cdot 12\approx 9,8\cdot 10^{4}} vilket typiskt går flera hundra gånger snabbare att utföra.

Se även

  • Diskret fouriertransform (DFT)

Referenser

  1. ^ Cooley, James W.; Tukey, John W. (1965). ”An algorithm for the machine calculation of complex Fourier series” (på engelska). Mathematics of Computation 19 (90): sid. 297–301. doi:10.1090/S0025-5718-1965-0178586-1. ISSN 0025-5718. https://www.ams.org/mcom/1965-19-090/S0025-5718-1965-0178586-1/. Läst 28 december 2022.