brza fourierova transformacija
DESCRIPTION
Brza Fourierova transformacijaTRANSCRIPT
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=
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=
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.
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=
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)
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)
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);
% 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);