brza fourierova transformacija

8
Brza Fourier-ova transformacija Fourier-ova transformacija funkcije f(t) je funkcija od K: ( ) () iKt FK fte dt +∞ −∞ = Inverznom Fourier-ovom transformacijom se funkcija F(K) transformiše nazad u funkciju f(t): 1 () ( ) 2 iKt f t FKe dK π +∞ −∞ = Diskretna Fourier-ova transformacija Diskretna Fourier-ova transformacija je algoritam kojim se n- dimenzioni vektor c=(c 0 , ..., c n-1 ) T koeficijenata parcijalne sume Fourier-ovog reda () ikx k k f x ce +∞ =−∞ = određuje tako da je u ekvidistantnim tačkama 2 , 0,..., 1 j j n n π = intervala [0, 2 ] π ova parcijalna suma jednaka vrednostima funkcije f u tim tačkama: 2 1 0 ( ) , 0,..., 1 j n ik n j k k f x ce j n π = = = (*) Ako označimo sa f j =f(x j ), vektor f=(f 0 ,...,f n-1 ) T i 2 2 i n i n W e e π π = = gornji sistem linearnih jednačina (*) može da se napiše u obliku: 1 0 , 0,..., 1 n kj k j k cW f j n = = = ili, u vektorskom obliku, * Fc f =

Upload: kopljanik

Post on 22-Oct-2015

12 views

Category:

Documents


0 download

DESCRIPTION

Brza Fourierova transformacija

TRANSCRIPT

Page 1: Brza Fourierova transformacija

Brza Fourier-ova transformacija

Fourier-ova transformacija funkcije f(t) je funkcija od K:

( ) ( ) iKtF K f t e dt+∞

−∞= ∫

Inverznom Fourier-ovom transformacijom se funkcija F(K)

transformiše nazad u funkciju f(t):

1( ) ( )

2iKtf t F K e dK

π+∞ −

−∞= ∫

Diskretna Fourier-ova transformacija

Diskretna Fourier-ova transformacija je algoritam kojim se n-

dimenzioni vektor c=(c0, ..., cn-1)T koeficijenata parcijalne sume

Fourier-ovog reda ( ) ikxk

kf x c e

+∞−

=−∞

= ∑ određuje tako da je u

ekvidistantnim tačkama 2 , 0,..., 1j j nnπ

= − intervala [0,2 ]π ova

parcijalna suma jednaka vrednostima funkcije f u tim tačkama:

21

0( ) , 0,..., 1

jn ikn

j kk

f x c e j nπ− −

=

= = −∑ (*)

Ako označimo sa fj=f(xj), vektor f=(f0,...,fn-1)T i

22i n inW e e

ππ= =

gornji sistem linearnih jednačina (*) može da se napiše u obliku:

1

0, 0,..., 1

n kjkj

kc W f j n

=

= = −∑

ili, u vektorskom obliku,

*F c f=

Page 2: Brza Fourierova transformacija

Matrica sistema je konjugovana matrica Fourier-ove matrice:

2

2 1

2 4 2( 1)

1 2( 1) ( 1)

1 1 1 111

1

n

n

n n n

W W WW W WF

W W W

− − −

=

Sistem se može direktno rešiti jer je * *FF F F nI= = , gde je I jedinična

matrica.

Iz ove relacije sledi da je inverzna matrica matrice sistema:

* 1 1( )F F

n− =

te je rešenje ovoga sistema, tj. diskretna Fourier-ova

transformacija vektora f=(f0,...,fn-1)T, vektor c sa koordinatama:

21 1

0 0

1 1 , 0,..., 1jkn n ijk n

k j jj j

c f W f e k nn n

π− −

= =

= = = −∑ ∑

Brza Fourier-ova transformacija (FFT)

Da bi se po prethodnoj formuli izračunali koeficijenti ck, potrebno je

izvršiti n2 množenja u opštem slučaju kompleksnih brojeva fjWjk,

j,k=0,…,n-1 i još izvestan broj operacija radi nalaženja stepena broja

W. U slučaju korišćenja algoritma FFT broj operacija je O(nlog2n) FFT se zasniva na poznatoj lemi Danielsona i Lanczosa (1942),

kojom je pokazano da se diskretna Fourier-ova transformacija reda

n može predstaviti sumom dve diskretne Fourier-ove

transformacije reda n/2.

Naime, ako je n=2m, imamo da je

22 2 22 / 2

i i in n m

n mW e e e Wπ π π

≡ = = ≡

što

omogućava da se n-dimenzioni vektor y=Fnx (Fn je Fourier-ova

matrica dimenzije n) generiše pomoću dva m-dimenziona vektora ye i

yo,

e e

my F x= , o o

my F x=

Page 3: Brza Fourierova transformacija

gde je x=(x0,x1,...,xn-1)T,xe=(x0,x2,...,xn-2)T i xo=(x1,x3,...,xn-1)T.

j-ta komponenta vektora y je

, 0,..., 1e j oj j n jy y W y j m= + = −

Dakle, prvih m komponenti vektora y se računa iz prethodne veze.

Preostalih m komponenti , 0,..., 1m jy j m+ = − ćemo dobiti sa:

, 0,..., 1e j om j j n jy y W y j m+ = − = −

Vektor y treba još pomnožiti sa 1n

da bi predstavljao diskretnu

Fourier-ovu transformaciju vektora x.

Ponavljajući ovu ideju, izražavamo Fourier-ove transformacije reda m

pomoću transformacija reda m/2, itd. U slučaju da je n=2l, gde je l

prirodan broj, opisanim algoritmom dolazimo do transformacija reda

m=1. U tom slučaju je FFT najefikasnija – polazeći od samih

komponenti vektora x, koje su identične Fourier-ovim

transformacijama reda 1, gornjim vezama dobijamo transformacije

reda 2, 4, 8, ..., n. (Broj računskih operacija koje je potrebno izvršiti

da bi se algoritam realizovao je u ovom slučaju 21 1log2 2n n nl= . Većina

algoritama kojima se praktično realizuje FFT nema nikakvog efekta

ako je n prost broj.

Page 4: Brza Fourierova transformacija

Kada dođe do implementacije ovog algoritma, može se početi od

vrha i onda pisati rekurzivna procedura ,ili krenuti od dna i najpre

izračunati n/2 transformacija u kojima učestvuju 2 tačke, zatim n/4

transformacije u kojima učestvuju po 4 tačke, n/8 transformacija u

kojima učestvuje po 8 tačaka itd.

Posmatrajmo primer sa 8 tačaka:

Označimo sa:

88

4 28

38

1 0 0 00 0 00 0 00 0 0

wD

ww

=

Važi:

48[1:2:8]8 4

[1:8] 48[2:2:8]4

( )1( )

( )1F fD

F fF fD

= −

i

24[1:4:8]4 2

[1:2:8] 24[3:4:8]2

( )1( )

( )1F fD

F fF fD

= −

i

24[2:4:8]4 2

[2:2:8] 24[4:4:8]2

( )1( )

( )1F fD

F fF fD

= −

i

122 11

[1:4:8] 1251

( )1( )

( )1F fD

F fF fD

=

− i

122 31

[3:4:8] 1271

( )1( )

( )1F fD

F fF fD

=

− i

122 21

[2:4:8] 1261

( )1( )

( )1F fD

F fF fD

=

− i

122 41

[4:4:8] 1281

( )1( )

( )1F fD

F fF fD

=

− i

1 ( )k kF f f=

Page 5: Brza Fourierova transformacija

Rekurzivna implementacija Brze Fourier-ove transformacije

48

[1:2:8]8 4[1:8] 48

[2:2:8]4

( )1( )

( )1F fD

F fF fD

= −

i

Pretpostavimo da su naši ulazni podaci sačuvani u vektoru x dužine

8 i da imamo funkciju my_fft() koja može da izračuna diskretnu

Fourier-ovu transformaciju proizvoljnog ekvidistantnog podskupa od

x, npr. x(1:2:8)

Dakle, 4

[1:2:8]( ) _ ( (1: 2 : 8))F f my fft x= i 4

[2:2:8]( ) _ ( (2 : 2 : 8))F f my fft x=

Ono što funkcija vraća u ovom slučaju je niz od 4 kompleksna broja

koji predstavlja diskretnu Fourier-ovu transformaciju za 4 tačke.

Da bi se dobila transformacija za 8 tačaka: 8 2 3

(1:4) 8 8 8

8 2 3(5:8) 8 8 8

_ ( (1: 2 : 8)) [1, , , ]* _ ( (2 : 2 : 8))

_ ( (1: 2 : 8)) [1, , , ]* _ ( (2 : 2 : 8))

F my fft x w w w my fft x

F my fft x w w w my fft x

= +

= −

Sva lepota rekurzivnih algoritama je što je ovo jedino što treba

uraditi. Plus uslovi za izlazak iz rekurzije (vektor x dimenzije 1 –

transformacija je takođe x). (i još se u svakom koraku rekurzije deli

sa 2 da bi se na kraju dobilo 1/n)

To je verovatno najjednostavnija implementacija za FFT, ali ima dva

nedostatka. Jedan je što se računa veći broj knw izraza nego što je

potrebno: neki se reizračunavaju prilikom rekurzivnih poziva. To se

može relativno lako rešiti tako što se predizračunaju neophodni

stepeni i zatim samo čitaju njihove vrednosti. Drugi nedostatak je

sama rekurzija (zahteva više resursa i izvršava se sporije nego

iterativna varijanta)

Page 6: Brza Fourierova transformacija

Danielson Lanczos Algoritam (iterativna varijanta)

kreće se odozdo naviše

obrtanje bitova brojeva 0 do n-1 automatski generiše parove koji

učestvuju u dobijanju transformacija dimenzije 2:

0 -> 000 -> 000 -> 0

1 -> 001 -> 100 -> 4

2 -> 010 -> 010 -> 2

3 -> 011 -> 110 -> 6

4 -> 100 -> 001 -> 1

5 -> 101 -> 101 -> 5

6 -> 110 -> 011 -> 3

7 -> 111 -> 111 -> 7

(Npr. kada relaciju / 2 / 2n n e k n o

k k n kF F w F= + i primenimo rekurzivno na / 2n e

kF i

/ 2n okF , smanjujemo problem na računanje

/ 4n eekF ,

/ 4n eokF ,

/ 4n oekF i

/ 4n ookF .

Itd. rekurzivno... Na kraju ovog procesa dobija se / ...n n oooee eo

k mF f= , gde se

m računa na sledeći način: obrne se niz e-ova i o-ova, svako e zameni

sa 0 a svako o sa 1 i dobijeni niz 0-a i 1-ica interpretira kao binarna

reprezentacija broja m

Konkretno: 8 4 5 4

5 5 8 5

2 5 2 5 2 5 25 4 5 8 5 4 5

1 5 1 5 1 5 15 2 5 4 5 2 5

5 1 5 1 5 1 5 18 5 2 5 4 5 2 5

5 5 52 4 2

58

*

( * ) * ( * )

(( * ) * ( * ))

* (( * ) * ( * ))

(( * ) * ( * ))

* ((

e o

ee eo oe oo

eee eeo eoe eoo

oee oeo ooe ooo

eee eeo eoe eoo

o

F F w FF w F w F w FF w F w F w F

w F w F w F w Ff w f w f w f

w f

= +

= + + +

= + + +

+ + + +

= + + +

+ 5 5 52 4 2

5 5 5000 2 100 4 010 2 110

5 5 5 58 001 2 101 4 011 2 111

5 5 50 2 4 4 2 2 6

5 5 5 58 1 2 5 4 3 2 7

* ) * ( * ))

(( * ) * ( * ))

* (( * ) * ( * ))

(( * ) * ( * ))

* (( * ) * ( * ))

ee oeo ooe ooow f w f w ff w f w f w f

w f w f w f w ff w f w f w f

w f w f w f w f

+ + +

= + + +

+ + + +

= + + +

+ + + +

)

(Ubaciti štampanje vrednosti lo, hi,... da bi se lakše razumelo kako

funkcioniše implementacija)

Page 7: Brza Fourierova transformacija

FFT, MATLAB

Diskretna Fourier-ova transformacija:

direktna: f=ifft(c)

inverzna: c=fft(f)

Diskretna konvolucija: c=conv(a, b)

Bitno je napomenuti da je ovde korišćena tzv. inženjerska

nomenklatura u kojoj se pod direktnom transformacijom

podrazumeva ono što smo je kod nas uvedeno kao inverzna i obrnuto.

t – vektor ekvidistantnih trenutaka u kojima se vrši sempliranje

zvuka

zvuk je predstavljen sinusoidnim talasom:

x = Ampl * sin(2*pi*Freq*t)

(Ampl – amplituda zvuka

Freq – frekvencija zvuka)

prelazak u frekvencijski domen:

X=fft(x)

Čišćenje signala od šuma:

% prvi korak – generisanje šumovitog signala

% 128 semplova pri frekvenciji od 1Hz

t = 1:128;

% frekvencija signala

f = 0.125;

x=sin(2*pi*f*t) + ... % signal

0.75 * randn(size(t)); % sum

Sa dobijene slike u vremenskom domenu nije moguće očitati

frekvenciju signala. Prelaskom u frekvencijski domen dobija se jasnija

slika. Sa dobijenog energijskog spektra moguće je očitati frekvenciju

od 0.125Hz

% Prelazak u frekvencijski domen

X = fft(x);

Page 8: Brza Fourierova transformacija

% Raspon frekvencija

Freq = 1/128*(0:64);

% Energija

Power = abs(X);

% Nalazimo frekvenciju sa najvećom snagom

[MaxPower, MaxIndex]=max(Power);

Freq(MaxIndex)

Filtriranje:

I način:

(ručno uklanjanje svih elemenata vektora Fourier-ovih koeficijenata

koji imaju manju snagu od određenog praga. Pošto se signal sastoji

samo od jedne frekvencije, anuliraćemo sve one Fourier-ove

koeficijente čija je snaga manja od maksimalne snage koja se javlja u

Fourier-ovom spektru.)

X1=fft(x);

X1(abs(X1)<max(abs(X1)))=0;

x1=real(ifft(X1));

II način:

Korišćenjem jednostavnog nisko-frekvencijskog filtra suzbićemo sve

visoke frekvencije u signalu. Jedan primer takvog filtra je lokalno

usrednjavanje signala definisano u vremenskom domenu sa:

( ) 0.25( ( ) ( 1) ( 2) ( 3))y t x t x t x t x t= + − + − + −

Ovaj filtar se najefikasnije primenjuje ukoliko se posmatra kao

diskretna konvolucija vektora x i vektora [0.25 0.25 0.25 0.25]

koja se dalje izvodi na standardni način (prelaskom u frekvencijski

domen). Primena ovog filtra eliminiše komponente signala visoke

frekvencije, dok zadržava niskofrekventne komponente:

x2=conv(x, [0.25 0.25 0.25 0.25]);

X2=fft(x2);