Брза Фуријеова трансформација

Из Википедије, слободне енциклопедије

Брза Фуријеова трансформација (енгл. Fast Fourier transformation; често се означава као FFT) је алгоритам за „брзо“ израчунавање вредности дискретне Фуријеове трансформације. Убрзање у односу на уобичајен поступак израчунавања дискретне Фуријеове трансформације постиже се избегавањем поновног израчунавања израза који се међусобно негирају. Алгоритам се приписује Џејмсу В. Кулију (James W. Cooley) и Џону В. Тукију (John W. Tukey) који су га објавили 1965. године. Међутим, Карл Фридрих Гаус га је развио већ 1805. да би израчунао путању астероида Палас и Јуно. Притом су многе верзије развијене и пре Кулијеве и Тукијеве варијанте. После су се појавила многа побољшања и варијације.

За брзу Фуријеову трансформацију постоји и алгоритам у супротном смеру - инверзна брза Фуријеова трансформација.

Неформалан опис Кули-Туки алгоритма[уреди]

Кули-Туки алгоритам се базира на идеји подели-па-владај (divide-and-conquer, енг.). Предуслов за његово извршавање је да број тачака (тачке измерене за неки сигнал, на пример) на којима се врши трансформација буде степен двојке. Како често можемо сами да изаберемо колико тачака хоћемо да узмемо, ово и не представља велику препреку.

ДФТ израчунавамо тако што наше тачке (вектор) прво поделимо на два вектора, један који одговара компонентама изворног вектора са парним индексима, а други са непарним. Онда израчунамо ДФТ оба вектора и спојимо резултате. Притом користимо особине јединичног корена Фуријеове матрице. После понављамо рекурзивно поступак. Тиме можемо да ДФТ на крају израчунамо према сложености O(n\log(n) ) у времену.

Формалан опис Кули-Туки алгоритма[уреди]

Присетимо се дефиниције дискретне Фуријеове трансформације:

\hat c_k = \sum_{j=0}^{N-1} e^{-2\pi \mathrm{i}\cdot\frac{jk}{N}}\cdot c_j за k=0,\dots,N-1

где је c = (c_0, \dots, c_{N-1}) вектор који желимо да трансформишемо, а \hat c тај вектор Фурије трансформисан.

Дефинишимо N' = N'' = \frac{N}{2}.

Потом дефинишемо вектор са парним индексима:

c'_0 = c_0, c'_1 = c_2, \dots, c'_{N'-1} = c_{N-2}

и означимо његову ДФТ као:

\hat c'_0, \hat c'_1, \dots,\hat c'_{N'-1}

те вектор са непарним индексима:

c''_0 = c_1, c''_2 = c_3, \dots, c''_{N''-1} = c_{N-1}

и његову ДФТ:

\hat c''_0, \hat c''_1, \dots, \hat c''_{N''-1}

Следи спајање:



\begin{matrix}
\hat c_k & = & \sum_{j=0}^{N-1} e^{-2\pi \mathrm{i}\cdot\frac{jk}{N}}\cdot c_j \qquad \ \ \qquad \ \ \ \ \qquad \ \ \ \ \qquad \ \ \ \ \qquad \ \ \ \\ \\

& = & \sum_{j=0}^{N-1} e^{ - 2 \pi \mathrm{i} \frac{(2j)k}{N} } \cdot c_{2j} + 
\sum_{j=0}^{\frac{N}{2}-1} e^{ - 2 \pi \mathrm{i} \frac{(2j+1)k}{N} } \cdot c_{2j+1} \\ \\

& = & \sum_{j=0}^{N'-1} e^{ -2\pi \mathrm{i}\cdot\frac{jk}{N'}}\cdot c'_j + \sum_{j=0}^{N''-1} e^{ -2\pi \mathrm{i}\cdot\frac{jk}{N''}}\cdot c''_j \\ \\

& = & \begin{cases} 

\hat c'_k + e ^ {-2\pi \mathrm{i} \frac{k}{N} }\cdot \hat c''_k & \mbox{kada }k < n' \\
\hat c'_{k-N'} - e ^ { -2\pi \mathrm{i} \frac{k-N''}{N} } \cdot \hat c''_{k-N''} & \mbox{kada }k \ge n'
\end{cases}

\end{matrix}

Напомена: N' = N'' = \frac{N}{2}, али се ради лакшег разумевања наводи различито!

Често смо у пракси заинтересовани за конкретне фреквенције. Уводимо нотацију:

\omega_n:=2\pi\frac{n}{NT}, n=1-K,..., N-K, K је негде у близини \frac{N}{2}, а T периода нашег мерења.

Онда је брза фуријеова трансформација за одређену фреквенцију:

\hat c(\omega_k) = \begin{cases} 
\hat c'(\omega_k) + e ^ {-\mathrm{i} \omega_k T }\cdot \hat c''(\omega_k) & \mbox{kada } k < 0 \\
\hat c'(\omega_{-k}) - e ^ { -\mathrm{i} \omega_k (1 - \frac{NT}{2} ) } \cdot \hat c''(\omega_{-k}) & \mbox{kada }k \ge 0
\end{cases}

Литература[уреди]