Швидке перетворення Фур'є

Матеріал з testwiki
Версія від 06:26, 7 серпня 2023, створена imported>Olvin
(різн.) ← Попередня версія | Поточна версія (різн.) | Новіша версія → (різн.)
Перейти до навігації Перейти до пошуку

Швидке́ перетво́рення Фур'є́ (часто FFT від Шаблон:Lang-en) — швидкий алгоритм обчислення дискретного перетворення Фур'є. Якщо для прямого обчислення дискретного перетворення Фур'є з N точок даних потрібно O(N 2) арифметичних операцій, то FFT дозволяє обчислити такий же результат використовуючи O(N log N) операцій. Алгоритм FFT часто використовується для цифрової обробки сигналів для перетворення дискретних даних з часового у частотний діапазон.

Основний алгоритм

Покажемо як виконати дискретне перетворення Фур'є за O(N(p1++pn)) обчислень при N=p1p2pn. Зокрема, при N=2n знадобиться O(Nlog(N)) обчислень.

Дискретне перетворення Фур'є перетворює набір чисел a0,,an1 в набір чисел b0,,bn1, такий, що bi=j=0n1ajεij, де εn=1 і εk1 при 0<k<n. Алгоритм швидкого перетворення Фур'є може бути застосований до будь-яких комутативних асоціативних кілець з одиницею. Найчастіше цей алгоритм застосовують до поля комплексних чиселε=e2πi/n) і до кілець залишків за модулем n.

Основний крок алгоритму полягає у зведенні задачі для N чисел до задачі для p=N/q чисел, де q — дільник N. Нехай ми вже вміємо вирішувати задачу для N/q чисел. Застосуємо перетворення Фур'є до наборів ai,aq+i,,aq(p1)+i для i=0,1,,q1. Тепер покажемо, як за O(Np) обчислень розв'язати вихідну задачу. Зауважимо, що bi=j=0q1εij(k=0p1akq+jεkiq). Вирази в дужках нам уже відомі — це i(modp)-те число після перетворення Фур'є j-тої групи. Таким чином, для обчислення кожного bi потрібно O(q) обчислень, а для обчислення всіх bi — O(Nq) обчислень.

Обернене перетворення Фур'є

Для оберненого перетворення Фур'є можна застосовувати алгоритм прямого перетворення Фур'є — потрібно лише використовувати ε1 замість ε (або застосувати операцію комплексного спряження спочатку до вхідних даних, а потім до результату, отриманого після прямого перетворення Фур'є) і остаточний результат поділити на N.

Загальний випадок

Загальний випадок можна звести до попереднього. Нехай 4N>2k2N. Зауважимо, що bi=εi2/2j=0N1ε(i+j)2/2εj2/2aj. Позначимо a¯i=εi2/2ai,b¯i=εi2/2bi,ci=ε(2N2i)2/2. Тоді b¯i=j=02N2ia¯jc2N2ij, якщо покласти a¯i=0 при iN.

Таким чином, задачу зведено до обчислення згортки, але це можна зробити за допомогою трьох перетворень Фур'є для 2k елементів. Спочатку виконаємо пряме перетворення Фур'є для {a¯i}i=0i=2k1 і {ci}i=0i=2k1, далі перемножимо поелементно результати і виконаємо обернене перетворення Фур'є.

Обчислення всіх a¯i i ci потребує O(N) операцій, три перетворення Фур'є виконується за O(Nlog(N)) операцій, перемноження результатів перетворень Фур'є вимагає O(N) операцій; знаючи значення згортки обчислення всіх bi вимагає O(N) операцій. Усього для дискретного перетворення Фур'є потрібно O(Nlog(N)) дій для будь-якого N.

Цей алгоритм швидкого перетворення Фур'є може працювати над кільцем тільки коли відомі первісні корені з одиниці ступенів 2N і 2k.

Висновок перетворення з ДПФ

Дискретне перетворення Фур'є для вектора x, Що складається з N елементів, має вигляд:

X=A^x

елементи матриці A^ мають вигляд: aNmn=exp(2πimnN).

Нехай N парне, тоді ДПФ можна переписати таким чином:

Xm=n=0N1xnaNmn=n=0N/21x2naN2nm+n=0N/21x2n+1aN(2n+1)m

Коефіцієнти aN2nm і aN(2n+1)m можна переписати наступним чином (M=N/2):

aN2nm=exp(2πi2mnN)=exp(2πimnN/2)=aMnm
aN(2n+1)m=exp(2πimN)aMnm

У результаті отримаємо:

Xm=n=0M1x2naMnm+exp(2πimN)n=0M1x2n+1aMnm

Тобто дискретне перетворення Фур'є від вектора, що складається з N відліків, звелося до лінійної композиції двох ДПФ від N2 відліків, і якщо для початкової задачі потрібно N2 операцій, то для отриманої композиції — N22. Якщо M є степенем двійки, то цей поділ можна продовжувати рекурсивно доти, поки не дійдемо до двоточкового перетворення Фур'є, яке обчислюється за такими формулами:

{X0=x0+x1X1=x0x1

Алгоритм Кулі-Тьюкі

Шаблон:Детальніше Найбільш розповсюдженим алгоритмом розрахунку FFT є алгоритм Кулі — Тьюкі, запропонований Джеймсом Кулі та Джоном Тьюкі в 1965 році[1]. Як з'ясувалося згодом, цей алгоритм був винайдений Карлом Гаусом ще в 1805 році.

Алгоритм заснований на рекурсивному розділенні перетворення на кожному кроці на дві частини розміром N/2. Якщо N не ділиться на два, то робиться факторизація. Для розрахунку застосовують корені з одиниці.

Дискретне перетворення Фур'є величини 2n визначається як:

fm=k=02n1xke2πi2nmkm=0,,2n1.

Якщо позначити вклади парних індексів як

x'0 = x1, x'1 = x2, …, x'n-1 = x2n-2

та їхні перетворення величини n як

f'0, …, f'n-1;

та вклади непарних індексів

x"0 = x1, x"1 = x3, …, x"n-1 = x2n-1

та їхні перетворення величини n як

f"0, …, f"n-1.

тоді:

fm=k=0n1x2ke2πi2nm(2k)+k=0n1x2k+1e2πi2nm(2k+1)=k=0n1x'ke2πinmk+eπinmk=0n1x'ke2πinmk={f'm+eπinmf'mm<nf'mneπin(mn)f'mnmn

Інші алгоритми ШПФ

Крім алгоритму Кулі—Тьюкі існують також інші. Для N=N1×N2 зі взаємно простими N1 і N2, можна застосувати алгоритм Гуда—Томаса розкладу на прості дільники (Prime-Factor Algorithm), заснований на китайській теоремі про залишки, щоб факторизувати ДПФ аналогічно Кулі—Тьюкі, але без коефіцієнтів повороту.

Див. також

Джерела

Шаблон:Reflist

Посилання

  1. Помилка цитування: Неправильний виклик тегу <ref>: для виносок під назвою Cooley_Tukey не вказано текст