<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Chachba.A</id>
	<title>Алговики - Вклад [ru]</title>
	<link rel="self" type="application/atom+xml" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Chachba.A"/>
	<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/ru/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/Chachba.A"/>
	<updated>2026-10-23T02:42:27Z</updated>
	<subtitle>Вклад</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%91%D1%8B%D1%81%D1%82%D1%80%D0%BE%D0%B5_%D0%B4%D0%B8%D1%81%D0%BA%D1%80%D0%B5%D1%82%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%A4%D1%83%D1%80%D1%8C%D0%B5_(%D0%91%D0%9F%D0%A4)&amp;diff=17822</id>
		<title>Быстрое дискретное преобразование Фурье (БПФ)</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%91%D1%8B%D1%81%D1%82%D1%80%D0%BE%D0%B5_%D0%B4%D0%B8%D1%81%D0%BA%D1%80%D0%B5%D1%82%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%A4%D1%83%D1%80%D1%8C%D0%B5_(%D0%91%D0%9F%D0%A4)&amp;diff=17822"/>
		<updated>2016-11-16T21:58:37Z</updated>

		<summary type="html">&lt;p&gt;Chachba.A: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Авторы: [[Участник:Chachba.A|Чачба А.Н.]], [[Участник:Weasel|Костоев Р.С.]] &lt;br /&gt;
&lt;br /&gt;
[[Участник:Chachba.A|Чачба А.Н.]] заполнил половину всех заполненных пунктов (а именно 1.1, 1.2, 1.6, 1.8, 1.9) и построил информационный граф алгоритма, [[Участник:Weasel|Костоев Р.С.]] написал программу и провел серию запусков на суперкомпьютере и заполнил вторую половину пунктов. Оба после заполнения исправляли найденные ошибки во всех пунктах.&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Быстрое преобразование Фурье (БПФ)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(N \log N)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\log N)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(N)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Преобразование Фурье - взаимно однозначное отображение одной функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; вещественной переменной, называемой таргетным сигналом, с другой функцией &amp;lt;math&amp;gt;\hat{f}&amp;lt;/math&amp;gt; вещественной переменной, называемой образом Фурье или спектром исходной функции по формуле:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\hat{f}(\omega)=\frac{1}{\sqrt{2\pi}}\int\limits_{-\infty}^{\infty}f(x)e^{-ix\omega}\,dx&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Дискретное преобразование Фурье, в свою очередь, есть аналог непрерывного преобразования Фурье, но для дискретного сигнала содержащего &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; отсчетов.&lt;br /&gt;
Широко применяется в цифровой обработке сигналов, теории вероятностей, криптографии и акустике.&lt;br /&gt;
Преобразование Фурье обратимо, причем обратное преобразование имеет практически ту же форму, что и прямое.&lt;br /&gt;
Преобразование Фурье имеет сложность &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt;, но существует быстрый вариант преобразование Фурье со сложностью &amp;lt;math&amp;gt;O(N\log{N})&amp;lt;/math&amp;gt;.&lt;br /&gt;
Такая скорость достигается благодаря применению схемы &amp;quot;разделяй и властвуй&amp;quot;. Общий вид преобразования позволяет разделить массив на несколько частей таким образом, что, применяя преобразование Фурье к отдельным его частям и объединяя специальным образом результаты (при помощи поворотных множителей и повторного применения преобразования), получать на выходе образ исходного вектора. Но благодаря разделению массива исходного размера на части суммарная асимптотическая сложность алгоритма уменьшается.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть исходный сигнал имеет значения &amp;lt;math&amp;gt;x_n,\quad n = 0,\dots,N-1&amp;lt;/math&amp;gt;, тогда дискретное прямое преобразование Фурье (ДПФ) имеет вид:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
X_k = \sum_{n=0}^{N-1}x_ne^{-\frac{2\pi i}{N}kn},\quad k = 0, \dots, N-1&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt; \varepsilon_{N} = e^{-\frac{2\pi i}{N}}&amp;lt;/math&amp;gt;, тогда ДПФ можно перезаписать в матричной форме:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\bar X = A\bar x&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где матрица &amp;lt;math&amp;gt;A = \{\varepsilon_{N}^{(i - 1)(j - 1)}\}_{i,j=1}^{N}&amp;lt;/math&amp;gt;&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Пусть, для простоты &amp;lt;math&amp;gt; N = km&amp;lt;/math&amp;gt;, тогда рекурсивная реализация преобразования Фурье, за счет &amp;lt;math&amp;gt;{k}&amp;lt;/math&amp;gt; рекурсий на первом этапе и &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; на последнем этапе, имеет суммарную сложность &amp;lt;math&amp;gt;O(Nk + Nm + km) = O(N(k + m))&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В случае, например &amp;lt;math&amp;gt;N = 2^n&amp;lt;/math&amp;gt; сложность БПФ составляет &amp;lt;math&amp;gt;O(N\log{N})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В общем же случае, когда &amp;lt;math&amp;gt;N = \prod_{i=1}^np_i&amp;lt;/math&amp;gt; сложность БПФ составляет &amp;lt;math&amp;gt; O(N(\sum_{i=1}^np_i))&amp;lt;/math&amp;gt;. Так как рекурсия применяется каждый раз при отщеплении одного множителя, то можно заключить, что глубина рекурсии алгоритма составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-число множителей в факторизации &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В свою очередь, если число &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; не факторизуется в произведение простых множителей (то есть &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - простое число), то данный алгоритм не применим. На замену ему приходит алгоритм Радера, имеющий худшую асимптотику, нежели обычный БПФ, но лучшую чем &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt;. Также алгоритм Радера потребует дополнительного взаимодействия процессоров, что приведет к ухудшению эффективности.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Макроструктура БПФ для случая &amp;lt;math&amp;gt;N = km&amp;lt;/math&amp;gt; описывается рекурсивно:&lt;br /&gt;
# &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; независимых преобразований векторов меньшей размерности &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;&lt;br /&gt;
#Умножение элементов на поворотные коэффициенты (&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; умножений)&lt;br /&gt;
# &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; обратных преобразований векторов размерностей &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Рекурсивный метод для случая &amp;lt;math&amp;gt;N = 2^k&amp;lt;/math&amp;gt;, без оптимизации на C++:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;lt;vector&amp;gt;&lt;br /&gt;
#include &amp;lt;complex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
typedef complex&amp;lt;double&amp;gt; cd;&lt;br /&gt;
typedef vector&amp;lt;cd&amp;gt; vcd;&lt;br /&gt;
&lt;br /&gt;
vcd fft(const vcd &amp;amp;as) { &lt;br /&gt;
  int n = as.size();&lt;br /&gt;
  if (n == 1) return vcd(1, as[0]);&lt;br /&gt;
&lt;br /&gt;
  vcd w(n); // Calculate roots&lt;br /&gt;
  for (int i = 0; i &amp;lt; n; i++) {&lt;br /&gt;
    double alpha = 2 * M_PI * i / n;&lt;br /&gt;
    w[i] = cd(cos(alpha), sin(alpha));&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  vcd A(n / 2), B(n / 2);&lt;br /&gt;
  for (int i = 0; i &amp;lt; n / 2; i++) {&lt;br /&gt;
    A[i] = as[i * 2];&lt;br /&gt;
    B[i] = as[i * 2 + 1];&lt;br /&gt;
  }&lt;br /&gt;
  vcd Av = fft(A);&lt;br /&gt;
  vcd Bv = fft(B);&lt;br /&gt;
  vcd res(n);&lt;br /&gt;
  for (int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
    res[i] =   Av[i % (n / 2)] +&lt;br /&gt;
        w[i] * Bv[i % (n / 2)];&lt;br /&gt;
  return res;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
В последовательном варианте можно бороться за улучшение константы сложности, предподсчитав значения соответствующих коэффициентов.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Алгоритм состоит из трех этапов, следовательно если &amp;lt;math&amp;gt;N = \prod_{i = 1}^np_i&amp;lt;/math&amp;gt;, то общая сложность составляет порядка &amp;lt;math&amp;gt;O(N\sum_{i=1}^np_i)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Пусть существует некоторое фиксированное число &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, такое что:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
p_i \leq P \quad \forall i = 1...n,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
тогда, учитывая, что &amp;lt;math&amp;gt;n \leq \log_{P}{N}&amp;lt;/math&amp;gt;, сложность алгоритма можно записать в виде &amp;lt;math&amp;gt;O(N\log{N})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[Файл:FourierGraph2.png|center|thumb|640px|&#039;&#039;&#039;Рисунок 1.&#039;&#039;&#039; Информационный граф преобразования Кули-Тьюки для &amp;lt;math&amp;gt;N = km = 25, k = 5, m = 5&amp;lt;/math&amp;gt;. Желтые вершины - умножение на поворотные множители.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
В силу независимости всех рекурсивных вызовов и того факта, что путь максимальной длины в графе (так называемый критический путь) имеет порядок &amp;lt;math&amp;gt;O(\log{N})&amp;lt;/math&amp;gt;, можно утверждать, что параллельная сложность алгоритма составит &amp;lt;math&amp;gt;O(\log{N})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Замечание&#039;&#039;: формально основание логарифма на каждом рекурсивном шаге зависит от множителя в факторизации &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, потому использована О-символика.&lt;br /&gt;
&lt;br /&gt;
При условии ограниченности количества доступных вычислительных узлов рекомендуется выбирать множители в разложении числа $N$ близкими к числу доступных узлов, таким образом доступные ресурсы будут использованы максимально эффективно.&lt;br /&gt;
&lt;br /&gt;
Итого алгоритм относится к логарифмическому классу алгоритмов по параллельной сложности.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;:&lt;br /&gt;
Чаще всего для обработки сигналов в качестве входных данных для БПФ подается вектор размерности &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; вещественных элементов. Но БПФ работает и для случая элементов над комплексным полем. Таким образом, например, можно экономить на количестве применений БПФ в некоторой конкретной задаче путем приведения двух векторов вещественных чисел к одному вектору комплексных чисел с вещественной частью равной первому вектору и комплексной частью равной второму вектору:&lt;br /&gt;
&amp;lt;math&amp;gt;x, y&amp;lt;/math&amp;gt; - исходные сигналы. Обозначим &amp;lt;math&amp;gt;z = x + iy&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;F(k, x)&amp;lt;/math&amp;gt; - это &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-ый коэффициент образа Фурье вектора &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;. Тогда:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;F(k, x) = \frac{F(k, z) + F(k, \bar z)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;F(k, y) = -i\frac{F(k, z) - F(k, \bar z)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Учитывая, что &amp;lt;math&amp;gt;F(k, \bar z) = \overline{F(N - k, z)}&amp;lt;/math&amp;gt;, получаем:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;F(k, x) = \frac{F(k, z) + \overline{F(N-k, z)}}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;F(k, y) = -i\frac{F(k, z) - \overline{F(N-k,z)}}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Такой способ позволяет приблизительно в два раза уменьшить количество вычислений.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;:&lt;br /&gt;
Вектор размерности &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; комплексных чисел - спектр исходного сигнала.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Матрица Вандермонда преобразования &amp;lt;math&amp;gt;A = \{e^{-\frac{2\pi i}{N}(i - 1)(j - 1)}\}_{i,j=1}^{N}&amp;lt;/math&amp;gt; такая, что:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
A^{-1} = \frac{1}{N}A^*&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Таким образом обратное преобразование Фурье с точностью до нормирующего множителя и сопряжения элементов матрицы совпадает с прямым.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
Все запуски проводились на с/к Blue Gene/P.&lt;br /&gt;
&lt;br /&gt;
IBM Blue Gene/P — массивно-параллельная вычислительная система, которая состоит из двух стоек, включающих 2048 четырехъядерных вычислительных узлов, с пиковой производительностью 27,9 терафлопс.&lt;br /&gt;
&lt;br /&gt;
Характеристики системы:&lt;br /&gt;
* две стойки с вычислительными узлами и узлами ввода-вывода&lt;br /&gt;
* 1024 четырехъядерных вычислительных узла в каждой из стоек&lt;br /&gt;
* 16 узлов ввода-вывода в стойке (в текущей конфигурации активны 8, т.е. одна I/O-карта на 128 вычислительных узлов)&lt;br /&gt;
* программирование с использованием MPI, OpenMP/pthreads, POSIX I/O&lt;br /&gt;
* высокая энергоэффективность: ∼ 372 MFlops/W&lt;br /&gt;
&lt;br /&gt;
Вычислительный узел включает в себя четырехъядерный процессор, 2 ГБ общей памяти и сетевые интерфейсы.&lt;br /&gt;
&lt;br /&gt;
Вычислительной узел:&lt;br /&gt;
* четыре микропроцессорных ядра PowerPC 450 (4-way SMP)&lt;br /&gt;
* пиковая производительность: 4 ядра x 3,4 GFlop/sec на ядро = 13,6 GFlop/sec&lt;br /&gt;
* пропускная способность памяти: 13,6 GB/sec&lt;br /&gt;
* 2 ГБ общей памяти&lt;br /&gt;
* 2 x 4 МБ кэш-памяти 2-го уровня (в документации по BG/P носит название L3)&lt;br /&gt;
* легковесное ядро (compute node kernel, CNK), представляющее собой Linux-подобную операционную систему, поддерживающую значительное подмножество Linux-совместимых системных вызовов&lt;br /&gt;
* асинхронные операции межпроцессорных обменов (выполняются параллельно с вычислениями)&lt;br /&gt;
* операции ввода-вывода перенаправляются I/O-картам через сеть коллективных операций&lt;br /&gt;
&lt;br /&gt;
[[Файл:Time.PNG|center|thumb|640px|&#039;&#039;&#039;Рисунок 2.&#039;&#039;&#039; Время выполнения параллельной реализации БПФ в секундах. Size - число элементов массива. Р - число использованных процессоров.]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:Efff.PNG|center|thumb|640px|&#039;&#039;&#039;Рисунок 3.&#039;&#039;&#039; Эффективность параллельной реализации БПФ. Size - число элементов массива. Р - число использованных процессоров. Эффективность в пределах от 0 до 1.]]&lt;br /&gt;
&lt;br /&gt;
Как видно из графика, эффективность параллельной реализации резко падает с ростом количества используемых процессоров, связано это с увеличением количества накладных расходов.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
* Самая популярная библиотека для работы с преобразованиями Фурье это [http://www.fftw.org FFTW]&lt;br /&gt;
* Реализация от Intel в рамках [//software.intel.com/en-us/intel-mkl Math Kernel Library]&lt;br /&gt;
* Реализация ДПФ на графических картах от NVidia - [//developer.nvidia.com/cufft cuFFT]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
* Бахвалов Н. С.,  Жидков Н. П., Кобельков. Г. М. — 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. — 636 с.&lt;br /&gt;
* Описание алгоритма на Википедии: [https://ru.wikipedia.org/wiki/%D0%91%D1%8B%D1%81%D1%82%D1%80%D0%BE%D0%B5_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%A4%D1%83%D1%80%D1%8C%D0%B5 Быстрое преобразование Фурье]&lt;br /&gt;
* Материалы лекций по &amp;quot;Алгоритмам и структурам данных&amp;quot; Школы Анализа Данных Яндекса&lt;/div&gt;</summary>
		<author><name>Chachba.A</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Chachba.A&amp;diff=17133</id>
		<title>Обсуждение участника:Chachba.A</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Chachba.A&amp;diff=17133"/>
		<updated>2016-11-14T21:22:17Z</updated>

		<summary type="html">&lt;p&gt;Chachba.A: /* Замечания к статье &amp;quot;Быстрое дискретное преобразование Фурье&amp;quot; */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Замечания к статье ==&lt;br /&gt;
&lt;br /&gt;
* п.п. 1.8, 1.9 не раскрыты--[[Участник:IgorS|IgorS]] ([[Обсуждение участника:IgorS|обсуждение]]) 14:57, 25 октября 2016 (MSK)&lt;br /&gt;
** исправлено&lt;br /&gt;
* не указан конкретный вклад каждого автора--[[Участник:IgorS|IgorS]] ([[Обсуждение участника:IgorS|обсуждение]]) 14:57, 25 октября 2016 (MSK)&lt;br /&gt;
** исправлено&lt;br /&gt;
&lt;br /&gt;
== Замечания к статье &amp;quot;Быстрое дискретное преобразование Фурье&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
* Перенесите пожалуйста статью в личное пространство [[Участник:Kronberg|Kronberg]] ([[Обсуждение участника:Kronberg|обсуждение]]) 13:31, 11 ноября 2016 (MSK) &lt;br /&gt;
** а как это сделать? У нас нет прав на это, похоже&lt;br /&gt;
* Раздел 1.1 - в самом первом абзаце стоит вставить обозначения двух фунций - f и f с крышкой, чтобы было ясно, что куда отображается. [[Участник:Kronberg|Kronberg]] ([[Обсуждение участника:Kronberg|обсуждение]]) 13:31, 11 ноября 2016 (MSK) &lt;br /&gt;
** Done&lt;br /&gt;
* В общее описание алгоритма нужно вставить слова именно об алгоритме, а не только о математической задаче. В чем быстрота, за счет чего она достигается и т.д. Тут, в отличие от математического описания, не стоит увлекаться формулами. [[Участник:Kronberg|Kronberg]] ([[Обсуждение участника:Kronberg|обсуждение]]) 13:31, 11 ноября 2016 (MSK)&lt;br /&gt;
** Done&lt;br /&gt;
* Раздел 1.2 - существует обозначение части формулы через эпсилон, однако в следующей формуле он не встречается, странно. [[Участник:Kronberg|Kronberg]] ([[Обсуждение участника:Kronberg|обсуждение]]) 13:31, 11 ноября 2016 (MSK)&lt;br /&gt;
** Done&lt;br /&gt;
* Нужно пояснение, что происходит, когда N не представимо в виде произведения: применим ли алгоритм и в каких изменениях он нуждается. [[Участник:Kronberg|Kronberg]] ([[Обсуждение участника:Kronberg|обсуждение]]) 13:31, 11 ноября 2016 (MSK)&lt;br /&gt;
** Done&lt;br /&gt;
* Нет данных о глубине рекурсии, написать об этом явно, скорее всего, в разделе &amp;quot;вычислительное ядро алгоритма&amp;quot;. [[Участник:Kronberg|Kronberg]] ([[Обсуждение участника:Kronberg|обсуждение]]) 13:31, 11 ноября 2016 (MSK)&lt;br /&gt;
** Done&lt;/div&gt;</summary>
		<author><name>Chachba.A</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%91%D1%8B%D1%81%D1%82%D1%80%D0%BE%D0%B5_%D0%B4%D0%B8%D1%81%D0%BA%D1%80%D0%B5%D1%82%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%A4%D1%83%D1%80%D1%8C%D0%B5_(%D0%91%D0%9F%D0%A4)&amp;diff=9070</id>
		<title>Быстрое дискретное преобразование Фурье (БПФ)</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%91%D1%8B%D1%81%D1%82%D1%80%D0%BE%D0%B5_%D0%B4%D0%B8%D1%81%D0%BA%D1%80%D0%B5%D1%82%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%A4%D1%83%D1%80%D1%8C%D0%B5_(%D0%91%D0%9F%D0%A4)&amp;diff=9070"/>
		<updated>2016-10-15T10:36:49Z</updated>

		<summary type="html">&lt;p&gt;Chachba.A: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: [[Участник:Chachba.A|Чачба А.Н.]], [[Участник:Weasel|Костоев Р.С.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Быстрое преобразование Фурье (БПФ)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(N \log N)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\log N)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(N)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Преобразование Фурье - взаимно однозначное отображение одной функции вещественной, называемой таргетным сигналом, с другой функцией вещественной переменной, называемой образом Фурье или спектром исходной функции по формуле:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\hat{f}(\omega)=\frac{1}{\sqrt{2\pi}}\int\limits_{-\infty}^{\infty}f(x)e^{-ix\omega}\,dx&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Дискретное преобразование Фурье, в свою очередь, если аналог непрерывного преобразования Фурье, но для дискретного сигнала содержащего &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; отсчетов.&lt;br /&gt;
Широко применяет в цифровой обработке сигналов, теории вероятностей, криптографии и акустике.&lt;br /&gt;
Преобразование Фурье обратимо, причем обратное преобразование имеет практически ту же форму, что и прямое.&lt;br /&gt;
Преобразование Фурье имеет сложность &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt;, но существует быстрый вариант преобразование Фурье со сложностью &amp;lt;math&amp;gt;O(N\log{N})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть исходный сигнал имеет значения &amp;lt;math&amp;gt;x_n,\quad n = 0,\dots,N-1&amp;lt;/math&amp;gt;, тогда дискретное прямое преобразование Фурье (ДПФ) имеет вид:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
X_k = \sum_{n=0}^{N-1}x_ne^{-\frac{2\pi i}{N}kn},\quad k = 0, \dots, N-1&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt; \varepsilon_{N} = e^{-\frac{2\pi i}{N}}&amp;lt;/math&amp;gt;, тогда ДПФ можно перезаписать в матричной форме:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\bar X = A\bar x&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где матрица &amp;lt;math&amp;gt;A = \{e^{-\frac{2\pi i}{N}(i - 1)(j - 1)}\}_{i,j=1}^{N}&amp;lt;/math&amp;gt;&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Пусть, для простоты &amp;lt;math&amp;gt; N = km&amp;lt;/math&amp;gt;, тогда рекурсивная реализация преобразования Фурье, за счет &amp;lt;math&amp;gt;{k}&amp;lt;/math&amp;gt; рекурсий на первом этапе и &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; на последнем этапе, имеет суммарную сложность &amp;lt;math&amp;gt;O(Nk + Nm + km) = O(N(k + m))&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В случае, например &amp;lt;math&amp;gt;N = 2^n&amp;lt;/math&amp;gt; сложность БПФ составляет &amp;lt;math&amp;gt;O(N\log{N})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В общем же случае, когда &amp;lt;math&amp;gt;N = \prod_{i=1}^np_i&amp;lt;/math&amp;gt; сложность БПФ составляет &amp;lt;math&amp;gt; O(N(\sum_{i=1}^np_i))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Макроструктура БПФ для случая &amp;lt;math&amp;gt;N = km&amp;lt;/math&amp;gt; описывается рекурсивно:&lt;br /&gt;
# &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; независимых преобразований векторов меньшей размерности &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;&lt;br /&gt;
#Умножение элементов на поворотные коэффициенты (&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; умножений)&lt;br /&gt;
# &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; обратных преобразований векторов размерностей &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Рекурсивный метод для случая &amp;lt;math&amp;gt;N = 2^k&amp;lt;/math&amp;gt;, без оптимизации на C++:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;lt;vector&amp;gt;&lt;br /&gt;
#include &amp;lt;complex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
typedef complex&amp;lt;double&amp;gt; cd;&lt;br /&gt;
typedef vector&amp;lt;cd&amp;gt; vcd;&lt;br /&gt;
&lt;br /&gt;
vcd fft(const vcd &amp;amp;as) { &lt;br /&gt;
  int n = as.size();&lt;br /&gt;
  if (n == 1) return vcd(1, as[0]);&lt;br /&gt;
&lt;br /&gt;
  vcd w(n); // Calculate roots&lt;br /&gt;
  for (int i = 0; i &amp;lt; n; i++) {&lt;br /&gt;
    double alpha = 2 * M_PI * i / n;&lt;br /&gt;
    w[i] = cd(cos(alpha), sin(alpha));&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  vcd A(n / 2), B(n / 2);&lt;br /&gt;
  for (int i = 0; i &amp;lt; n / 2; i++) {&lt;br /&gt;
    A[i] = as[i * 2];&lt;br /&gt;
    B[i] = as[i * 2 + 1];&lt;br /&gt;
  }&lt;br /&gt;
  vcd Av = fft(A);&lt;br /&gt;
  vcd Bv = fft(B);&lt;br /&gt;
  vcd res(n);&lt;br /&gt;
  for (int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
    res[i] =   Av[i % (n / 2)] +&lt;br /&gt;
        w[i] * Bv[i % (n / 2)];&lt;br /&gt;
  return res;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
В последовательном варианте можно бороться за улучшение константы сложности, предподсчитав значения соответствующих коэффициентов.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Алгоритм состоит из трех этапов, следовательно если &amp;lt;math&amp;gt;N = \prod_{i = 1}^np_i&amp;lt;/math&amp;gt;, то общая сложность составляет порядка &amp;lt;math&amp;gt;O(N\sum_{i=1}^np_i)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Пусть существует некоторое фиксированное число &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, такое что:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
p_i \leq P \quad \forall i = 1...n,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
тогда, учитывая, что &amp;lt;math&amp;gt;n \leq \log_{P}{N}&amp;lt;/math&amp;gt;, сложность алгоритма можно записать в виде &amp;lt;math&amp;gt;O(N\log{N})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[Файл:FourierGraph2.png|center|thumb|640px|&#039;&#039;&#039;Рисунок 1.&#039;&#039;&#039; Информационный граф преобразования Кули-Тьюки для &amp;lt;math&amp;gt;N = km = 25, k = 5, m = 5&amp;lt;/math&amp;gt;. Желтые вершины - умножение на поворотные множители.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Пусть имеется неограниченное число процессоров, тогда учитывая схему алгоритма БПФ, максимальное число одновременно работающих процессоров может составлять &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, тогда сложность алгоритма на &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; процессорах составит &amp;lt;math&amp;gt;\log{N}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;:&lt;br /&gt;
Чаще всего для обработки сигналов в качестве входных данных для БПФ подается вектор размерности &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; вещественных элементов. Но БПФ работает и для случая элементов над комплексым полем. Таким образом, например, можно экономить на количестве применений БПФ в некоторой конкретной задаче путем приведения двух векторов вещественных чисел к одному вектору комплексных чисел с вещественной частью равной первому вектору и комплексной частью равной второму вектору.&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;:&lt;br /&gt;
Вектор размерности &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; комплексных чисел.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Матрица Вандермонда преобразования &amp;lt;math&amp;gt;A = \{e^{-\frac{2\pi i}{N}(i - 1)(j - 1)}\}_{i,j=1}^{N}&amp;lt;/math&amp;gt; такая, что:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
A^{-1} = \frac{1}{N}A^*&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Таким образом обратное преобразование Фурье с точностью до нормирующего множителя и сопряжения элементов матрицы совпадает с прямым.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
* Самая популярная библиотека для работы с преобразованиями Фурье это [http://www.fftw.org FFTW]&lt;br /&gt;
* Реализация от Intel в рамках [//software.intel.com/en-us/intel-mkl Math Kernel Library]&lt;br /&gt;
* Реализация ДПФ на графических картах от NVidia - [//developer.nvidia.com/cufft cuFFT]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>Chachba.A</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%91%D1%8B%D1%81%D1%82%D1%80%D0%BE%D0%B5_%D0%B4%D0%B8%D1%81%D0%BA%D1%80%D0%B5%D1%82%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%A4%D1%83%D1%80%D1%8C%D0%B5_(%D0%91%D0%9F%D0%A4)&amp;diff=7754</id>
		<title>Быстрое дискретное преобразование Фурье (БПФ)</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%91%D1%8B%D1%81%D1%82%D1%80%D0%BE%D0%B5_%D0%B4%D0%B8%D1%81%D0%BA%D1%80%D0%B5%D1%82%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%A4%D1%83%D1%80%D1%8C%D0%B5_(%D0%91%D0%9F%D0%A4)&amp;diff=7754"/>
		<updated>2016-10-14T16:15:52Z</updated>

		<summary type="html">&lt;p&gt;Chachba.A: /* Входные и выходные данные алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: [[Участник:Chachba.A|Чачба А.Н.]], [[Участник:Weasel|Костоев Р.С.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Быстрое преобразование Фурье (БПФ)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(N \log N)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\log N)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(N)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Преобразование Фурье - взаимно однозначное отображение одной функции вещественной, называемой таргетным сигналом, с другой функцией вещественной переменной, называемой образом Фурье или спектром исходной функции по формуле:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\hat{f}(\omega)=\frac{1}{\sqrt{2\pi}}\int\limits_{-\infty}^{\infty}f(x)e^{-ix\omega}\,dx&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Дискретное преобразование Фурье, в свою очередь, если аналог непрерывного преобразования Фурье, но для дискретного сигнала содержащего &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; отсчетов.&lt;br /&gt;
Широко применяет в цифровой обработке сигналов, теории вероятностей, криптографии и акустике.&lt;br /&gt;
Преобразование Фурье обратимо, причем обратное преобразование имеет практически ту же форму, что и прямое.&lt;br /&gt;
Преобразование Фурье имеет сложность &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt;, но существует быстрый вариант преобразование Фурье со сложностью &amp;lt;math&amp;gt;O(N\log{N})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть исходный сигнал имеет значения &amp;lt;math&amp;gt;x_n,\quad n = 0,\dots,N-1&amp;lt;/math&amp;gt;, тогда дискретное прямое преобразование Фурье (ДПФ) имеет вид:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
X_k = \sum_{n=0}^{N-1}x_ne^{-\frac{2\pi i}{N}kn},\quad k = 0, \dots, N-1&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt; \varepsilon_{N} = e^{-\frac{2\pi i}{N}}&amp;lt;/math&amp;gt;, тогда ДПФ можно перезаписать в матричной форме:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\bar X = A\bar x&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где матрица &amp;lt;math&amp;gt;A = \{e^{-\frac{2\pi i}{N}(i - 1)(j - 1)}\}_{i,j=1}^{N}&amp;lt;/math&amp;gt;&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Пусть, для простоты &amp;lt;math&amp;gt; N = km&amp;lt;/math&amp;gt;, тогда рекурсивная реализация преобразования Фурье, за счет &amp;lt;math&amp;gt;O(N{k})&amp;lt;/math&amp;gt; уровней рекурсии, имеет суммарную сложность &amp;lt;math&amp;gt;O(Nk + Nm + km) = O(N(k + m))&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В случае, например &amp;lt;math&amp;gt;N = 2^n&amp;lt;/math&amp;gt; сложность БПФ составляет &amp;lt;math&amp;gt;O(N\log{N})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В общем же случае, когда &amp;lt;math&amp;gt;N = \prod_{i=1}^np_i&amp;lt;/math&amp;gt; сложность БПФ составляет &amp;lt;math&amp;gt; O(N(\sum_{i=1}^np_i))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Макроструктура БПФ для случая &amp;lt;math&amp;gt;N = km&amp;lt;/math&amp;gt; описывается рекурсивно:&lt;br /&gt;
# &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; независимых преобразований векторов меньшей размерности &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;&lt;br /&gt;
#Умножение элементов на поворотные коэффициенты (&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; умножений)&lt;br /&gt;
# &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; обратных преобразований векторов размерностей &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Рекурсивный метод для случая &amp;lt;math&amp;gt;N = 2^k&amp;lt;/math&amp;gt;, без оптимизации на C++:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;lt;vector&amp;gt;&lt;br /&gt;
#include &amp;lt;complex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
typedef complex&amp;lt;double&amp;gt; cd;&lt;br /&gt;
typedef vector&amp;lt;cd&amp;gt; vcd;&lt;br /&gt;
&lt;br /&gt;
vcd fft(const vcd &amp;amp;as) { &lt;br /&gt;
  int n = as.size();&lt;br /&gt;
  if (n == 1) return vcd(1, as[0]);&lt;br /&gt;
&lt;br /&gt;
  vcd w(n); // Calculate roots&lt;br /&gt;
  for (int i = 0; i &amp;lt; n; i++) {&lt;br /&gt;
    double alpha = 2 * M_PI * i / n;&lt;br /&gt;
    w[i] = cd(cos(alpha), sin(alpha));&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  vcd A(n / 2), B(n / 2);&lt;br /&gt;
  for (int i = 0; i &amp;lt; n / 2; i++) {&lt;br /&gt;
    A[i] = as[i * 2];&lt;br /&gt;
    B[i] = as[i * 2 + 1];&lt;br /&gt;
  }&lt;br /&gt;
  vcd Av = fft(A);&lt;br /&gt;
  vcd Bv = fft(B);&lt;br /&gt;
  vcd res(n);&lt;br /&gt;
  for (int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
    res[i] =   Av[i % (n / 2)] +&lt;br /&gt;
        w[i] * Bv[i % (n / 2)];&lt;br /&gt;
  return res;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Алгоритм состоит из трех этапов, следовательно если &amp;lt;math&amp;gt;N = \prod_{i = 1}^np_i&amp;lt;/math&amp;gt;, то общая сложность составляет порядка &amp;lt;math&amp;gt;O(N\sum_{i=1}^np_i)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Пусть существует некоторое фиксированное число &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, такое что:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
p_i \leq P \quad \forall i = 1...n,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
тогда, учитывая, что &amp;lt;math&amp;gt;n \leq \log_{P}{N}&amp;lt;/math&amp;gt;, сложность алгоритма можно записать в виде &amp;lt;math&amp;gt;O(N\log{N})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[Файл:FourierGraph2.png|center|thumb|640px|&#039;&#039;&#039;Рисунок 1.&#039;&#039;&#039; Информационный граф преобразования Кули-Тьюки для &amp;lt;math&amp;gt;N = km = 25, k = 5, m = 5&amp;lt;/math&amp;gt;. Желтые вершины - умножение на поворотные множители.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Пусть имеется неограниченное число процессоров, тогда учитывая схему алгоритма БПФ, максимальное число одновременно работающих процессоров может составлять &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, тогда сложность алгоритма на &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; процессорах составит &amp;lt;math&amp;gt;\log{N}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;:&lt;br /&gt;
Чаще всего для обработки сигналов в качестве входных данных для БПФ подается вектор размерности &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; вещественных элементов. Но БПФ работает и для случая элементов над комплексым полем. Таким образом, например, можно экономить на количестве применений БПФ в некоторой конкретной задаче путем приведения двух векторов вещественных чисел к одному вектору комплексных чисел с вещественной частью равной первому вектору и комплексной частью равной второму вектору.&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;:&lt;br /&gt;
Вектор размерности &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; комплексных чисел.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>Chachba.A</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%91%D1%8B%D1%81%D1%82%D1%80%D0%BE%D0%B5_%D0%B4%D0%B8%D1%81%D0%BA%D1%80%D0%B5%D1%82%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%A4%D1%83%D1%80%D1%8C%D0%B5_(%D0%91%D0%9F%D0%A4)&amp;diff=7739</id>
		<title>Быстрое дискретное преобразование Фурье (БПФ)</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%91%D1%8B%D1%81%D1%82%D1%80%D0%BE%D0%B5_%D0%B4%D0%B8%D1%81%D0%BA%D1%80%D0%B5%D1%82%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%A4%D1%83%D1%80%D1%8C%D0%B5_(%D0%91%D0%9F%D0%A4)&amp;diff=7739"/>
		<updated>2016-10-14T16:04:06Z</updated>

		<summary type="html">&lt;p&gt;Chachba.A: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: [[Участник:Chachba.A|Чачба А.Н.]], [[Участник:Weasel|Костоев Р.С.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Быстрое преобразование Фурье (БПФ)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(N \log N)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\log N)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(N)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Преобразование Фурье - взаимно однозначное отображение одной функции вещественной, называемой таргетным сигналом, с другой функцией вещественной переменной, называемой образом Фурье или спектром исходной функции по формуле:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\hat{f}(\omega)=\frac{1}{\sqrt{2\pi}}\int\limits_{-\infty}^{\infty}f(x)e^{-ix\omega}\,dx&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Дискретное преобразование Фурье, в свою очередь, если аналог непрерывного преобразования Фурье, но для дискретного сигнала содержащего &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; отсчетов.&lt;br /&gt;
Широко применяет в цифровой обработке сигналов, теории вероятностей, криптографии и акустике.&lt;br /&gt;
Преобразование Фурье обратимо, причем обратное преобразование имеет практически ту же форму, что и прямое.&lt;br /&gt;
Преобразование Фурье имеет сложность &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt;, но существует быстрый вариант преобразование Фурье со сложностью &amp;lt;math&amp;gt;O(N\log{N})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть исходный сигнал имеет значения &amp;lt;math&amp;gt;x_n,\quad n = 0,\dots,N-1&amp;lt;/math&amp;gt;, тогда дискретное прямое преобразование Фурье (ДПФ) имеет вид:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
X_k = \sum_{n=0}^{N-1}x_ne^{-\frac{2\pi i}{N}kn},\quad k = 0, \dots, N-1&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt; \varepsilon_{N} = e^{-\frac{2\pi i}{N}}&amp;lt;/math&amp;gt;, тогда ДПФ можно перезаписать в матричной форме:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\bar X = A\bar x&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где матрица &amp;lt;math&amp;gt;A = \{e^{-\frac{2\pi i}{N}(i - 1)(j - 1)}\}_{i,j=1}^{N}&amp;lt;/math&amp;gt;&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Пусть, для простоты &amp;lt;math&amp;gt; N = km&amp;lt;/math&amp;gt;, тогда рекурсивная реализация преобразования Фурье, за счет &amp;lt;math&amp;gt;O(N{k})&amp;lt;/math&amp;gt; уровней рекурсии, имеет суммарную сложность &amp;lt;math&amp;gt;O(Nk + Nm + km) = O(N(k + m))&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В случае, например &amp;lt;math&amp;gt;N = 2^n&amp;lt;/math&amp;gt; сложность БПФ составляет &amp;lt;math&amp;gt;O(N\log{N})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В общем же случае, когда &amp;lt;math&amp;gt;N = \prod_{i=1}^np_i&amp;lt;/math&amp;gt; сложность БПФ составляет &amp;lt;math&amp;gt; O(N(\sum_{i=1}^np_i))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Макроструктура БПФ для случая &amp;lt;math&amp;gt;N = km&amp;lt;/math&amp;gt; описывается рекурсивно:&lt;br /&gt;
# &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; независимых преобразований векторов меньшей размерности &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;&lt;br /&gt;
#Умножение элементов на поворотные коэффициенты (&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; умножений)&lt;br /&gt;
# &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; обратных преобразований векторов размерностей &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Рекурсивный метод для случая &amp;lt;math&amp;gt;N = 2^k&amp;lt;/math&amp;gt;, без оптимизации на C++:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;lt;vector&amp;gt;&lt;br /&gt;
#include &amp;lt;complex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
typedef complex&amp;lt;double&amp;gt; cd;&lt;br /&gt;
typedef vector&amp;lt;cd&amp;gt; vcd;&lt;br /&gt;
&lt;br /&gt;
vcd fft(const vcd &amp;amp;as) { &lt;br /&gt;
  int n = as.size();&lt;br /&gt;
  if (n == 1) return vcd(1, as[0]);&lt;br /&gt;
&lt;br /&gt;
  vcd w(n); // Calculate roots&lt;br /&gt;
  for (int i = 0; i &amp;lt; n; i++) {&lt;br /&gt;
    double alpha = 2 * M_PI * i / n;&lt;br /&gt;
    w[i] = cd(cos(alpha), sin(alpha));&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  vcd A(n / 2), B(n / 2);&lt;br /&gt;
  for (int i = 0; i &amp;lt; n / 2; i++) {&lt;br /&gt;
    A[i] = as[i * 2];&lt;br /&gt;
    B[i] = as[i * 2 + 1];&lt;br /&gt;
  }&lt;br /&gt;
  vcd Av = fft(A);&lt;br /&gt;
  vcd Bv = fft(B);&lt;br /&gt;
  vcd res(n);&lt;br /&gt;
  for (int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
    res[i] =   Av[i % (n / 2)] +&lt;br /&gt;
        w[i] * Bv[i % (n / 2)];&lt;br /&gt;
  return res;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Алгоритм состоит из трех этапов, следовательно если &amp;lt;math&amp;gt;N = \prod_{i = 1}^np_i&amp;lt;/math&amp;gt;, то общая сложность составляет порядка &amp;lt;math&amp;gt;O(N\sum_{i=1}^np_i)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Пусть существует некоторое фиксированное число &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, такое что:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
p_i \leq P \quad \forall i = 1...n,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
тогда, учитывая, что &amp;lt;math&amp;gt;n \leq \log_{P}{N}&amp;lt;/math&amp;gt;, сложность алгоритма можно записать в виде &amp;lt;math&amp;gt;O(N\log{N})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[Файл:FourierGraph2.png|center|thumb|640px|&#039;&#039;&#039;Рисунок 1.&#039;&#039;&#039; Информационный граф преобразования Кули-Тьюки для &amp;lt;math&amp;gt;N = km = 25, k = 5, m = 5&amp;lt;/math&amp;gt;. Желтые вершины - умножение на поворотные множители.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Пусть имеется неограниченное число процессоров, тогда учитывая схему алгоритма БПФ, максимальное число одновременно работающих процессоров может составлять &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, тогда сложность алгоритма на &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; процессорах составит &amp;lt;math&amp;gt;\log{N}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>Chachba.A</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%91%D1%8B%D1%81%D1%82%D1%80%D0%BE%D0%B5_%D0%B4%D0%B8%D1%81%D0%BA%D1%80%D0%B5%D1%82%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%A4%D1%83%D1%80%D1%8C%D0%B5_(%D0%91%D0%9F%D0%A4)&amp;diff=7738</id>
		<title>Быстрое дискретное преобразование Фурье (БПФ)</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%91%D1%8B%D1%81%D1%82%D1%80%D0%BE%D0%B5_%D0%B4%D0%B8%D1%81%D0%BA%D1%80%D0%B5%D1%82%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%A4%D1%83%D1%80%D1%8C%D0%B5_(%D0%91%D0%9F%D0%A4)&amp;diff=7738"/>
		<updated>2016-10-14T16:03:52Z</updated>

		<summary type="html">&lt;p&gt;Chachba.A: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: [[Участник:Chachba.A|Чачба А.Н.]], [[Участник:Weasel|Костоев Р.С.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Быстрое преобразование Фурье (БПФ)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(N \log N)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\log N)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(N)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Преобразование Фурье - взаимно однозначное отображение одной функции вещественной, называемой таргетным сигналом, с другой функцией вещественной переменной, называемой образом Фурье или спектром исходной функции по формуле:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\hat{f}(\omega)=\frac{1}{\sqrt{2\pi}}\int\limits_{-\infty}^{\infty}f(x)e^{-ix\omega}\,dx&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Дискретное преобразование Фурье, в свою очередь, если аналог непрерывного преобразования Фурье, но для дискретного сигнала содержащего &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; отсчетов.&lt;br /&gt;
Широко применяет в цифровой обработке сигналов, теории вероятностей, криптографии и акустике.&lt;br /&gt;
Преобразование Фурье обратимо, причем обратное преобразование имеет практически ту же форму, что и прямое.&lt;br /&gt;
Преобразование Фурье имеет сложность &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt;, но существует быстрый вариант преобразование Фурье со сложностью &amp;lt;math&amp;gt;O(N\log{N})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть исходный сигнал имеет значения &amp;lt;math&amp;gt;x_n,\quad n = 0,\dots,N-1&amp;lt;/math&amp;gt;, тогда дискретное прямое преобразование Фурье (ДПФ) имеет вид:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
X_k = \sum_{n=0}^{N-1}x_ne^{-\frac{2\pi i}{N}kn},\quad k = 0, \dots, N-1&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt; \varepsilon_{N} = e^{-\frac{2\pi i}{N}}&amp;lt;/math&amp;gt;, тогда ДПФ можно перезаписать в матричной форме:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\bar X = A\bar x&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где матрица &amp;lt;math&amp;gt;A = \{e^{-\frac{2\pi i}{N}(i - 1)(j - 1)}\}_{i,j=1}^{N}&amp;lt;/math&amp;gt;&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Пусть, для простоты &amp;lt;math&amp;gt; N = km&amp;lt;/math&amp;gt;, тогда рекурсивная реализация преобразования Фурье, за счет &amp;lt;math&amp;gt;O(N{k})&amp;lt;/math&amp;gt; уровней рекурсии, имеет суммарную сложность &amp;lt;math&amp;gt;O(Nk + Nm + km) = O(N(k + m))&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В случае, например &amp;lt;math&amp;gt;N = 2^n&amp;lt;/math&amp;gt; сложность БПФ составляет &amp;lt;math&amp;gt;O(N\log{N})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В общем же случае, когда &amp;lt;math&amp;gt;N = \prod_{i=1}^np_i&amp;lt;/math&amp;gt; сложность БПФ составляет &amp;lt;math&amp;gt; O(N(\sum_{i=1}^np_i))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Макроструктура БПФ для случая &amp;lt;math&amp;gt;N = km&amp;lt;/math&amp;gt; описывается рекурсивно:&lt;br /&gt;
# &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; независимых преобразований векторов меньшей размерности &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;&lt;br /&gt;
#Умножение элементов на поворотные коэффициенты (&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; умножений)&lt;br /&gt;
# &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; обратных преобразований векторов размерностей &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Рекурсивный метод для случая &amp;lt;math&amp;gt;N = 2^k&amp;lt;/math&amp;gt;, без оптимизации на C++:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;lt;vector&amp;gt;&lt;br /&gt;
#include &amp;lt;complex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
typedef complex&amp;lt;double&amp;gt; cd;&lt;br /&gt;
typedef vector&amp;lt;cd&amp;gt; vcd;&lt;br /&gt;
&lt;br /&gt;
vcd fft(const vcd &amp;amp;as) { &lt;br /&gt;
  int n = as.size();&lt;br /&gt;
  if (n == 1) return vcd(1, as[0]);&lt;br /&gt;
&lt;br /&gt;
  vcd w(n); // Calculate roots&lt;br /&gt;
  for (int i = 0; i &amp;lt; n; i++) {&lt;br /&gt;
    double alpha = 2 * M_PI * i / n;&lt;br /&gt;
    w[i] = cd(cos(alpha), sin(alpha));&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  vcd A(n / 2), B(n / 2);&lt;br /&gt;
  for (int i = 0; i &amp;lt; n / 2; i++) {&lt;br /&gt;
    A[i] = as[i * 2];&lt;br /&gt;
    B[i] = as[i * 2 + 1];&lt;br /&gt;
  }&lt;br /&gt;
  vcd Av = fft(A);&lt;br /&gt;
  vcd Bv = fft(B);&lt;br /&gt;
  vcd res(n);&lt;br /&gt;
  for (int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
    res[i] =   Av[i % (n / 2)] +&lt;br /&gt;
        w[i] * Bv[i % (n / 2)];&lt;br /&gt;
  return res;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Алгоритм состоит из трех этапов, следовательно если &amp;lt;math&amp;gt;N = \prod_{i = 1}^np_i&amp;lt;/math&amp;gt;, то общая сложность составляет порядка &amp;lt;math&amp;gt;O(N\sum_{i=1}^np_i)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Пусть существует некоторое фиксированное число &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, такое что:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
p_i \leq P \quad \forall i = 1...n,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
тогда, учитывая, что &amp;lt;math&amp;gt;n \leq \log_{P}{N}&amp;lt;/math&amp;gt;, сложность алгоритма можно записать в виде &amp;lt;math&amp;gt;O(N\log{N})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[Файл:FourierGraph2.png|center|thumb|640px|&#039;&#039;&#039;Рисунок 1.&#039;&#039;&#039; Информационный граф преобразования Кули-Тьюки для &amp;lt;math&amp;gt;N = km = 25, k = 5, m = 5&amp;lt;/math&amp;gt;. Желтые вершины - умножение на поворотные множители.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Пусть имеется неограниченное число процессоров, тогда учитывая схему алгоритма БПФ, максимальное число одновременно работающих процессоров может составлять &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, тогда сложность алгоритма на &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; процессорах составит &amp;lt;math\log{N}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>Chachba.A</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%91%D1%8B%D1%81%D1%82%D1%80%D0%BE%D0%B5_%D0%B4%D0%B8%D1%81%D0%BA%D1%80%D0%B5%D1%82%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%A4%D1%83%D1%80%D1%8C%D0%B5_(%D0%91%D0%9F%D0%A4)&amp;diff=7726</id>
		<title>Быстрое дискретное преобразование Фурье (БПФ)</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%91%D1%8B%D1%81%D1%82%D1%80%D0%BE%D0%B5_%D0%B4%D0%B8%D1%81%D0%BA%D1%80%D0%B5%D1%82%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%A4%D1%83%D1%80%D1%8C%D0%B5_(%D0%91%D0%9F%D0%A4)&amp;diff=7726"/>
		<updated>2016-10-14T15:57:37Z</updated>

		<summary type="html">&lt;p&gt;Chachba.A: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: [[Участник:Chachba.A|Чачба А.Н.]], [[Участник:Weasel|Костоев Р.С.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Быстрое преобразование Фурье (БПФ)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(N \log N)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\log N)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(N)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Преобразование Фурье - взаимно однозначное отображение одной функции вещественной, называемой таргетным сигналом, с другой функцией вещественной переменной, называемой образом Фурье или спектром исходной функции по формуле:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\hat{f}(\omega)=\frac{1}{\sqrt{2\pi}}\int\limits_{-\infty}^{\infty}f(x)e^{-ix\omega}\,dx&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Дискретное преобразование Фурье, в свою очередь, если аналог непрерывного преобразования Фурье, но для дискретного сигнала содержащего &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; отсчетов.&lt;br /&gt;
Широко применяет в цифровой обработке сигналов, теории вероятностей, криптографии и акустике.&lt;br /&gt;
Преобразование Фурье обратимо, причем обратное преобразование имеет практически ту же форму, что и прямое.&lt;br /&gt;
Преобразование Фурье имеет сложность &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt;, но существует быстрый вариант преобразование Фурье со сложностью &amp;lt;math&amp;gt;O(N\log{N})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть исходный сигнал имеет значения &amp;lt;math&amp;gt;x_n,\quad n = 0,\dots,N-1&amp;lt;/math&amp;gt;, тогда дискретное прямое преобразование Фурье (ДПФ) имеет вид:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
X_k = \sum_{n=0}^{N-1}x_ne^{-\frac{2\pi i}{N}kn},\quad k = 0, \dots, N-1&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt; \varepsilon_{N} = e^{-\frac{2\pi i}{N}}&amp;lt;/math&amp;gt;, тогда ДПФ можно перезаписать в матричной форме:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\bar X = A\bar x&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где матрица &amp;lt;math&amp;gt;A = \{e^{-\frac{2\pi i}{N}(i - 1)(j - 1)}\}_{i,j=1}^{N}&amp;lt;/math&amp;gt;&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Пусть, для простоты &amp;lt;math&amp;gt; N = km&amp;lt;/math&amp;gt;, тогда рекурсивная реализация преобразования Фурье, за счет &amp;lt;math&amp;gt;O(N{k})&amp;lt;/math&amp;gt; уровней рекурсии, имеет суммарную сложность &amp;lt;math&amp;gt;O(Nk + Nm + km) = O(N(k + m))&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В случае, например &amp;lt;math&amp;gt;N = 2^n&amp;lt;/math&amp;gt; сложность БПФ составляет &amp;lt;math&amp;gt;O(N\log{N})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В общем же случае, когда &amp;lt;math&amp;gt;N = \prod_{i=1}^np_i&amp;lt;/math&amp;gt; сложность БПФ составляет &amp;lt;math&amp;gt; O(N(\sum_{i=1}^np_i))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Макроструктура БПФ для случая &amp;lt;math&amp;gt;N = km&amp;lt;/math&amp;gt; описывается рекурсивно:&lt;br /&gt;
# &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; независимых преобразований векторов меньшей размерности &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;&lt;br /&gt;
#Умножение элементов на поворотные коэффициенты (&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; умножений)&lt;br /&gt;
# &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; обратных преобразований векторов размерностей &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Рекурсивный метод для случая &amp;lt;math&amp;gt;N = 2^k&amp;lt;/math&amp;gt;, без оптимизации на C++:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;lt;vector&amp;gt;&lt;br /&gt;
#include &amp;lt;complex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
typedef complex&amp;lt;double&amp;gt; cd;&lt;br /&gt;
typedef vector&amp;lt;cd&amp;gt; vcd;&lt;br /&gt;
&lt;br /&gt;
vcd fft(const vcd &amp;amp;as) { &lt;br /&gt;
  int n = as.size();&lt;br /&gt;
  if (n == 1) return vcd(1, as[0]);&lt;br /&gt;
&lt;br /&gt;
  vcd w(n); // Calculate roots&lt;br /&gt;
  for (int i = 0; i &amp;lt; n; i++) {&lt;br /&gt;
    double alpha = 2 * M_PI * i / n;&lt;br /&gt;
    w[i] = cd(cos(alpha), sin(alpha));&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  vcd A(n / 2), B(n / 2);&lt;br /&gt;
  for (int i = 0; i &amp;lt; n / 2; i++) {&lt;br /&gt;
    A[i] = as[i * 2];&lt;br /&gt;
    B[i] = as[i * 2 + 1];&lt;br /&gt;
  }&lt;br /&gt;
  vcd Av = fft(A);&lt;br /&gt;
  vcd Bv = fft(B);&lt;br /&gt;
  vcd res(n);&lt;br /&gt;
  for (int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
    res[i] =   Av[i % (n / 2)] +&lt;br /&gt;
        w[i] * Bv[i % (n / 2)];&lt;br /&gt;
  return res;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Алгоритм состоит из трех этапов, следовательно если &amp;lt;math&amp;gt;N = \prod_{i = 1}^np_i&amp;lt;/math&amp;gt;, то общая сложность составляет порядка &amp;lt;math&amp;gt;O(N\sum_{i=1}^np_i)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Пусть существует некоторое фиксированное число &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, такое что:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
p_i \leq P \quad \forall i = 1...n,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
тогда, учитывая, что &amp;lt;math&amp;gt;n \leq \log_{P}{N}&amp;lt;/math&amp;gt;, сложность алгоритма можно записать в виде &amp;lt;math&amp;gt;O(N\log{N})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[Файл:FourierGraph2.png|center|thumb|640px|&#039;&#039;&#039;Рисунок 1.&#039;&#039;&#039; Информационный граф преобразования Кули-Тьюки для &amp;lt;math&amp;gt;N = km = 25, k = 5, m = 5&amp;lt;/math&amp;gt;. Желтые вершины - умножение на поворотные множители.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>Chachba.A</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%91%D1%8B%D1%81%D1%82%D1%80%D0%BE%D0%B5_%D0%B4%D0%B8%D1%81%D0%BA%D1%80%D0%B5%D1%82%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%A4%D1%83%D1%80%D1%8C%D0%B5_(%D0%91%D0%9F%D0%A4)&amp;diff=6061</id>
		<title>Быстрое дискретное преобразование Фурье (БПФ)</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%91%D1%8B%D1%81%D1%82%D1%80%D0%BE%D0%B5_%D0%B4%D0%B8%D1%81%D0%BA%D1%80%D0%B5%D1%82%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%A4%D1%83%D1%80%D1%8C%D0%B5_(%D0%91%D0%9F%D0%A4)&amp;diff=6061"/>
		<updated>2016-10-12T20:31:22Z</updated>

		<summary type="html">&lt;p&gt;Chachba.A: Новая страница: «Авторы: Чачба А.Н., Костоев Р.С.  {{algorithm | name              = Быстро…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: [[Участник:Chachba.A|Чачба А.Н.]], [[Участник:Weasel|Костоев Р.С.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Быстрое преобразование Фурье (БПФ)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(N \log N)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\log N)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(N)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Преобразование Фурье - взаимно однозначное отображение одной функции вещественной, называемой таргетным сигналом, с другой функцией вещественной переменной, называемой образом Фурье или спектром исходной функции по формуле:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\hat{f}(\omega)=\frac{1}{\sqrt{2\pi}}\int\limits_{-\infty}^{\infty}f(x)e^{-ix\omega}\,dx&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Дискретное преобразование Фурье, в свою очередь, если аналог непрерывного преобразования Фурье, но для дискретного сигнала содержащего &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; отсчетов.&lt;br /&gt;
Широко применяет в цифровой обработке сигналов, теории вероятностей, криптографии и акустике.&lt;br /&gt;
Преобразование Фурье обратимо, причем обратное преобразование имеет практически ту же форму, что и прямое.&lt;br /&gt;
Преобразование Фурье имеет сложность &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt;, но существует быстрый вариант преобразование Фурье со сложностью &amp;lt;math&amp;gt;O(N\log{N})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть исходный сигнал имеет значения &amp;lt;math&amp;gt;x_n,\quad n = 0,\dots,N-1&amp;lt;/math&amp;gt;, тогда дискретное прямое преобразование Фурье (ДПФ) имеет вид:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
X_k = \sum_{n=0}^{N-1}x_ne^{-\frac{2\pi i}{N}kn},\quad k = 0, \dots, N-1&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt; \varepsilon_{N} = e^{-\frac{2\pi i}{N}}&amp;lt;/math&amp;gt;, тогда ДПФ можно перезаписать в матричной форме:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\bar X = A\bar x&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где матрица &amp;lt;math&amp;gt;A = \{e^{-\frac{2\pi i}{N}(i - 1)(j - 1)}\}_{i,j=1}^{N}&amp;lt;/math&amp;gt;&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>Chachba.A</name></author>
	</entry>
</feed>