• Nie Znaleziono Wyników

Szybka transformacja Fouriera (FFT – Fast Fourier Transform)

N/A
N/A
Protected

Academic year: 2021

Share "Szybka transformacja Fouriera (FFT – Fast Fourier Transform)"

Copied!
16
0
0

Pełen tekst

(1)

Szybka transformacja Fouriera (FFT – Fast Fourier Transform)

Plan wykładu:

1. Transformacja Fouriera, iloczyn skalarny 2. DFT - dyskretna transformacja Fouriera 3. FFT – szybka transformacja Fouriera

a) algorytm PFA

b) algorytm Cooleya-Tukeya (radix-2) c) wielowymiarowe FFT

4. Przykłady zastosowań: mnożenie wielomianów, odszumianie sygnału, rozwiązanie równania Poissona, całkowanie.

(2)

2 Jeśli funkcja f(x) jest okresowa wówczas

zamiast wielomianów do jej interpolacji (aproksymacji) lepiej użyć wielomianów trygonometrycznych tj. rozwinąć funkcję w szereg Fouriera. Dla funkcji okresowej o okresie 2π:

Funkcję możemy też zapisać w postaci zespolonego szeregu Fouriera

f (x) = a

0

2 +

X

1 k=1

(a

k

cos(kx) + b

k

sin(kx))

a

k

= 1

¼

Z

¼

¡¼

f (t)cos(kt)dt

b

k

= 1

¼

Z

¼

¡¼

f (t)sin(kt)dt

Jeśli funkcja f(x) jest rzeczywista wówczas „zwykły”

szereg Fouriera jest częścią

rzeczywistą zespolonego szeregu Fouriera:

Dla ciągu współczynników

definiujemy

Co prowadzi do zależności pomiędzy szeregiem rzeczywistym i zespolonym

[a

k

]

1k=0

[b

k

]

1k=1

b

0

= 0 a

¡k

= a

k

b

¡k

= ¡b

k

f (x) »

X

1 k=¡1

f (k)e b

Ikx

f (k) = b 1 2¼

Z

¼

¡¼

f (t)e

¡Ikt

dt

f (k) b = 1 2¼

Z

¼

¡¼

f (t)[cos(kt) ¡ Isin(kt)]dt

= 1

2 (a

k

¡ Ib

k

)

k ¸ 0

c

k

= 1

2 (a

k

¡ Ib

k

)

a

0

2 +

X

n k=1

(a

k

cos(kx) + b

k

sin(kx)) =

X

n k=¡n

c

k

e

Ikx

(3)

Funkcje

generują ciąg ortonormalnych funkcji w zespolonej przestrzeni Hilberta.

Iloczyn skalarny w tej przestrzeni:

Dysponując tablicą wartości funkcji f i g w węzłach siatki, iloczyn wewnętrzny

można zapisać w postaci dyskretnej:

hf; gi = 1 2¼

Z

¼

¡¼

f (x)g

¤

(x)dx

Własności iloczynu wewnętrznego/skalarnego:

oraz związek z normą euklidesową

Dla każdego

Dowód

hf; fi

N

¸ 0

hf; gi

N

= hg; fi

¤N

kf k

N

= p

hf; fi

N

hf; gi 1

N

X

¡1 ¤

N ¸ 1

h®f + ¯g; hi

N

= ® hf; hi

N

+ ¯ hg; hi

N

E

k

(x) = e

Ikx

; k = 0; §1; §2; : : :

hE

k

; E

n

i = 1 2¼

Z

¼

¡¼

E

k

(x)E

n¤

(x)dx

= 1

Z

¼

¡¼

e

ikx

e

¡Inx

dx

= 1

Z

¼

¡¼

e

I(k¡n)x

dx

= 1

e

I(k¡n)x

I(k ¡ n)

¯ ¯

¯ ¯

x=¼ x=¡¼

= 0

hE

k

; E

m

i

N

=

½ 1

k¡mN

2 Z Z Z 0

k¡mN

2 Z = Z Z

1 N

N

X

¡1 j=0

E

k

µ 2¼j N

¶ E

m¤

µ 2¼j N

=

= 1 N

N

X

¡1 j=0

h e

2¼I(k¡m)=N

i

j

(4)

4 Dla pozostałych przypadków można się posłużyć

wyrażeniem na sumę szeregu:

co daje

ze względu na postać licznika.

Funkcje Ek(x) tworzą ciąg ortogonalnych (ortonormalnych) jednomianów

eksponencjalnych, z których można utworzyć wielomian:

Wielomian eksponencjalny może posłużyć do interpolacji funkcji f(x).

N

X

¡1 j=0

¸

j

= ¸

N

¡ 1

¸ ¡ 1 ; ¸ 6= 1

Załóżmy, że jej wartości są określone na siatce zbudowanej z równoodległych węzłów:

Wielomian interpolujący ma wówczas postać

Współczynniki znajdziemy licząc iloczyny skalarne (lewa i prawa strona) z kolejnymi jednomianami Em

Ciąg współczynników cm wyznaczanych zgodnie z powyższym wzorem definiuje dyskretną

transformatę Fouriera (DFT – to wynik przekształcenia).

W metodzie najmniejszych kwadratów wielomian ten może posłużyć do

aproksymacji funkcji f(x) gdy stopień wielomianu aproksymującego jest mniejszy od N-1.

f (x) = P (x) =

N

X

¡1 k=0

c

k

E

k

(x) x

j

= 2¼j

N ; j = 0; 1; : : : ; N ¡ 1 e

2¼I(k¡m)=N

= 1 , k ¡ m

N 2 Z Z Z

e

2¼I(k¡m)

¡ 1

e

2¼I(k¡m)=N

¡ 1 = 0

P (x) =

N

X

¡1 k=0

c

k

e

Ikx

=

N

X

¡1 k=0

c

k

(e

Ix

)

k

=

X

n k=0

c

k

E

k

(x)

hf; E

m

i =

N

X

¡1 k=0

c

k

hE

k

; E

m

i =

N

X

¡1 k=0

c

k

±

k;m

= c

m

f (x) = P (x) =

N

X

¡1 k=0

hf; E

k

iE

k

(5)

DFT można zapisać wykorzystując postać macierzową

Transformatę można znaleźć wykonując „tylko” mnożenie wektora przez macierz. Ale w ten sposób należy wykonać O(N2) operacji arytmetycznych.

Jednakże macierz E ma specyficzną postać – jej elementy są ze sobą ściśle powiązane co można wykorzystać w celu

zmniejszenia nakładu obliczeń.

Dzięki FFT liczba wykonywanych operacji może zmaleć do wartości O(Nlog2N).

0 B B B @

E

0

(x

0

) E

0

(x

1

) : : : E

0

(x

N¡1

) E

1

(x

0

) E

1

(x

1

) : : : E

1

(x

N¡1

)

.. . .. . . .. .. .

E

N¡1

(x

0

) E

N¡1

(x

1

) : : : E

N¡1

(x

N¡1

) 1 C C C A

0 B B B @

f (x

0

) f (x

1

)

.. . f (x

N¡1

)

1 C C C A =

0 B B B @

c

0

c

1

.. . c

N¡1

1 C C C A Ef = c

N N

2

N ¢ log

2

(N )

1024 1048576 10240

4096 16777216 49152

16384 268435456 229375

(6)

6 FFT z rozkładem na czynniki pierwsze

(PFA - Prime Factor Algorithm)

Liczbę naturalną możemy zapisać jako

gdzie: ri są liczbami pierwszymi przykład

Idea algorytmu PFA polega na zastąpieniu

obliczeń DFT w jednym wymiarze (skala N2), na obliczeniu iloczynu p transformat DFT

skalujących się jak

Algorytm PFA zmniejsza nakład obliczeń z N2 do N(r1+r2+...+rp)

Zakładamy, że funkcja f(x) jest stablicowana w n węzłach

Funcję rozwijamy w bazie wielomianów eksponencjalnych

N = r

1

r

2

: : : r

p

r

12

; r

22

; : : : ; r

p2

; N = 56 = 2 ¢ 2 ¢ 2 ¢ 7

x

j

= 2¼j

n ; j = 0; 1; : : : ; n ¡ 1

Wykorzystując własności wielomianów, współczynniki rozwinięcia zapisujemy w postaci

Oznaczenia:

Rozkładamy liczbę węzłów na iloczyn liczb pierwszych:

i wprowadzamy kolejne oznaczenia:

n = r

1

r

2

: : : r

p

n

º

= r

º+1

r

º+2

: : : r

p

=

Y

p i=º+1

r

i

º = 0; 1; : : : ; p ¡ 1

n

p

= 1

n = r

1

r

2

: : : r

º

n

º

F (x) =

n

X

¡1 k=0

c

k

e

Ikx

c

k

= 1 n

n

X

¡1 j=0

f (x

j

)e

¡Ikxj

; k = 0; 1; : : : ; n ¡ 1

w = exp ¡

¡

I2¼n

¢ a

j

=

n1

f ¡

2¼j

n

¢

¾

c

k

=

n

X

¡1 j=0

a

j

w

kj

(7)

Zmienną k zapisujemy w postaci:

i podobnie ułamek j/n:

k = ®

1

n

1

+ ®

2

n

2

+ : : : + ®

p

n

p

®

1

2 f0; 1; : : : ; r

1

¡ 1g

®

2

2 f0; 1; : : : ; r

2

¡ 1g .. .

®

p

2 f0; 1; : : : ; r

p

¡ 1g

l

1

2 f0; 1; : : : ; r

1

¡ 1g l

2

2 f0; 1; : : : ; r

2

¡ 1g

.. .

l

p

2 f0; 1; : : : ; r

p

¡ 1g

k

º

=

X

p i=º+1

®

i

n

i

j

º

n

º

=

p¡1

X

i=º

l

i+1

n

i

k

º

< n

º

; º = 0; 1; : : : ; p

j

n = l

1

n

0

+ l

2

n

1

+ : : : l

p

n

p¡1

M 2 Z Z Z k ¢ j

n =

Ã

p

X

i=1

®

i

n

i

! Ã

p¡1

X

º=0

l

º+1

n

º

!

=

p¡1

X

º=0

l

º+1

n

º

Ã

p

X

i=º+1

®

i

n

i

!

+ M

=

p¡1

X

º=0

l

º+1

k

º

n

º

+ M

(8)

8 Wykorzystujemy uzyskany wynik do

obliczenia wkj

Chcemy znaleźć wartość współczynników ck

Wykorzystujemy teraz zależność pomiędzy wskaźnikiem j a l1,l2,...,lp

w sumowaniu. Sumę po j możemy zapisać jako

ponieważ każdą wartość j realizuje odpowiednia kombinacja wskaźników l1,l2,...,lp.

To przejście pozwala zapisać współczynnik ck

jako iloczyn p transformat DFT jednowymiarowych.

j = l

1

+ l

2

r

1

+ : : : + l

p

r

1

r

2

: : : r

p

n¡1

X

j=0

!

r

X

1¡1 l1=0

r

X

2¡1 l2=0

: : :

r

X

p¡1 lp=0

w

kj

= exp µ

¡2¼I kj n

= exp Ã

¡2¼I

Ã

p¡1

X

º=0

l

º+1

k

º

n

º

+ M

!!

=

p

Y

¡1 º=0

exp µ

¡2¼I l

º+1

k

º

n

º

=

p

Y

¡1 º=0

w

kººlº+1

c

k

=

n

X

¡1 j=0

f (x

j

) n exp

µ

¡Ik 2¼j n

=

n

X

¡1 j=0

f (x

j

)

n w

kj

(9)

Startujemy od obliczenia jednowymiarowego DFT dla wartości funkcji w węzłach, których indeksy zależą od aktualnych wartości l1,l2,...,lp

Takich transformat będzie n/rp , a wyznaczenie każdej z nich wiąże się z nakładem obliczeń rzędu (rp)2

następnie obliczamy

Po wyznaczeniu w ten sposób p transformat dostajemy żądany współczynnik ck (procedurę powtarzamy dla każdej wartości k).

c

(1)

(l

1

; l

2

; : : : ; ®

p

) =

r

X

p¡1 lp=0

c

(0)

(l

1

; l

2

; : : : ; l

p

)w

pk¡1p¡1lp

c

(2)

(l

1

; l

2

; : : : ; ®

p¡1

; ®

p

) =

rp¡1

X

¡1 lp¡1=0

c

(1)

(l

1

; l

2

; : : : ; l

p¡1

; ®

p

)w

kp¡2p¡2lp¡1

c

k

= c

(p)

1

; ®

2

; : : : ; ®

p¡1

; ®

p

) =

r

X

1¡1

c

(p¡1)

(l

1

; ®

2

; : : : ; ®

p¡1

; ®

p

)w

0k0l1

c

k

= c(l

1

; l

2

; : : : ; l

p

)

=

r

X

1¡1 l1=0

r

X

2¡1 l2=0

: : :

r

X

p¡1 lp=0

c

(0)

(l

1

; l

2

; : : : ; l

p

)w

0k0l1

w

k11l2

: : : w

kpp¡1¡1lp

c

0

= f (x

j

)

n ; j = l

1

+ l

2

r

1

+ : : : + l

p

r

1

r

2

: : : r

p

(10)

10 Algorytm radix-2

Najprostszy algorytm FFT to radix-2 (Cooley- Tukey) opracowany w latach 60 XX wieku w celu szybkiej analizy danych sejsmologicznych.

Naszym zadaniem jest obliczenie

współczynników transformaty Fouriera (DFT) ck, ale wykonując jak najmniej obliczeń.

Zakładamy że całkowita liczba węzłów jest potęgą 2:

x

j

= 2¼ N j

j = 0; 1; 2; : : : ; N ¡ 1 N = 2

r

; r 2 N N N

Osobno grupujemy składniki a) parzyste

b) nieparzyste

j = 2m j = 2m + 1

c

k

= hE

k

; f i =

N

X

¡1 j=0

f (x

j

)E

k

(x

j

)

=

N

X

¡1 j=0

f (x

j

)exp ( ¡Ix

j

k)

=

N

X

¡1 j=0

f

j

exp µ

¡I 2¼ N jk

c

k

=

N 2 ¡1

X

m=0

f

2m

exp µ

¡I 2¼

N (2m)k

+

N 2 ¡1

X

m=0

f

2m+1

exp µ

¡I 2¼

N (2m + 1)k

c

k

=

N 2 ¡1

X

m=0

f

2m

exp µ

¡I 2¼

N=2 mk

+exp µ

¡I 2¼ N k

N

X

2 ¡1 m=0

f

2m+1

exp µ

¡I 2¼

N=2 mk

(11)

c

k

= p

k

+ '

k

q

k

Korzystamy teraz z okresowości wyrazów pk oraz qk:

Natomiast czynnik fazowy ma następującą własność:

p

k+N=2

= p

k

q

k+N=2

= q

k

Uwagi:

a) współczynniki pk oraz qk można wyliczyć dzięki DFT nakładem O(N/2)2=O(N2/4)

b) dodatkowo oszczędzamy czas wyznaczając tylko współczynniki dla

ponieważ

Kolejnym krokiem w FFT jest podział sum w pk oraz w qk na sumy zawierające tylko elementy parzyste i nieparzyste. Po podziale liczba elementów w każdej z dwóch powstałych sum jest dwukrotnie mniejsza niż w elemencie macierzystym.

Proces rekurencyjnego podziału kończymy gdy liczba elementów jest równa 1.

k < N 2

c

k

= 8 <

:

p

k

+ '

k

q

k

; k <

N2

p

k¡N

2

¡ '

k

q

k¡N

2

; k ¸

N2

p

k

=

N 2 ¡1

X

m=0

f

2m

exp µ

¡I 2¼

N=2 mk

q

k

=

N 2 ¡1

X

m=0

f

2m+1

exp µ

¡I 2¼

N=2 mk

'

k

= exp µ

¡I 2¼ N k

'

k+N=2

= exp µ

¡I 2¼ N

µ

k + N 2

¶¶

= exp µ

¡I 2¼ N k

¶ exp

µ

¡I 2¼ N

N 2

= ¡exp µ

¡I 2¼ k

= ¡'

(12)

12 Inne algorytmy FFT

1) Algorytm Winograda/Radera – DFT jest sformułowane w postaci cyklicznego splotu. Modyfikacja Winograda algorytmu FFT działa gdy N=pm , p -liczba pierwsza.

2) Split-radix – modyfikacja algorytmu Cooleya-Tukeya. W każdym kroku DFT jest wyrażana jako suma DFT dla N/2 oraz dwóch DFT dla N/4. Jest to najszybszy algorytm FFT.

3) DST (discrete sine transform) oraz DCT (discrete cosine transform) – transformaty sinusowa i kosinusowa, opłaca się je stosować gdy transformację przeprowadzamy na funkcjach rzeczywistych. Unikamy w ten sposób operacji na liczbach zespolonych co jest kosztowne.

Wielowymiarowa FFT

Współczynnki wyznacza się stosując algorytm

jednowymiarowego FFT kolejno dla każdego z wymiarów.

N = N

1

N

2

: : : N

d

c

k1;k2;:::;kd

=

N1

X

j1=0 N2

X

j2=0

: : :

Nd

X

jd=0

f

j1;j2;:::;jd

exp µ

¡i2¼

µ j

1

k

1

N

1

+ j

2

k

2

N

2

+ : : : + j

d

k

d

N

d

¶¶

(13)

Zastosowania FFT:

1) interpolacja, aproksymacja 2) szybkie mnożenie

3) cyfrowe przetwarzanie sygnału (np. odszumianie – widmo częstotliwości) 4) kompresja danych

5) analiza sygnałów czasowych (korelacja, splot)

6) rozwiązywanie równań różniczkowych (rów. Poissona)

(14)

14 Szybkie mnożenie wielomianów przy

użyciu FFT

Chcemy obliczyć iloczyn dwóch wielomianów

Jeśli stopnie wielomianów są różne to je

wyrównujemy dodając do wielomianu niższego stopnia współczynniki równe 0.

Iloczyn wielomianów

Dokonujemy reindeksacji wskaźników

P (x) =

n

X

¡1 i=0

a

i

x

i

Q(x) =

n

X

¡1 i=0

b

i

x

i

i + j = k ! j = k ¡ i R(x) = P (x)Q(x) =

n

X

¡1 i=0

a

i

x

i

n

X

¡1 j=0

b

j

x

j

=

n

X

¡1 i;j=0

a

i

b

j

x

i+j

R(x) =

2n

X

¡2 k=0

n

X

¡1 i=0

a

i

b

k¡i

x

k

=

2n

X

¡1 k=0

c

k

x

k

c

k

=

n

X

¡1 i=0

a

i

b

k¡i

Jeśli współczynniki wielomianów ai oraz bi potraktujemy jako współrzędne wektorów

to wektor c jest ich splotem:

Korzystając z definicji tranformacji Fouriera dla splotu funkcji możemy zapisać

a a a = [a

0

; a

1

; : : : ; a

n¡1

] bbb = [b

0

; b

1

; : : : ; b

n¡1

]

ccc = a a a ¤ bbb

ccc = F F T

¡1

h

F F T (~ a ~ a a)F F T (~b~b~b) ~ i

~

a~ a ~ a = [a

0

; a

1

; : : : ; a

n¡1

; a

n

; : : : ; a

2n¡1

]

~b~b~b = [b

0

; b

1

; : : : ; b

n¡1

; b

n

; : : : ; b

2n¡1

] c

2n¡1

= 0

a

i

; b

i

= 0 , i > n ¡ 1

(15)

Filtracja sygnału

FFT

Dyskryminacja szumu

FFT-1

f (x) = cos(x) + cos(2x) + cos(3x)

(16)

16 Rozwiązywanie równania Poissona (2D, 3D)

dokonujemy transformacji (FFT) całego równania (do przestrzeni odwrotnej)

skąd już łatwo wyznaczymy Vk

i gotowe rozwiązanie (w przestrzeni rzeczywistej)

Uwaga: musimy jeszcze uwzględnić warunki brzegowe (WB) .

1) jeśli WB są typu Dirichleta

to wykonujemy DST-FFT dla wnętrza obszaru, a WB uwzględniamy dokonując transformat

potencjału na brzegach – wyniki dodajemy 2) jeśli WB są typu Neumanna

r

2

V

r

= ½

r

k

2

V

k

= ½

k

V

k

= ½

k

k

2

V

r

= F F T

¡1

fV

k

g

V

r

j

brzeg

= V

b

6= 0

@V

r

@~n j

brzeg

= 0

to wówczas stosujemy DCT-FFT dla wnętrza obszaru. WB są automatycznie spełnione.

Całkowanie

Chcemy obliczyć całkę oddziaływania dwóch gęstości ładunku/materii

która zawiera osobliwość. Całkę możemy zapisać nieco inaczej

Potencjał V(r1) jest splotem dwóch funkcji:

gęstości i funkcji f. Można więc wykorzystać tu twierdzenie o splocie i jego transformacie:

Transformata odwrotna ostatniego iloczynu daje poszukiwany potencjał.

F F T fV g = F F T f½

2

¤ fg

= F F T f½

2

g ¢ F F T f½

2

g j~r

1

¡ ~r

2

j

¡1

= f (~r

1

¡ ~r

2

) = f (~r

2

¡ ~r

1

)

C = Z

b

a

d~r

1

Z

b

a

d~r

2

½

1

(~r

1

2

(~r

2

) j~r

1

¡ ~r

2

j

C = Z

b

a

d~r

1

½

1

(~r

1

)V (~r

1

) V (~r

1

) =

Z

b a

d~r

2

½

2

(~r

2

)f (~r

1

¡ ~r

2

)

Cytaty

Powiązane dokumenty

Jeśli funkcja f(x) jest rzeczywista wówczas „zwykły” szereg Fouriera jest częścią rzeczywistą zespolonego szeregu Fouriera:.. Dla

Udowodnij, »e dla ka»dej liczby naturalnej n oraz liczby rzeczywistej x ∈ (−1, +∞) jest speª-.

Zapoznać się z następującymi poleceniami w środowisku Matlab: linspace, sin, figure, plot, stem, hold on, hold off, xlabel, ylabel, legend, zeros, length, find, for, end, fft,

np.sin, np.pi, plt.figure, plt.plot, plt.stem, plt.grid, plt.xlabel, plt.ylabel, plt.legend, np.exp, np.zeros, np.where, np.fft.fft, np.abs, np.random.rand. Jeśli jest to możliwe,

6.. Znaleźć odpowiedź impulsową tego filtra.!. 7.. a) Znaleźć widmo odpowiedzi

Przedmiotem zadania jest dyskretna transformacja Fouriera (DFT, ang. Discrete Fourier Transform) obliczana na dwa sposoby: sposobem bezpośrednim (według definicji) oraz sposobem

Moreover, due to the inaccurate model order estimation and not always clear distinction between the noise-only and signal subspace, the noise power spectral estimate may be

The obtained distortion for these partly deterministic noise types is decreased by combining the proposed noise tracker with (8.15). Notice that the experimental results in