Уровень алгоритма

Участник:Ivanov.kir.m/Быстрое дискретное преобразование Фурье: различия между версиями

Материал из Алговики
Перейти к навигации Перейти к поиску
Строка 40: Строка 40:
# К каждой строке матрицы <math>A^T</math> применяется ДПФ порядка <math>n_2</math>
# К каждой строке матрицы <math>A^T</math> применяется ДПФ порядка <math>n_2</math>


=== Вычислительное ядро алгоритма ===
== Вычислительное ядро алгоритма ==
Вычислительным ядром алгоритма является так называемая "бабочка". В зависимости от этого элементарного шага определяется время работы всего алгоритма. В простейшем случае "бабочка" представляет из себя двухточечное преобразование.
Вычислительным ядром алгоритма является так называемая "бабочка". В зависимости от этого элементарного шага определяется время работы всего алгоритма. В простейшем случае "бабочка" представляет из себя двухточечное преобразование.



Версия от 12:26, 18 сентября 2016


Алгоритм Кули-Тьюки одномерного преобразования Фурье для действительных чисел
Последовательный алгоритм
Последовательная сложность [math]\displaystyle{ O (n log_{2} n) }[/math]
Объём входных данных [math]\displaystyle{ n }[/math] действительных чисел
Объём выходных данных [math]\displaystyle{ \lfloor n/2 \rfloor+1 }[/math] комплексных чисел
Параллельный алгоритм
Высота ярусно-параллельной формы [math]\displaystyle{ O (log_{2} n) }[/math]
Ширина ярусно-параллельной формы [math]\displaystyle{ n }[/math]

Быстрое преобразование Фурье (БПФ, FFT) — алгоритм быстрого  вычисления дискретного преобразования Фурье (ДПФ). То есть, алгоритм вычисления за количество действий, меньшее чем [math]\displaystyle{ O(N^{2}) }[/math], требуемых для прямого (по формуле) вычисления ДПФ. Иногда под БПФ понимается один из быстрых алгоритмов, называемый алгоритмом прореживания по частоте/времени или алгоритмом по основанию 2, имеющий сложность [math]\displaystyle{ O(N\log(N)) }[/math]. Cуществует несколько различных алгоритмов для вычисления ДПФ считающимся быстрым преобразование Фурье:

  • Алгоритм Кули-Тьюки [1]
  • Алгоритм Гуда-Томаса [2]
  • Алгоритм Бруна [3]
  • Алгоритм Блюштейна [4]

ЧАСТЬ. Свойства и структура алгоритмов

Общее описание алгоритма

Одним из вариантов быстрого преобразования Фурье для вектора действительных чисел с размерностью равной степени двойки является алгоритм Кули-Тьюки. Отличительной особенностью данного алгоритма является то, что он обходится без использования специфических приемов, использующихся именно для степеней четверки, восьмерки и т.п. Однако благодаря тому, что на вход данному алгоритму подается вектор чисто вещественных чисел, выходной вектор удовлетворяет эрмитовой избыточности (Hermitian redundancy) , т.е. [math]\displaystyle{ out[i] }[/math] является сопряженным с [math]\displaystyle{ out[n-i] }[/math]. Это обстоятельство позволяет достичь роста скорости и снижения затрат памяти примерно в 2 раза по сравнению с комплексным аналогом алгоритма.

Математическое описание алгоритма

Входные данные: вектор действительных чисел [math]\displaystyle{ a = (a_1,a_2,...,a_n) }[/math].

Выходные данные: вектор комплексных чисел [math]\displaystyle{ b = (b_1,b_2,...,b_{\lfloor n/2 \rfloor+1}) }[/math].

Замечание: поскольку алгоритм Кули-Тьюки применим только к векторам размерности степени двойки, вектора иной размерности необходимо дополнять до ближайшей степени двойки. Данный факт делает алгоритм Кули-Тьюки не самым эффективным алгоритмом БПФ, поскольку необходимость дополнения до степени двойки может сильно усложнить задачу.

Рекурсивное описание

Алгоритм:

  1. Входной вектор [math]\displaystyle{ a = (a_1,a_2,...,a_n) }[/math] преобразуется в матрицу [math]\displaystyle{ A }[/math] размера [math]\displaystyle{ n_1 \times n_2 }[/math], где [math]\displaystyle{ n=n_1 \cdot n_2 }[/math] и [math]\displaystyle{ n_1 \lt n_2 }[/math]

[math]\displaystyle{ A = \begin{pmatrix} a_1 & a_2 & \cdots & a_{n_1} \\ a_{n_1+1} & a_{n_1} & \cdots & a_{2n_1} \\ \vdots & \vdots & \ddots & \vdots \\ a_{(n2-1)*n1+1} & a_{(n2-1)*n1+1} & \cdots & a_{n2*n1} \end{pmatrix} }[/math]

  1. К каждой строке полученной матрицы применяется дискретное преобразование Фурье порядка [math]\displaystyle{ n_1 }[/math]
  2. Каждый элемент полученный после применения ДПФ умножается на поворотные множители (в наиболее простом случае, когда [math]\displaystyle{ n }[/math] является степенью двойки повортный множитель равен [math]\displaystyle{ exp (2 \pi i(m-1)(j-1)/n) }[/math], где [math]\displaystyle{ m }[/math] - номер строки, а [math]\displaystyle{ j }[/math] - номер столбца)
  3. Полученная после шагов 1-3 матрица [math]\displaystyle{ A }[/math] транспанируется
  4. К каждой строке матрицы [math]\displaystyle{ A^T }[/math] применяется ДПФ порядка [math]\displaystyle{ n_2 }[/math]

Вычислительное ядро алгоритма

Вычислительным ядром алгоритма является так называемая "бабочка". В зависимости от этого элементарного шага определяется время работы всего алгоритма. В простейшем случае "бабочка" представляет из себя двухточечное преобразование.

На вход алгоритму подается двухэлементный вектор -- [math]\displaystyle{ v = (v[0], v[1]) }[/math]. Тогда для вычисления будут происходить по следующим формулам:

[math]\displaystyle{ V[0] = W_2^0 v[0] + W_2^0 v[1] = v[0] + W_2^0 v[1] }[/math]

[math]\displaystyle{ V[1] = W_2^0 v[0] + W_2^1 v[1] = v[0] + W_2^1 v[1] }[/math]

Данный процесс удобно изобразить с помощью следующей схемы:

[[5]]

ЧАСТЬ. Программная реализация алгоритма

Особенности реализации последовательного алгоритма

Локальность данных и вычислений

Динамические характеристики и эффективность реализации алгоритма

Существующие реализации алгоритма

Литература

[1] Википедия [Электронный ресурс]. Тема: Быстрое преобразование Фурье – Электрон. дан. – URL Быстрое преобразование Фурье (дата обращения 17.09.2016)