Участник:Ivanov.kir.m/Быстрое дискретное преобразование Фурье: различия между версиями
Pumpkin (обсуждение | вклад) |
|||
Строка 28: | Строка 28: | ||
==== Рекурсивное описание ==== | ==== Рекурсивное описание ==== | ||
Алгоритм: | Алгоритм: | ||
− | # Входной вектор <math>a = (a_1,a_2,...,a_n)</math> преобразуется в матрицу <math>A = \begin{pmatrix} | + | # Входной вектор <math>a = (a_1,a_2,...,a_n)</math> преобразуется в матрицу <math>A</math> размера <math>n_1 \times n_2 </math>, где <math>n=n_1 \cdot n_2</math> и <math>n_1 < n_2</math> |
+ | <math> A = \begin{pmatrix} | ||
a_1 & a_2 & \cdots & a_{n_1} \\ | a_1 & a_2 & \cdots & a_{n_1} \\ | ||
a_{n_1+1} & a_{n_1} & \cdots & a_{2n_1} \\ | a_{n_1+1} & a_{n_1} & \cdots & a_{2n_1} \\ | ||
\vdots & \vdots & \ddots & \vdots \\ | \vdots & \vdots & \ddots & \vdots \\ | ||
a_{(n2-1)*n1+1} & a_{(n2-1)*n1+1} & \cdots & a_{n2*n1} | a_{(n2-1)*n1+1} & a_{(n2-1)*n1+1} & \cdots & a_{n2*n1} | ||
− | \end{pmatrix} | + | \end{pmatrix} </math> |
# К каждой строке полученной матрицы применяется дискретное преобразование Фурье порядка <math>n_1</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> - номер столбца) | # Каждый элемент полученный после применения ДПФ умножается на поворотные множители (в наиболее простом случае, когда <math>n</math> является степенью двойки повортный множитель равен <math>exp (2 \pi i(m-1)(j-1)/n)</math>, где <math>m</math> - номер строки, а <math>j</math> - номер столбца) |
Версия 15:25, 18 сентября 2016
Алгоритм Кули-Тьюки одномерного преобразования Фурье для действительных чисел | |
Последовательный алгоритм | |
Последовательная сложность | [math]O (n log_{2} n)[/math] |
Объём входных данных | [math]n[/math] действительных чисел |
Объём выходных данных | [math]\lfloor n/2 \rfloor+1[/math] комплексных чисел |
Параллельный алгоритм | |
Высота ярусно-параллельной формы | [math]O (log_{2} n)[/math] |
Ширина ярусно-параллельной формы | [math]n[/math] |
Быстрое преобразование Фурье (БПФ, FFT) — алгоритм быстрого вычисления дискретного преобразования Фурье (ДПФ). То есть, алгоритм вычисления за количество действий, меньшее чем [math]O(N^{2})[/math], требуемых для прямого (по формуле) вычисления ДПФ. Иногда под БПФ понимается один из быстрых алгоритмов, называемый алгоритмом прореживания по частоте/времени или алгоритмом по основанию 2, имеющий сложность [math]O(N\log(N))[/math]. Cуществует несколько различных алгоритмов для вычисления ДПФ считающимся быстрым преобразование Фурье:
Содержание
1 ЧАСТЬ. Свойства и структура алгоритмов
1.1 Общее описание алгоритма
Одним из вариантов быстрого преобразования Фурье для вектора действительных чисел с размерностью равной степени двойки является алгоритм Кули-Тьюки. Отличительной особенностью данного алгоритма является то, что он обходится без использования специфических приемов, использующихся именно для степеней четверки, восьмерки и т.п. Однако благодаря тому, что на вход данному алгоритму подается вектор чисто вещественных чисел, выходной вектор удовлетворяет эрмитовой избыточности (Hermitian redundancy) , т.е. [math]out[i][/math] является сопряженным с [math]out[n-i][/math]. Это обстоятельство позволяет достичь роста скорости и снижения затрат памяти примерно в 2 раза по сравнению с комплексным аналогом алгоритма.
1.1.1 Математическое описание алгоритма
Входные данные: вектор действительных чисел [math]a = (a_1,a_2,...,a_n)[/math].
Выходные данные: вектор комплексных чисел [math]b = (b_1,b_2,...,b_{\lfloor n/2 \rfloor+1})[/math].
Замечание: поскольку алгоритм Кули-Тьюки применим только к векторам размерности степени двойки, вектора иной размерности необходимо дополнять до ближайшей степени двойки. Данный факт делает алгоритм Кули-Тьюки не самым эффективным алгоритмом БПФ, поскольку необходимость дополнения до степени двойки может сильно усложнить задачу.
1.1.1.1 Рекурсивное описание
Алгоритм:
- Входной вектор [math]a = (a_1,a_2,...,a_n)[/math] преобразуется в матрицу [math]A[/math] размера [math]n_1 \times n_2 [/math], где [math]n=n_1 \cdot n_2[/math] и [math]n_1 \lt n_2[/math]
[math] 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]
- К каждой строке полученной матрицы применяется дискретное преобразование Фурье порядка [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]
1.1.2 Вычислительное ядро алгоритма
Вычислительным ядром алгоритма является так называемая "бабочка". В зависимости от этого элементарного шага определяется время работы всего алгоритма. В простейшем случае "бабочка" представляет из себя двухточечное преобразование.
На вход алгоритму подается двухэлементный вектор -- [math] v = (v[0], v[1]) [/math]. Тогда для вычисления будут происходить по следующим формулам:
[math]V[0] = W_2^0 v[0] + W_2^0 v[1] = v[0] + W_2^0 v[1] [/math]
[math]V[1] = W_2^0 v[0] + W_2^1 v[1] = v[0] + W_2^1 v[1] [/math]
Данный процесс удобно изобразить с помощью следующей схемы:
[[5]]
2 ЧАСТЬ. Программная реализация алгоритма
2.1 Особенности реализации последовательного алгоритма
2.2 Локальность данных и вычислений
2.3 Динамические характеристики и эффективность реализации алгоритма
2.4 Существующие реализации алгоритма
3 Литература
[1] Википедия [Электронный ресурс]. Тема: Быстрое преобразование Фурье – Электрон. дан. – URL Быстрое преобразование Фурье (дата обращения 17.09.2016)