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

Материал из testwiki
Перейти к навигации Перейти к поиску

Алгоритм Ку́ли — Тью́ки — наиболее часто используемый алгоритм вычисления быстрого преобразования Фурье. Алгоритм позволяет выразить дискретное преобразование Фурье длины, равной произвольному составному числу N, через определённое количество преобразований меньшей длины с помощью рекурсии, понижая таким образом сложность вычислений до O(Nlog⁡N) для гладких N. Назван в честь Шаблон:Нп3 и Дж. Тьюки.

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

Схема общего алгоритма Кули — Тьюки

Для произвольного натурального числа N дискретным преобразованием Фурье комплексного вектора x(j), где j=0,…,N−1, называется комплексный вектор X(k), где k=0,…,N−1, компоненты которого задаются формулой

X(k)=∑j=0N−1x(j)ωkj,k=0,…,N−1,

где ω=e−2πiN.

Для построения алгоритма делается предположение, что N=N1N2 для некоторых натуральных N1 и N2 и производится следующая замена индексовШаблон:Sfn:

j=j1+N1j2, j1=0,…,N1−1, j2=0,…,N2−1,k=k2+N2k1, k1=0,…,N1−1, k2=0,…,N2−1,

в результате которой получается

X(k2+N2k1)=∑j1=0N1−1∑j2=0N2−1x(j1+N1j2)ω(j1+N1j2)(k2+N2k1).

Далее векторы входных и выходных данных преобразуются в двумерные массивы x′ и X′, задающиеся равенствами

x′(j1,j2)=x(j1+N1j2), j1=0,…,N1−1, j2=0,…,N2−1,X′(k1,k2)=X(k2+N2k1), k1=0,…,N1−1, k2=0,…,N2−1.

Стоит заметить, что компоненты X упорядочены не так, как компоненты x.

Далее пусть ωN1=γ и ωN2=β. Очевидно, что ωN1N2j2k1=1. Тогда в терминах двумерных переменных формула преобразуется к видуШаблон:Sfn

X′(k1,k2)=∑j1=0N1−1βj1k1(ωj1k2∑j2=0N2−1x′(j1,j2)γj2k2).

Таким образом, вычисление преобразования длины N=N1N2 сводится к выполнению следующих действий:

  1. Вычисление N1 преобразований длины N2.
  2. Умножение на комплексные «поворачивающие» множители.
  3. Вычисление N2 преобразований длины N1.

При этом вместо N2 комплексных сложений и N2 комплексных умножений исходной формулы итоговая схема содержит не более N(N1+N2−2) комплексных сложений и N(N1+N2+1) комплексных умноженийШаблон:Sfn.

Каждое из преобразований длины N1 или N2 можно вычислять с помощью различных быстрых алгоритмов, в частности, снова по вышеприведённой схеме. В этом случае преобразование длины N=∏i=1nNi может быть представлено в форме, требующей выполнения N∑i=1nNi комплексных умноженийШаблон:Sfn.

Алгоритм по основанию два

Во многих приложениях длина преобразования равна степени двойки: N=2m. Тогда в вышеприведённой схеме возможны варианты N1=2 или N2=2. В этом случае говорят об алгоритме Кули — Тьюки по основанию дваШаблон:Sfn (Шаблон:Lang-en).

Если N1=2, то говорят об алгоритме Кули — Тьюки с прореживанием по времениШаблон:Sfn. В этом случае уравнения преобразуются к виду

X(k)=∑j=0N/2−1x(2j)ω2kj+ωk∑j=0N/2−1x(2j+1)ω2kjX(k+N/2)=∑j=0N/2−1x(2j)ω2kj−ωk∑j=0N/2−1x(2j+1)ω2kj, k=0,…,N/2−1.
Схема реализации операции «бабочки»

Если ввести обозначения E(k)=∑j=0N/2−1x(2j)ω2kj и O(k)=∑j=0N/2−1x(2j+1)ω2kj, то уравнения можно переписать как

X(k)=E(k)+ωkO(k)X(k+N/2)=E(k)−ωkO(k), k=0,…,N/2−1.

Такая операция обычно называется «бабочкой».

Данная процедура может быть применена к входному вектору рекурсивно. На каждом шаге N-точечное преобразование разбивается на два (N/2)-точечных преобразования, которые, в свою очередь, разбиваются таким же образом до тех пор, пока длина преобразования не станет равна единице. Затем происходит обратный ход, на каждом шаге длины результатов преобразований удваиваются с помощью «бабочек». При такой реализации выполняется (N/2)log2N комплексных умножений и Nlog2N комплексных сложений.

Этот процесс является примером применения методики «разделяй и властвуй». При этом во многих реализациях прямой рекурсии избегают и вместо неё дерево вычислений проходится в порядке поиска в ширину.

Если N2=2, то говорят об алгоритме Кули — Тьюки с прореживанием по частотеШаблон:Sfn. В этом случае уравнения преобразуются к виду

X(2k)=∑j=0N/2−1(x(j)+x(j+N/2))ω2kj,X(2k+1)=∑j=0N/2−1(x(j)−x(j+N/2))ωj(2k+1), k=0,…,N/2−1.

Алгоритм Рейдера — Бреннера

Пусть

a(k)={0,k=0,x(k)−x(k+N/2)2isin⁡(2πk/N),k=1,…,N/2−1

и пусть

A(k)=∑j=0N/2−1a(j)ω2kj, k=0,…,N/2−1.

С использованием формул алгоритма с прореживанием по частоте нетрудно убедиться, что выполняется следующее соотношение:

X(2k+1)=A(k)−A(k+1)+(x(0)−x(N/2)), k=0,…,N/2−1.

Такая модификация алгоритма по основанию два называется алгоритмом Рейдера — Бреннера. Она позволяет уменьшить вычислительную сложность за счёт более простых умножений на чисто мнимые константы 1/(2isin⁡(2πk/N))Шаблон:Sfn. Аналогичные формулы можно получить с использованием вещественных констант 1/(2cos⁡(2πk/N))Шаблон:Sfn.

История

Алгоритм и его рекурсивная реализация были изобретены около 1805 года К. Гауссом при интерполировании траекторий астероидов Паллада и Юнона[1]. Тогда открытие не получило широкого распространения и было опубликовано лишь после смерти учёного на новой латыни. Результат Гаусса несколько раз переоткрывался в различных формах в течение последующих 150 лет и стал популярным после публикации в 1965 году статьи Шаблон:Нп3 из IBM и Дж. Тьюки из Принстона, в которой алгоритм был в очередной раз переоткрыт, а также описывалась удобная реализация для ЭВМ[2].

Тот факт, что первооткрывателем алгоритма является Гаусс, был обнаружен лишь через несколько лет после публикации Кули и Тьюки. В своей статье они ссылались только на работу И. Дж. Гуда, в которой был описан алгоритм Гуда — Томаса.

Выражение преобразования Фурье длины N через два преобразования длины N/2 иногда называют леммой Шаблон:Нп3 — Ланцоша, так как оно было получено этими двумя авторами в 1942 году[3].

Примечания

Шаблон:Примечания

Литература

См. также