opeat Fourier-muunnokset Timo ännikkö 1 Fourier-analyysin alkeita 1.1 Fourier-sarjat Olkoon f koko R:ssä määritelty kuvaus siten, että se on integroituva välillä ] π, π[ ja lisäksi -jaksollinen, ts. fx + n = fx, x ] π, π[, missä n käy läpi kokonaisluvut. Käytetään tällaisille kuvauksille merkintää f L 1 ] π, π[. ääritellään kuvaukset φ k : R C asettamalla φ k t = 1 e ikt, missä k on kokonaisluku, ja i = 1 on imaginääriyksikkö. De oivren kaavan mukaan on e ikt = cos kt + i sin kt. Siten luvun e ikt kompleksikonjugaatti on e ikt = e ikt. Edelleen pätee π π { π e ikt, k = 0, dt = cos kt dt + i sin kt dt = π π π 0, k 0, joten π π φ k tφ j t dt = 1 π e ikt e ijt dt = 1 π e ik jt dt = δ kj, π π missä on käytetty Kroneckerin symbolia δ kj eli δ kj = 1, kun k = j, ja δ kj = 0, kun k j. Siis kuvaukset φ k muodostavat ortonormaalin systeemin. Olkoon nyt f L 1 ] π, π[. ääritellään f:n Fourier-kertoimet kuvausten φ k suhteen asettamalla c k = c k f = π π Edelleen määritellään f:n Fourier-sarja F f = F f, x = ftφ k t dt = 1 π k= π c k fφ k x = 1 fte ikt dt. k= c k fe ikx. Huomaa, että F f:n määritelmä on tässä vaiheessa vain muodollinen, sillä kyseinen sarja ei välttämättä suppene. 1
Jos kuvaus f on reaaliarvoinen, voidaan Fourier-sarja kirjoittaa ns. trigonometriseen muotoon seuraavasti: Koska ft = ft, niin c k f = c k f. Silloin k= c k e ikx = c 0 + = c 0 + = c 0 + c k e ikx + c k e ikx k=1 Rec k e ikx + e ikx + i Imc k e ikx e ikx k=1 k=1 Rec k cos kx Imc k sin kx, missä Re ja Im tarkoittavat kompleksiluvun reaali- ja imaginääriosia. erkitään π a 0 = a 0 f = c 0f = 1 ft dt, π π a k = a k f = Re c k f = 1 π ft cos kt dt, k = 1,,..., π π b k = b k f = Im c k f = 1 π ft sin kt dt, k = 1,,..., π jolloin Fourier-sarja saadaan muotoon F f, x = 1 a 0 + π ak cos kx + b k sin kx. Jos f on lisäksi parillinen, ts. f x = fx kaikilla x, niin silloin a k f = π π 0 k=1 ft cos kt dt, b k f = 0. Toisaalta, jos f on pariton, ts. f x = fx kaikilla x, niin silloin a k f = 0, b k f = π π 0 ft sin kt dt. Fourier-sarjan F f suppeneminen riippuu tietenkin kuvauksesta f. Voidaan osoittaa mm. seuraavat tulokset: Lause 1.1. Olkoon f L 1 ] π, π[ siten, että sarja F f suppenee tasaisesti. Silloin f on jatkuva kaikkialla ja F f, x = fx. Lause 1.. Olkoon f L 1 ] π, π[ paloittain jatkuvasti differentioituva. Silloin sarja F f suppenee kaikkialla ja fx, jos f on jatkuva x:ssä, F f, x = 1 lim f x + lim f x, jos x on f:n epäjatkuvuuskohta, x x+ x x missä lim x x+ f x ja lim x x f x ovat f:n toispuoleiset raja-arvot kohdassa x.
Siis paloittain jatkuvasti differentioituva kuvaus voidaan esittää Fourier-sarjana fx = 1 k= 1 π π fte ikt dt e ikx, 1.1 kunhan f on normalisoitu siten, että epäjatkuvuuskohdissa sen arvot määritellään keskiarvoina toispuoleisista raja-arvoista. Voidaan osoittaa, että Fourier-kertoimille pätee c k f 0, kun k. Jos f on vielä säännöllisempi kuin vain integroituva, voidaan osoittaa vahvempiakin tuloksia. Esimerkiksi, jos f C siis f on äärettömän monta kertaa differentioituva, niin silloin k n c k f 0, kun k, millä tahansa kokonaisluvulla n. Tällöin Fourier-sarjan termit lähenevät nollaa, joten kuvausta f voidaan approksimoida katkaistulla sarjalla fx 1 c k fe ikx, missä on riittävän suuri kokonaisluku. 1. Fourier-muunnos k= Se, että edellä tarkasteltiin juuri välillä ] π, π[ integroituvia kuvauksia, ei ole mitenkään oleellista. Jos f on -jaksollinen, niin silloin kelpaa mikä tahansa väli, jonka pituus on. Siten kaikki edellä oleva on sellaisenaan voimassa, vaikka tarkasteluväliksi muutettaisiin esimerkiksi ]0, [. Vastaavasti, jos f on integroituva jollain muulla välillä ] a, a[, missä a > 0, ja on a-jaksollinen, voidaan f esittää muodollisesti Fourier-sarjana fx = 1 a k= 1 a a a fte ikπt/a dt e ikπx/a, 1. joka on siis saatu kaavasta 1.1 suorittamalla skaalaus vakiolla π/a. Johdetaan seuraavassa heuristisesti Fourier-muunnos lähtien esityksestä 1.. Jos merkitään y k = kπ/a ja gy = 1 niin silloin 1. voidaan kirjoittaa fx = k= a a fte iyt x dt, π a gy k gy dy. Tässä on siis laskettu numeerisesti kuvauksen g integraalin arvo välillä ], [ käyttäen askelpituutta π/a. Kun annetaan vielä a, niin saadaan jälleen muodollinen esitys fx = 1 1 3 fte iyt dt e ixy dy. 1.3
Huomaa, että edellä oleva ei ole kaavan 1.3 todistus, vaan ainoastaan heuristinen päättely! Olkoon f nyt koko R:ssä integroituva kuvaus, ts. f 1 = ft dt <. Tällöin merkitään f L 1 R. Kaavan 1.3 pohjalta määritellään ensin Fouriermuunnos F siten, että Ffy = ˆfy = 1 fte iyt dt, jolloin ˆfy vastaa Fourier-kertoimia c k f esityksessä 1.1. ääritellään sitten Fourier-käänteismuunnos F 1 siten, että F 1 ˆfx = 1 ˆfye ixy dy, joka puolestaan vastaa Fourier-sarjaa F f, x esityksessä 1.1. Tällöin on muodollisesti F 1 Ff = f. Ongelmana on kuitenkin, että F 1 ˆfx ei ole välttämättä hyvin määritelty. imittäin, jos f L 1 R, niin silloin sen Fourier-muunnos Ff on kyllä olemassa, mutta siitä ei seuraa, että ˆf L 1 R. Voidaan kuitenkin osoittaa seuraava tulos: Lause 1.3. Olkoon f L 1 R siten, että ˆf L 1 R. Silloin f on jatkuva kaikkialla ja F 1 ˆfx = fx. Tilanne vastaa siten Fourier-sarjojen tapausta: Fourier-kertoimet c k f ovat aina olemassa kun f L 1 ] π, π[, mutta Fourier-sarja F f ei välttämättä suppene ilman lisäoletuksia. Lausetta 1.1 vastaa nyt lause 1.3. Kuten kaavasta 1.3 nähdään voidaan Fourier-muunnoksen ja -käänteismuunnoksen skaalauskertoimiksi valita mitkä tahansa luvut, kunhan niiden tulo on 1/. Yleensä kuitenkin valitaan kertoimiksi 1/, sillä silloin Ff ja F 1 ˆf ovat samannäköisiä itse asiassa ne ovat oleellisesti sama kuvaus. Fourier-muunnokselle pätee mm. seuraavat tulokset: Lause 1.4. Fourier-muunnos F on lineaarinen, ts. missä f, g L 1 R ja λ C. f + gy = ˆfy + ĝy, λfy = λ ˆfy, Todistus. Seuraa suoraan integraalin lineaarisuudesta. Lause 1.5. Fourier-muunnos F muuttaa derivoinnin kertolaskuksi, ts. f y = iy ˆfy, missä f L 1 R siten, että f L 1 R ja b a f t dt = fb fa a, b R. Todistus. Oletuksesta f, f L 1 R seuraa, että fx 0, kun x. Siten väite saadaan osittaisintegroinnilla. 4
Jos f L 1 R on parillinen, niin silloin ˆfy = ft cos yt dt, 1.4 π 0 joten myös ˆf on parillinen. Toisaalta, jos f L 1 R on pariton, niin silloin ˆfy = i ft sin yt dt, 1.5 π joten myös ˆf on pariton. Kaavan 1.4 määrittelemää kuvausta sanotaan Fourierkosinimuunnokseksi, ja kaavan 1.5 määrittelemää kuvausta ilman kerrointa i Fourier-sinimuunnokseksi. ämä molemmat muunnokset ovat muodollisesti omia käänteismuunnoksiaan. 1.3 Konvoluutiot Eräs tärkeä Fourier-muunnosten sovellus on ns. konvoluutioiden laskeminen. Olkoot f, g L 1 R. ääritellään konvoluutio f g siten, että f gx = 0 fx tgt dt. Huomataan, että konvoluutio on symmetrinen, ts. f gx = g fx niillä x, joilla se on määritelty. Itse asiassa voidaan osoittaa, että konvoluutio on määritelty melkein kaikkialla. Yhteyden Fourier-muunnoksiin antaa seuraava tulos, ns. konvoluutiolause: Lause 1.6. Olkoot f, g L 1 R. Silloin f g L 1 R ja f gy = ˆfyĝy. Todistus. Oletuksen mukaan f 1 < ja g 1 <. Silloin f gx dx = fx t gt dt dx fx t dx gt dt = f 1 gt dt = f 1 g 1 <, joten f g L 1 R. Tällöin f gy on hyvin määritelty ja f gy = 1 fx tgt dt e iyx dx 1 = fx te iyx t dx gte iyt dt joten lause on voimassa. = ˆfy gte iyt dt = ˆfyĝy, 5
Diskreetti Fourier-muunnos.1 Johdanto Sovelluksissa esiintyy usein tilanne, jossa tutkittavasta systeemistä mitataan jotain suuretta tietyn mittausjakson aikana; esimerkiksi signaalianalyysissä signaalista otetaan näytteitä sopivin väliajoin. Saatua diskreettiä mittausaineistoa käsitellään sitten Fourier-analyysin keinoin. Fysiikan termein ilmaistuna Fourier-muunnoksen diskreetti versio siirtää signaalit aika-alueelta time domain taajuusalueelle frequency domain. Skaalataan aika t siten, että mittausjaksona on [0, ]. Olkoot t j = j/, missä j = 0, 1,..., 1, mittaushetket ja f j C vastaavat mittausarvot. Tässä siis on mittausten lukumäärä, joka seuraavassa oletetaan parilliseksi, ts. = jollain positiivisella kokonaisluvulla. ittausarvot f j voidaan tulkita -jaksollisen kuvauksen f pistearvoiksi ft j. Siten f j :t voidaan laajentaa -jaksolliseksi pisteistöksi, ts. f j+n = f j, j = 0, 1,..., 1, missä n käy läpi kokonaisluvut. Otetaan vielä käyttöön merkintä w = e i/. Helposti todetaan, että tällöin pisteistö w j on -jaksollinen. Edelleen pätee seuraava ortogonaalisuustulos: Lause.1. Olkoot 0 k, j 1. Silloin Todistus. Ensin todetaan, että 1 1 w kl w lj = w kl w lj = δ kj. 1 w kl w lj = 1 w k jl. Jos k = j, niin w k j = 1. Silloin 1 wk jl =, eli väitteen ensimmäinen osa on voimassa. Olkoon sitten k j, jolloin w k j 1. Huomataan, että w k j = 1 kaikilla k ja j, joten w k j on polynomin pz = z 1 juuri. Toisaalta pz = z 1 1 zl, joten w k j 1 1 w k jl = 0. yt w k j 1 0, joten täytyy olla 1 wk jl = 0, eli myös väitteen toinen osa on voimassa.. Diskreetit muunnokset ääritellään pisteistö φ kj siten, että φ kj = 1 w kj, k, j = 0, 1,..., 1. Lauseen.1 mukaan on 1 φ kl φ lj = δ kj,.1 6
eli φ kj :t muodostavat ortonormaalin kannan. ääritellään diskreetti Fourier-muunnos eli discrete Fourier transform, DFT asettamalla ˆf k = 1 f j φ kj = 1 1 f j w kj, k = 0, 1,..., 1. Huomataan, että myös pisteistö ˆf k on -jaksollinen. ääritellään edelleen diskreetti Fourier-käänteismuunnos asettamalla f j = 1 k=0 ˆf k φ jk = 1 1 k=0 ˆf k w jk, j = 0, 1,..., 1, joka todella on käänteismuunnos, sillä kaavan.1 mukaan Koska f l = 1 k=0 1 f j φ kj φ lk = f j = 1 1 k=0 1 1 k=0 φ lk φ kj f j = ˆf k w jk = 1 1 k=0 ˆf k w jk, 1 δ lj f j = f l. niin käänteismuunnos voidaan suorittaa varsinaisen muunnoksen avulla seuraavasti: Ensin otetaan kompleksikonjugaatti ˆf k, sitten sovelletaan tähän diskreettiä Fouriermuunnosta, ja lopuksi otetaan tuloksesta jälleen kompleksikonjugaatti. Diskreetille Fourier-muunnokselle pätee mm. seuraavat tulokset: Lause.. Diskreetti Fourier-muunnos on lineaarinen, ts. missä f j, g j ovat -jaksollisia ja λ C. Todistus. Harjoitustehtävä. f + g k = ˆf k + ĝ k, λfk = λ ˆf k, Lause.3. Diskreetti Fourier-muunnos säilyttää normin, ts. on voimassa Parsevalin yhtälö missä f j on -jaksollinen. Todistus. Harjoitustehtävä. 1 k=0 ˆf k = 1 f j, ääritelmän mukaan jokaisen ˆf k laskemiseksi täytyy suorittaa +1 kertolaskua ja 1 yhteenlaskua sekä laskea w kj :t. Toisaalta pisteitä ˆf k on kappaletta, joten tarvitaan + kertolaskua ja yhteenlaskua. Siten diskreetin Fouriermuunnoksen vaativuus kun se lasketaan suoraan määritelmästä on O. 7
.3 Reaaliset muunnokset Tarkastellaan seuraavaksi erikoistapausta, jossa mittausarvot ovat reaalisia, siis f j = f j, j = 0, 1,..., 1. Tällöin voitaisiin tietenkin käyttää edellä esitettyä kompleksista :n pisteen Fourier-muunnosta. Osoittautuu kuitenkin, että reaalisessa tapauksessa muunnos on mahdollista tehdä siten, että tarvitsee suorittaa vain yksi :n pisteen muunnos missä siis = /. Tarkastellaan aluksi tilannetta, jossa käsiteltävänä on kaksi reaalista -jaksollista pisteistöä g j ja h j. ääritellään z j = g j + ih j, j = 0, 1,..., 1, jolloin z j on kompleksinen -jaksollinen pisteistö. Sovelletaan tähän edellä esitettyä diskreettiä Fourier-muunnosta. uunnoksen lineaarisuuden nojalla on ẑ k = ĝ k + iĥk. Koska g j :t ovat reaalisia, niin ĝ k = ĝ k = ĝ k. Vastaava tulos pätee tietenkin myös ĥk:lle. Silloin ẑ k = ĝ k iĥk. äistä kahdesta yhtälöstä seuraa siten ĝ k = 1 ẑ k + ẑ k, ĥk = i ẑ k ẑ k. Huomaa, että nämä tarvitsee laskea vain k:n arvoilla 0, 1,...,, sillä ĝ k = ĝ k ja ĥ k = ĥk. äin siis saadaan muodostettua kahden reaalisen pisteistön diskreetit Fourier-muunnokset suorittamalla vain yksi kompleksinen muunnos. Sovelletaan nyt tätä menetelmää f j :n Fourier-muunnosten laskemiseen. ääritellään g j = f j, h j = f j+1, j = 0, 1,..., 1, jolloin g j ja h j ovat molemmat -jaksollisia. Lasketaan ẑ k, k = 0, 1,..., 1, kuten aikaisemmin, mutta nyt vain :n tilalla on. Huomaa siis, että nyt muuttuja w, joka esiintyy diskreetin muunnoksen määritelmässä, täytyy korvata muuttujalla w = e i/. Edellä esitetyn mukaisesti saadaan ĝ k = 1 ẑ k + ẑ k, ĥk = i ẑ k ẑ k,. jotka siis tarvitsee laskea vain k:n arvoilla 0, 1,..., /, sillä ĝ k = ĝ k ja ĥ k = ĥ k. Pisteistön f j diskreetti Fourier-muunnos puolestaan on :n pisteen muunnos, joten sen määritelmässä esiintyy w = e i/. Huomataan, että w = w. Siten k:n arvoilla 0, 1,..., 1 saadaan ˆf k = 1 1 f j w kj = 1 = 1 1 g j w kj + w k f j w kj + 1 8 h j w kj f j+1 w kj k = 1 ĝk + w k ĥk,
missä ĝ k ja ĥk saadaan yhtälöistä.. Koska w = 1, niin loput ˆf k :t saadaan yhtälöstä ˆf +k = 1 ĝ+k + w k 1 ĥ +k = ĝk w ĥk k, missä k = 0, 1,..., 1. Siten reaalisen :n mittaisen pisteistön diskreetti Fouriermuunnos voidaan laskea suorittamalla yksi kompleksinen :n mittaisen pisteistön muunnos. Olkoon f j, j = 0, 1,..., 1, edelleen reaalinen pisteistö. Diskreetti Fouriermuunnos ˆf k voidaan kirjoittaa muotoon ˆf k = Re ˆf k + i Im ˆf 1 1 k = f j cos kj yt saadaan 1 f j cos kj = f 0 + Vastaavasti 1 j=1 1 1 + i f j cos πkj + 1k f + j=1 = f 0 + f j + f j cos πkj + 1k f. f j sin kj j=1 = j=1 f j sin πkj + f j sin j=1 = f j f j sin πkj. j=1 f j cos f j sin kj. πk j πk j Jos f j on parillinen pisteistö, ts. f j = f j kaikilla j, niin silloin Im ˆf k = 0 ja 1 ˆf k = f 0 + f j cos πkj + 1k f,.3 j=1 joten myös ˆf k on parillinen. Toisaalta, jos f j on pariton pisteistö, ts. f j = f j kaikilla j, niin silloin Re ˆf k = 0 ja ˆf k = i j=1 f j sin πkj,.4 joten myös ˆf k on pariton. Kaava.3 määrittelee diskreetin Fourier-kosinimuunnoksen, ja kaava.4 ilman kerrointa i määrittelee diskreetin Fourier-sinimuunnoksen. Voidaan osoittaa, että näissä kahdessa tapauksessa kyseiset muunnokset on mahdollista tehdä siten, että tarvitsee suorittaa vain yksi /:n pisteen muunnos. 9
Esimerkki.1. Tarkastellaan Fourier-analyysin soveltamista yksinkertaiseen signaalinkäsittelytehtävään. Kuvassa 1 esitetystä reaaliarvoisesta signaalista ft = sin0t + sin35t + sin50t otetaan näytteet f j = ft j ajanhetkillä t j = jδt, j = 0, 1,..., 1, missä δt = 0.001 ja = 56. Käytännössä mittaustulokset sisältävät kuitenkin aina myös kohinaa, joten mitattu signaali on todellisuudessa kuvassa esitettyä muotoa. 4 3 1 0-1 - -3-4 0 50 100 150 00 50 AIKA S Kuva 1: Alkuperäinen signaali 4 3 1 0-1 - -3-4 0 50 100 150 00 50 AIKA S Kuva : Häiritty signaali uodostetaan pisteistön f j diskreetti Fourier-muunnos ˆf k ja lasketaan ˆf k /, jota kutsutaan signaalin diskreetiksi tehospektriksi power spectrum. Kuvassa 3 10
on esitetty tehospektri taajuuden φ k = k/δt funktiona. Siitä nähdään, mitkä taajuudet ovat dominoivia alkuperäisessä signaalissa: Jokainen suuri piikki kuvaa yhtä taajuutta, kun taas pienemmät piikit ovat kohinan aiheuttamia. Koska f j :t ovat reaalisia, on ˆf k = ˆf k, joten riittää, että lasketaan vain pisteet k = 0, 1,..., / 1; siis vain puolet taajuusalueesta on käyttökelpoista taajuudet välillä 0 Hz... 1/δt Hz. 60 50 40 30 0 10 0 0 50 100 150 00 50 300 350 400 450 500 TAAJUUS HZ Kuva 3: Tehospektri 4 3 1 0-1 - -3-4 0 50 100 150 00 50 AIKA S Kuva 4: Suodatettu signaali Suodatetaan nyt kohina pois, ts. asetetaan ˆf k :sta nolliksi ne komponentit, jotka vastaavat yli 100 Hz taajuuksia. uodostamalla diskreetti Fourier-käänteismuunnos saadaan kuvassa 4 esitetty suodatettu signaali, joka on oleellisesti sama kuin alkuperäinen signaali. 11
.4 Diskreetit konvoluutiot Diskreettiä Fourier-muunnosta voidaan käyttää mm. konvoluutioiden laskemiseen. Olkoot f j ja g j kaksi -jaksollista pisteistöä. ääritellään diskreetti konvoluutio f g j = 1 f j l g l, j = 0, 1,..., 1. Helposti todetaan, että konvoluutio on symmetrinen, ts. f g j = g f j. Edelleen pätee seuraava tulos, ns. konvoluutiolause: Lause.4. Olkoot f j ja g j -jaksollisia. Silloin f g k = ˆf k ĝ k. Todistus. Diskreetin Fourier-muunnoksen määritelmän mukaan on f g k = 1 1 f g j w kj = 1 1 1 f j l g l w kj = 1 joten lause on voimassa. 1 1 f j l w kj l g l w kl = ˆf 1 k g l w kl = ˆf k ĝ k, Siten konvoluution laskemiseksi tämän lauseen avulla täytyy suorittaa kaksi :n pisteen diskreettiä Fourier-muunnosta, yksi :n pisteen diskreetti Fourier-käänteismuunnos ja + 1 kertolaskua. Jos Fourier-muunnokset lasketaan suoraan määritelmän mukaan, ei tästä menetelmästä ole kuitenkaan mitään hyötyä, sillä jokaisen muunnoksen vaativuus on O, kun taas konvoluutio voidaan laskea suoraan :lla kertolaskulla ja 1:llä yhteenlaskulla. Jos sen sijaan käytetään seuraavassa esiteltäviä nopeita Fourier-muunnoksia, on konvoluutioiden laskeminen tällä tavalla selvästi tehokkaampaa. 3 opeat Fourier-muunnokset 3.1 Johdanto Kuten edellä on jo todettu, diskreetin Fourier-muunnoksen vaativuus on O silloin, kun se lasketaan suoraan määritelmän mukaan. On kuitenkin kehitetty useita erilaisia algoritmeja, joilla muunnos voidaan laskea siten, että vaativuus on vain O log. Suurilla :n arvoilla tämä ero on hyvinkin merkittävä; esimerkiksi, jos = 18, niin = 16 384, mutta log = 896 siis suhde on noin 5.47%, tai jos = 104, niin = 1 048 576, mutta log = 10 40 siis suhde on noin 0.98%. Tällaisia algoritmeja kutsutaan yhteisellä nimellä nopeat Fourier-muunnokset eli fast Fourier transforms, FFT. 1
3. Yleinen algoritmi Tarkastellaan aluksi yleistä tilannetta, jossa on kahden luvun tulo, ts. = 1. ääritellään indeksit j ja k uudelleen siten, että j = 1 j + j 1, k = k 1 + k, missä j 1, k 1 = 0, 1,..., 1 1 ja j, k = 0, 1,..., 1. Silloin diskreetti Fouriermuunnos ˆf k = 1 1 f j w kj, missä w = e i/, voidaan kirjoittaa muotoon ˆf k 1 +k = 1 1 1 j 1 =0 = 1 1 1 j 1 =0 1 j =0 1 j =0 Koska w 1 = 1, w = w 1 ja w 1 ˆf k 1 +k = 1 1 1 1 j 1 =0 f 1 j +j 1 w k 1 +k 1 j +j 1 f 1 j +j 1 w 1 k 1 j w k 1 j 1 w 1k j w k j 1. w k j 1 = w, niin saadaan 1 1 j =0 f 1 j +j 1 w k j w k 1j 1 1. 3.1 Tästä huomataan, että diskreetti Fourier-muunnos voidaan laskea kolmessa vaiheessa seuraavasti: 1 erkitään g j = f 1 j +j 1, j = 0, 1,..., 1; siis pisteistöön g j valitaan joka 1 :s alkio pisteistöstä f j. Kullakin j 1 saadaan eri pisteistö g j = g j1,j. Lasketaan :n pisteen diskreetit Fourier-muunnokset ĝ k = 1 1 j =0 g j w k j = 1 1 j =0 f 1 j +j 1 w k j. Tämä siis tehdään erikseen kullakin j 1, ts. muodostetaan 1 kappaletta :n pisteen muunnoksia ĝ k = ĝ j1,k. erkitään h j1 = w k j 1 ĝ j1,k, j 1 = 0, 1,..., 1 1; siis kerrotaan pisteistöjen ĝ j1,k alkiot kiertokertoimilla twiddle factors w k j 1. Siten kullakin k saadaan eri pisteistö h j1 = h k,j 1. 3 Lasketaan 1 :n pisteen diskreetit Fourier-muunnokset ĥ k1 = 1 1 1 1 j 1 =0 h j1 w k 1j 1 1 = 1 1 1 1 j 1 =0 w k j1ĝ j1,k w k 1 j 1 1. Tämä siis tehdään erikseen kullakin k, ts. muodostetaan kappaletta 1 :n pisteen muunnoksia ĥk 1 = ĥk,k 1. yt todetaan, että 3.1:n mukaan ˆf k = ĥk,k 1. Edellä kuvattu algoritmi siis perustuu siihen, että yhden suuren Fourier-muunnoksen sijaan lasketaan useampi pienempi muunnos. Jos Fourier-muunnos lasketaan suoraan :n pisteen muunnoksena, tarvitaan + = 1 1 + 1 13
kertolaskua. Edellä sen sijaan lasketaan 1 kertaa :n pisteen muunnos, kerrotaan 1 kertaa kiertokertoimilla, ja lasketaan kertaa 1 :n pisteen muunnos. Siten tarvitaan vain 1 + + 1 + 1 + 1 = 1 1 + + 3 kertolaskua, mikä on selvästi vähemmän kuin 1 1 + 1. äin ollen kyseinen algoritmi todella on nopea Fourier-muunnos. Algoritmin laskut voidaan tehdä myös toisessa järjestyksessä, sillä kaava 3.1 voidaan kirjoittaa muotoon ˆf k 1 +k = 1 1 j =0 1 1 1 1 j 1 =0 w k j 1 f 1 j +j 1 w k 1 j 1 1 w k j. 3. Tällöin siis f j jaetaan :een pienempään osaan, joissa kussakin on 1 peräkkäistä alkiota alkuperäisestä pisteistöstä f j. Ensin ne kerrotaan kiertokertoimilla, sitten muodostetaan kappaletta 1 :n pisteen muunnoksia, ja lopuksi muodostetaan 1 kappaletta :n pisteen muunnoksia. Jos luvut 1 ja ovat jälleen muotoa 1 = 1,1 1, ja =,1,, voidaan nopeaa Fourier-muunnosta soveltaa edelleen yllä mainittujen 1 :n ja :n pisteen muunnosten laskemiseen; tällöin vain 1 :n ja :n tilalla on i,1 ja i, missä i = 1,. Siten nopea Fourier-muunnos on entistä tehokkaampi, jos sitä voidaan käyttää rekursiivisesti. Useimmiten valitaankin siten, että se on jokin kakkosen potenssi, sillä silloin jokaisessa vaihessa kaikki pisteistöt voidaan aina jakaa kahteen yhtä suureen osaan. Seuraavassa käytetään tällaisista menetelmistä nimitystä Cooley Tukey-algoritmit, sillä heidän esittämänsä alkuperäinen nopea Fouriermuunnos vuodelta 1965 oli juuri tätä muotoa. 3.3 Kaksikantainen algoritmi Oletetaan siis seuraavassa, että = n jollain n. Asetetaan 1 = ja = / = n 1. Tällöin siis pisteistö f j jaetaan kahteen osaan siten, että parittomat ja parilliset alkiot kerätään omiin ryhmiinsä. erkitään, kuten ennenkin, = /. Silloin kaava 3.1 tulee muotoon ˆf k1 +k = 1 1 j 1 =0 w k j 1 1 j =0 f j +j 1 w k j w k 1j 1, missä k 1 = 0, 1 ja k = 0, 1,..., 1. Indeksin k 1 arvolla 0 saadaan kun merkitään yksinkertaisuuden vuoksi k = k ja j = j [ ] ˆf k = 1 1 f j w kj + w k 1 f j+1 w kj, 3.3 missä siis k = 0, 1,..., 1. Toisaalta, koska w 1 = e iπ = 1, niin k 1 :n arvolla 1 saadaan ] [ ˆf +k = 1 1 f j w kj w k 14 1 f j+1 w kj, 3.4
missä myös k = 0, 1,..., 1. Tässä lähestymistavassa, josta käytetään nimitystä aikaharvennus decimation in time, suoritetaan siis kaksi /:n pisteen diskreettiä Fourier-muunnosta, kerrotaan / kertaa w k :lla ja lopuksi suoritetaan yhteenlaskua. Lisäksi täytyisi vielä kertoa kertaa vakiolla 1/, mutta tämä vakio voidaan viedä sisään summalausekkeisiin, jolloin kyse on itse asiassa vain alkioiden f j skaalauksesta. Kun samaa algoritmia sovelletaan uudelleen molempiin /:n pisteen muunnoksiin, silloin suoritetaan yhteensä neljä /4:n pisteen muunnosta, / siis kaksi kertaa /4 kertolaskua ja siis kaksi kertaa / yhteenlaskua sekä lisäksi jälleen skaalaukset vakiolla 1/. Yleisesti tasolla m suoritetaan m kappaletta n m :n pisteen muunnosta, / kertolaskua ja yhteenlaskua. Lopulta viimeisellä tasolla m = n = log suoritetaan kappaletta triviaaleja yhden pisteen muunnoksia, / kertolaskua ja yhteenlaskua. Siten kertolaskujen lukumäärä on yhteensä / log ja yhteenlaskujen lukumäärä log. Lisäksi täytyy suorittaa kaikki siirretyt skaalaukset siis f j :t täytyy kertoa vakiolla 1/ n = 1/ jolloin kertolaskujen lukumäärä lisääntyy :llä; mutta koska kyseessä on todella vain skaalaus, jätetään tämä yksinkertaisuuden vuoksi seuraavissa tarkasteluissa huomiotta. äin ollen kaksikantaisen nopean Fourier-muunnoksen vaativuus on O log. Vaihtoehtoinen muoto algoritmille saadaan asettamalla 1 = / = n 1 ja = ; siis pisteistö f j jaetaan kahteen osaan siten, että alku- ja loppupuoliskot muodostavat omat ryhmänsä. Tällöin kaava 3. tulee muotoon ˆf k1 +k = 1 1 1 w k j 1 f j +j 1 w k 1 j 1 j =0 j 1 =0 w k j, missä k 1 = 0, 1,..., 1 ja k = 0, 1. Indeksin k arvolla 0 saadaan kun merkitään k = k 1 ja j = j 1 ˆf k = 1 1 f j + f +j w kj, missä siis k = 0, 1,..., 1. Toisaalta k :n arvolla 1 saadaan ˆf k+1 = 1 1 w j f j f +j w kj, missä myös k = 0, 1,..., 1. Tässä lähestymistavassa, josta käytetään nimitystä taajuusharvennus decimation in frequency, suoritetaan siis yhteenlaskua, kerrotaan / kertaa w j :llä ja suoritetaan kaksi /:n pisteen diskreettiä Fourier-muunnosta. Kuten edelläkin, koko muunnos voidaan tehdä rekursiivisesti log :ssä vaiheessa, ja siten kerto- ja yhteenlaskujen lukumäärät ovat täsmälleen samat kuin algoritmin edellisessäkin versiossa. Huomataan, että merkittävä osa kaksikantaisen algoritmin vaatimista kertolaskuista on itse asiassa triviaaleja kertomisia vakioilla ±1 ja ±i. Esimerkiksi alimmalla tasolla, kun suoritetaan kahden pisteen muunnoksia, kiertokertoimet ovat w k = e kiπ = 1 k ; seuraavalla tasolla ne puolestaan ovat w4 k = e kiπ/ = i k. 15
Yhteensä tällaisia kertolaskuja on 3/ kappaletta. Lisäksi, jos kompleksiset kerto-ja yhteenlaskut järjestetään reaalisina kerto- ja yhteenlaskuina käyttäen hyödyksi trigonometristen kuvausten symmetrisyysominaisuuksia, pienenee algoritmin vaativuus edelleen. Voidaan osoittaa, että kaksikantainen Fourier-muunnos kun jätetään skaalaus vakiolla 1/ huomiotta on mahdollista suorittaa käyttäen 3/ log 5 + 8 reaalista kertolaskua ja 7/ log 5 + 8 reaalista yhteenlaskua. 3.4 Korkeampikantaiset algoritmit Oletetaan seuraavaksi, että = n = 4 n/ jollain parillisella n. Asetetaan 1 = 4 ja = /4 = 4 n/ 1, ts. pisteistö f j jaetaan neljään yhtä suureen osaan. Tällöin kaava 3.1 kun jätetään yksinkertaisuuden vuoksi skaalaukset pois tulee muotoon ˆf k = ˆf /4+k = ˆf /+k = ˆf 3/4+k = 3 3 3 3 /4 1 w kl i l w kl 1 l w kl f 4j+l w kj /4, /4 1 /4 1 f 4j+l w kj /4, f 4j+l w kj /4, /4 1 i l w kl f 4j+l w kj /4, missä k = 0, 1,..., /4 1. Saadaan siis nelikantainen algoritmi, jossa jokaisessa vaiheessa :n pisteen Fourier-muunnos palautetaan neljäksi /4:n pisteen muunnokseksi siten, että kerrotaan kertaa kiertokertoimilla ja suoritetaan 3 yhteenlaskua. Tämä tehdään rekursiivisesti n/:ssa vaiheessa, jolloin tarvitaan kaiken kaikkiaan / log kertolaskua ja 3/ log yhteenlaskua. yt näyttäisi, että nelikantaisessa algoritmissa tarvitaan enemmän laskutoimituksia kuin kaksikantaisessa algoritmissa. Jos kuitenkin jälleen huomioidaan kaikki triviaalit kertolaskut ja toteutetaan kompleksiset laskutoimitukset reaalisina siten, että käytetään hyväksi trigonometristen kuvausten symmetrisyysominaisuuksia, voidaan vaativuutta pienentää huomattavasti. Voidaan osoittaa, että nelikantainen algoritmi on mahdollista suorittaa käyttäen 9/8 log 43/1 + 16/3 reaalista kertolaskua ja 5/8 log 43/1+16/3 reaalista yhteenlaskua. Siten kertolaskujen lukumäärä on jopa 5% pienempi kuin kaksikantaisessa algoritmissa. Laskutoimitusten määrää voidaan edelleen hieman pienentää, jos käytetään kahdeksan- tai kuusitoistakantaisia algoritmeja; tällöin siis on oltava joko = 8 n/3 tai = 16 n/4, missä n on jaollinen kolmella tai neljällä, vastaavasti. Yleisemmässä tapauksessa = n voidaan käyttää vaihtuvakantaisia algoritmeja: Esimerkiksi, koska 3 = 4, niin 3:n pisteen Fourier-muunnos voidaan laskea suorittamalla ensin kaksi askelta nelikantaisella algoritmilla ja sen jälkeen yksi askel kaksikantaisella algoritmilla. 16
3.5 Tietokonetoteutuksesta Tarkastellaan seuraavaksi, millä tavalla kaksikantainen Cooley Tukey-tyyppinen nopea Fourier-muunnos siis kaavat 3.3 3.4 voitaisiin toteuttaa tietokoneella. Olkoon m rekursiotason ilmaiseva laskuri, joka käy läpi arvot 0, 1,..., n missä siis n = log. Taso m = 0 tarkoittaa alustusaskelta, jossa suoritetaan triviaalit yhden pisteen muunnokset ˆf 0 = f 0, ja taso m = n tarkoittaa lopetustasoa, jossa muodostetaan lopullinen muunnos ˆf k, k = 0, 1,..., 1. Tällöin kullakin tasolla kaavoissa 3.3 3.4 lukuja ja vastaavat luvut m ja m 1, ja kiertokertoimet ovat muotoa w k = m e ki/m = w k/m missä w on alkuperäinen w = w. [m] erkitään tasolla m laskettavia osamuunnoksia ˆf j,k, missä j ilmoittaa osamuunnoksen järjestysnumeron jolloin j = 0, 1,..., n m 1 ja k ilmoittaa, kuten ennenkin, pisteen järjestysnumeron ko. muunnoksessa jolloin k = 0, 1,..., m 1. Yksinkertaisuuden vuoksi siirretään kaikki vakiot 1/ sisään summalausekkeisiin, w k jolloin siis pisteistö f j skaalataan aluksi vakiolla 1/ tai yhtäpitävästi, kerrotaan vakiot 1/ yhtälöiden vasemmille puolille, jolloin siis muunnospisteistö ˆf k skaalataan lopuksi vakiolla 1/. Tällöin kaavojen 3.3 3.4 antama algoritmi voidaan kirjoittaa seuraavaan muotoon: 1. Alustus Asetetaan. Arvoilla m = 1,,..., n lasketaan ˆf [0] j,0 = f j, missä j = 0, 1,..., 1. ˆf [m] j,k [m 1] = ˆf j,k + w k/m [m 1] ˆf n m +j,k, ˆf [m] [m 1] j, m 1 +k = ˆf j,k w k/m [m 1] ˆf n m +j,k, missä j = 0, 1,..., n m 1 ja k = 0, 1,..., m 1 1. 3. Lopetus Asetetaan ˆf k = [n] ˆf 0,k, missä k = 0, 1,..., 1. [m] Kullakin tasolla m lasketaan kappaletta pisteitä ˆf j,k, joiden tallentamiseen tarvitaan siten :n pituinen vektori. Jokaiselle tasolle ei tarvitse määritellä uutta tallennusvektoria, sillä tason m pisteiden laskemiseen käytetään vain edellisen tason [m] m 1 pisteitä; tällöin uudet ˆf j,k :t lasketaan ensin johonkin :n pituiseen työtilavektoriin, ja sen jälkeen ne voidaan siirtää varsinaiseen tallennusvektoriin vanhojen [m 1] pisteiden ˆf j,k tilalle. Jotta tiedettäisiin, missä kohtaa tallennusvektorissa kukin piste on, tarvitaan [m] jokin kokonaislukuarvoinen kuvaus l = lm, j, k, jolloin siis piste ˆf j,k tallennetaan indeksillä lm, j, k. Kuvaukselta l vaaditaan, että sen arvot lm, j, k käyvät läpi joukon {0, 1,..., 1}, kun j = 0, 1,..., n m 1 ja k = 0, 1,..., m 1. Edelleen olisi hyvä, jos sekä alku- että loppupisteistöt f j ja ˆf k olisivat valmiiksi oikeassa järjestyksessä, ts. l0, j, 0 = j, j = 0, 1,..., 1, 3.5 ln, 0, k = k, k = 0, 1,..., 1. 3.6 Silloin vältyttäisiin ylimääräisiltä pisteiden permutoinneilta. Yksinkertaisin kuvaus, joka toteuttaa edellä mainitut ehdot, on lm, j, k = j m + k. Tällöin kuitenkin kullakin tasolla m tarvitaan välttämättä :n pituinen 17
työtilavektori; siis kaikki tason m pisteet täytyy laskea ennen kuin ne voidaan siirtää tason m 1 pisteiden tilalle. Osoittautuu, että l on mahdollista määritellä siten, että laskut voidaan tehdä paikallaan, ts. algoritmin askeleessa lasketut kaksi uutta pistettä voidaan sijoittaa välittömästi vastaavien vanhojen pisteiden tilalle. Halutaan siis, että lm, j, k = lm 1, j, k, lm, j, m 1 + k = lm 1, n m + j, k, 3.7 kaikilla j = 0, 1,..., n m 1 ja k = 0, 1,..., m 1 1. Edelleen olisi hyvä, jos myös nyt alku- ja loppupisteistöt olisivat valmiiksi oikeassa järjestyksessä, mutta tässä tapauksessa molemmat ehdot 3.5 3.6 eivät voi olla voimassa samanaikaisesti. Olkoon ensin 3.5 voimassa, jolloin siis f j :t ovat oikeassa järjestyksessä. Tutkitaan, mihin muotoon algoritmi tulee tässä tapauksessa. erkitään k = m 1 i=0 k i i, missä k i {0, 1}, jolloin k i :t ovat indeksin k bitit sen binääriesityksessä. Tällöin ehdot 3.7 voidaan kirjoittaa muotoon lm, j, k = lm 1, j + k m 1 n m, m i=0 k i i, missä j = 0, 1,..., n m 1 ja k = 0, 1,..., m 1. Käytetään tätä rekursiivisesti, jolloin saadaan lm, j, k = lm, j + k m 1 n m + k m n m+1, m 3 i=0 k i i = = l0, j + k m 1 n m + + k 0 n 1, 0 = l0, j + n m m 1 i=0 k m i 1 i, 0. 3.8 ääritellään operaattori b m siten, että b m k = m 1 i=0 k m i 1 i, ts. b m kääntää indeksin k bitit päinvastaiseen järjestykseen. Tällöin 3.5 ja 3.8 yhdessä antavat ja erityisesti lm, j, k = j + n m b m k, ln, 0, k = b n k k = 0, 1,..., 1. Siis tulospisteet ˆf k saadaan bittikäänteisessä järjestyksessä bit-reversed order. Algoritmin vaiheessa tarvitaan indeksejä lm 1, j, k ja lm 1, n m + j, k, jotka edellä olevan mukaan ovat lm 1, j, k = j + n m+1 b m 1 k, lm 1, n m + j, k = n m + j + n m+1 b m 1 k. Kun vielä huomataan, että algoritmissa k voidaan korvata b m 1 k:lla sillä onhan samantekevää, missä järjestyksessä indeksit käydään läpi, niin nopea Fourier-muunnos tulee seuraavaan muotoon: Alustus ja skaalaus: do j = 0, 1 Aj := f j / end do 18
Rekursioaskeleet: do m = 1, n do k = 0, m 1 1 α := w b m 1k/ m do j = 0, n m 1 u := Aj + n m+1 k v := αa n m + j + n m+1 k Aj + n m+1 k := u + v A n m + j + n m+1 k := u v end do end do end do Permutointi ja lopetus: do k = 0, 1 ˆf k := A b n k end do Tässä siis A on vektori, johon muunnospisteet tallennetaan. Ylimääräistä työtilaa tarvitaan vain kaksi paikkaa, nimittäin kompleksimuuttujat u ja v. Huomaa myös, että kiertokerrointa α laskettaessa täytyy suorittaa bitinkääntöoperaatio. Olkoon sitten 3.6 voimassa, jolloin siis ˆf k :t ovat oikeassa järjestyksessä. erkitään, kuten edelläkin j = n m i=0 j i i, j i {0, 1}, jolloin j i :t ovat indeksin j bitit. Ehdot 3.7 voidaan kirjoittaa muotoon lm 1, j, k = lm, n m 1 i=0 j i i, k + j n m m 1, missä j = 0, 1,..., n m+1 1 ja k = 0, 1,..., m 1 1. Käytetään tätä rekursiivisesti, jolloin saadaan lm 1, j, k = lm + 1, n m i=0 j i i, k + j n m m 1 + j n m 1 m = = ln, 0, k + j n m m 1 + + j 0 n 1 = ln, 0, k + m 1 n m i=0 j n m i i. 3.9 Siten 3.6 ja 3.9 yhdessä antavat ja erityisesti lm 1, j, k = k + m 1 b n m+1 j, l0, j, 0 = b n j j = 0, 1,..., 1. Siis tällä kertaa lähtöpisteet f j ovat bittikäänteisessä järjestyksessä. Algoritmin vaiheessa tarvitaan nyt indeksejä lm, j, k ja lm, j, m 1 + k, jotka edellä olevan mukaan ovat lm, j, k = k + m b n m j, lm, j, m 1 + k = m 1 + k + m b n m j. Jälleen huomataan, että j voidaan korvata b n m j:llä, joten nopea Fourier-muunnos tulee tässä tapauksessa muotoon: 19
Alustus ja permutointi: do j = 0, 1 A b n j := f j end do Rekursioaskeleet: do m = 1, n do k = 0, m 1 1 α := w k/m do j = 0, n m 1 u := Ak + m j v := αa m 1 + k + m j Ak + m j := u + v A m 1 + k + m j := u v end do end do end do Skaalaus ja lopetus: do k = 0, 1 ˆf k := Ak/ end do Algoritmin tämä muoto on ehkä hieman nopeampi kuin edellinen versio, sillä nyt rekursiosilmukassa ei tarvitse tehdä lainkaan bitinkääntöoperaatioita. 3.6 Konvoluutioiden laskeminen Konvoluutioita voidaan nyt laskea nopeita Fourier-muunnoksia käyttäen lauseen.4 mukaisesti, jolloin siis tehdään kaksi muunnosta ja yksi käänteismuunnos sekä +1 kertolaskua. Laskutoimitusten määrä on siten kertaluokkaa O log. Lisäksi tällöin voidaan tehdä myös joitain yksinkertaistuksia algoritmiin. imittäin nopeassa muunnoksessa joko syöttöpisteet f j tai tulospisteet ˆf k ovat bittikäänteisessä järjestyksessä. Tällöin pisteiden uudelleenjärjestäminen lisää jonkin verran laskutoimitusten määrää. Konvoluutioiden tapauksessa tämä voidaan kuitenkin unohtaa, sillä jos tarvittavat kaksi Fourier-muunnosta antavat tuloksen bittikäänteisessä järjestyksessä, niin käänteismuunnoksen jälkeen pisteet ovat jälleen oikeassa järjestyksessä. 3.7 opeat muunnokset yleisessä tapauksessa Edellä on koko ajan oletettu, että pisteiden lukumäärä on jokin kakkosen potenssi. yt jos onkin alkuluku, niin Cooley Tukey-tyyppisiä algoritmeja ei voida enää soveltaa. Tällöin voidaan kuitenkin käyttää Raderin algoritmia, joka perustuu siihen, että jokainen :n pisteen diskreetti Fourier-muunnos voidaan palauttaa 1:n pisteen diskreetiksi konvoluutioksi. Koska nyt 1 on parillinen, voidaan konvoluution laskemiseen käyttää kaksikantaista nopeaa Fourier-muunnosta ainakin yhden askeleen verran. Tämän jälkeen voidaan tarvittaessa soveltaa samaa menetelmää uudelleen. 0
Yleisessä tapauksessa jaetaan alkutekijöihinsä = 1 m ja jokaiseen i :n i = 1,,..., m pituiseen palaan sovelletaan Rader-tyyppistä algoritmia. Tällaisista algoritmeista käytetään nimitystä alkutekijämuunnokset prime factor FFT. Harjoitustehtäviä 1. Todista lauseet. ja.3.. Osoita, että diskreetillä Fourier-muunnoksella on seuraava siirto-ominaisuus: Olkoon ˆf k pisteistön f j diskreetti Fourier-muunnos. ääritellään g j = f j+l jollain l {0, 1,..., 1}. Silloin ĝ k = w lk ˆfk. 3. Osoita, että kaksikantaisessa Cooley Tukey-algoritmissa triviaalien kertolaskujen siis kun kiertokerroin on joko ±1 tai ±i lukumäärä on 3/. 4. Olkoon k = m 1 i=0 k i i, missä k i {0, 1}, jolloin siis k i :t ovat kokonaisluvun k bitit sen binääriesityksessä. Kirjoita aliohjelma, joka kääntää bitit päinvastaiseen järjestykseen, ts. laskee kuvauksen b m k = m 1 i=0 k m i 1 i arvon. 5. Kirjoita aliohjelma, joka laskee nopean Fourier-muunnoksen edellä esitetyillä algoritmeilla. Lähteet Bagget, L., Fulks, W., Fourier analysis, Anjou Press, 1979. ussbaumer, H. J., Fast Fourier transform and convolution algorithms, Springer- Verlag, 1981. Pickering,., An introduction to fast Fourier transform methods for partial differential equations, with applications, Research Studies Press, 1986. Tolimieri, R., An,., Lu, C., Algorithms for discrete Fourier transform and convolution, Springer-Verlag, 1989. 1