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

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

Материал из Алговики
Перейти к навигации Перейти к поиску
Строка 28: Строка 28:
 
==== Рекурсивное описание ====
 
==== Рекурсивное описание ====
 
Алгоритм:
 
Алгоритм:
1. Входной вектор <math>a = (a_1,a_2,...,a_n)</math> дополняется элементами до ближайшей степени двойки
+
# Входной вектор <math>a = (a_1,a_2,...,a_n)</math> преобразуется в матрицу <math>A = \begin{pmatrix}
Вектор записывается по строкам по 2 элемента в каждой. После этого над каждой строкой выполняется преобразование Фурье порядка 2,
+
  a_1 & a_2 & \cdots & a_{n_1} \\
получившиеся элементы умножаются на поворотные множители <math>exp (2 \pi i(m-1)(j-1)/n)</math> (<math>m</math> - номер строки, <math>j</math> - номер столбца), после чего выполняется БПФ порядка <math>n/2</math> над каждым из столбцов.
+
  a_{n_1+1} & a_{n_1} & \cdots & a_{2n_1} \\
Поскольку для 1-го столбца поворотные множители равны 1, то реально умножение на них не выполняется, а умножения на поворотные множители элементов второго столбца соединяются с преобразованием Фурье порядка 2. Эта комбинация, называемая "бабочкой" в среде специалистов по БПФ, и является основной операцией в простом алгоритме Кули-Тьюки. "Бабочка" состоит из вычисления суммы двух комплексных чисел, а также из вычисления их разности с последующим умножением на комплексное число. Всего на каждом шаге выполняется <math>n/2</math> "бабочек", а шагов - <math>l-1</math>. Последний,
+
  \vdots  & \vdots  & \ddots & \vdots  \\
<math>l</math>-й шаг вычисляет только суммы и разности.
+
  a_{(n2-1)*n1+1} & a_{(n2-1)*n1+1} & \cdots & a_{n2*n1}
 +
\end{pmatrix}</math> размера <math>n_1 \times n_2 </math>, где <math>n=n_1*n_2</math> и <math>n_1 < n_2</math>
 +
# К каждой строке полученной матрицы применяется дискретное преобразование Фурье порядка <math>n_1</math>
 +
# Каждый элемент полученный после применения ДПФ умножается на поворотные множители (в наиболее простом случае, когда <math>n</math> является степенью двойки повортный множитель равен <math>exp (2 \pi i(m-1)(j-1)/n)</math>, где <math>m</math> - номер строки, а <math>j</math> - номер столбца)
 +
# Полученная после шагов 1-3 матрица <math>A</math> транспанируется
 +
# К каждой строке матрицы <math>A^T</math> применяется ДПФ порядка <math>n_2</math>
  
 
= ЧАСТЬ. Программная реализация алгоритма =
 
= ЧАСТЬ. Программная реализация алгоритма =

Версия 15:21, 18 сентября 2016


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

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

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

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

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

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

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

Входные данные: вектор действительных чисел a = (a_1,a_2,...,a_n).

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

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

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

Алгоритм:

  1. Входной вектор a = (a_1,a_2,...,a_n) преобразуется в матрицу 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} размера n_1 \times n_2 , где n=n_1*n_2 и n_1 \lt n_2
  2. К каждой строке полученной матрицы применяется дискретное преобразование Фурье порядка n_1
  3. Каждый элемент полученный после применения ДПФ умножается на поворотные множители (в наиболее простом случае, когда n является степенью двойки повортный множитель равен exp (2 \pi i(m-1)(j-1)/n), где m - номер строки, а j - номер столбца)
  4. Полученная после шагов 1-3 матрица A транспанируется
  5. К каждой строке матрицы A^T применяется ДПФ порядка n_2

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

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

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

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

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

3 Литература

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