<?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/index.php?action=history&amp;feed=atom&amp;title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%3A1</id>
	<title>Участник:1 - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?action=history&amp;feed=atom&amp;title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%3A1"/>
	<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:1&amp;action=history"/>
	<updated>2026-10-22T21:53:28Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:1&amp;diff=8373&amp;oldid=prev</id>
		<title>Vagabond: Vagabond переименовал страницу Участник:Данилишин Артем/Алгоритм быстрого дискретного пребразования Фурье в Участник:1</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:1&amp;diff=8373&amp;oldid=prev"/>
		<updated>2016-10-14T22:05:01Z</updated>

		<summary type="html">&lt;p&gt;Vagabond переименовал страницу &lt;a href=&quot;/ru/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%94%D0%B0%D0%BD%D0%B8%D0%BB%D0%B8%D1%88%D0%B8%D0%BD_%D0%90%D1%80%D1%82%D0%B5%D0%BC/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B1%D1%8B%D1%81%D1%82%D1%80%D0%BE%D0%B3%D0%BE_%D0%B4%D0%B8%D1%81%D0%BA%D1%80%D0%B5%D1%82%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BF%D1%80%D0%B5%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%A4%D1%83%D1%80%D1%8C%D0%B5&quot; class=&quot;mw-redirect&quot; title=&quot;Участник:Данилишин Артем/Алгоритм быстрого дискретного пребразования Фурье&quot;&gt;Участник:Данилишин Артем/Алгоритм быстрого дискретного пребразования Фурье&lt;/a&gt; в &lt;a href=&quot;/ru/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:1&quot; title=&quot;Участник:1&quot;&gt;Участник:1&lt;/a&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Предыдущая версия&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Версия от 22:05, 14 октября 2016&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;ru&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(нет различий)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Vagabond</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:1&amp;diff=8350&amp;oldid=prev</id>
		<title>Vagabond: Полностью удалено содержимое страницы</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:1&amp;diff=8350&amp;oldid=prev"/>
		<updated>2016-10-14T21:57:33Z</updated>

		<summary type="html">&lt;p&gt;Полностью удалено содержимое страницы&lt;/p&gt;
&lt;a href=&quot;https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:1&amp;amp;diff=8350&amp;amp;oldid=7892&quot;&gt;Внесённые изменения&lt;/a&gt;</summary>
		<author><name>Vagabond</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:1&amp;diff=7892&amp;oldid=prev</id>
		<title>Vagabond: /* ЧАСТЬ. Свойства и структура алгоритмов */</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:1&amp;diff=7892&amp;oldid=prev"/>
		<updated>2016-10-14T18:23:45Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;ЧАСТЬ. Свойства и структура алгоритмов&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Предыдущая версия&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Версия от 18:23, 14 октября 2016&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot;&gt;Строка 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= ЧАСТЬ. Свойства и структура алгоритмов =&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;{{Assignment}}&lt;/ins&gt;= ЧАСТЬ. Свойства и структура алгоритмов =&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Свойства и структура алгоритма ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Свойства и структура алгоритма ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Vagabond</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:1&amp;diff=7890&amp;oldid=prev</id>
		<title>Vagabond: /* Масштабируемость алгоритма и его реализации */</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:1&amp;diff=7890&amp;oldid=prev"/>
		<updated>2016-10-14T18:22:25Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Масштабируемость алгоритма и его реализации&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Предыдущая версия&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Версия от 18:22, 14 октября 2016&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l221&quot;&gt;Строка 221:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 221:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= ЧАСТЬ. Программная реализация алгоритма =&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= ЧАСТЬ. Программная реализация алгоритма =&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Масштабируемость алгоритма и его реализации ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Масштабируемость алгоритма и его реализации ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[file:масш.jpg|center|thumb|1000px|Рисунок 3. Параллельная реализация алгоритма. Изменение эффективности(%)в зависимости от числа процессоров и &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;размера области&lt;/del&gt;.]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[file:масш.jpg|center|thumb|1000px|Рисунок 3. Параллельная реализация алгоритма. Изменение эффективности(%)в зависимости от числа процессоров и &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;размерности&lt;/ins&gt;.]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Как описывалось выше, каждый процессор получает достаточно низкий объем работы, что приводит к неэффективному распараллеливанию алгоритма (высокие затраты на передачу данных между процессорами по сравнению с вычислениями на них). Поэтому необходимо находить оптимальное количество процессоров для каждой отдельно взятой задачи. В данном примере, при размерности входного сигнала менее 262144, оптимальное количество процессоров составляет 1. При размерности 262144-4194304 оптимум достигался при 8 процессорах. И при размерности более 4194304- 16 процессоров. Вычисления проводились на суперкомпьютере «Ломоносов».  &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Как описывалось выше, каждый процессор получает достаточно низкий объем работы, что приводит к неэффективному распараллеливанию алгоритма (высокие затраты на передачу данных между процессорами по сравнению с вычислениями на них). Поэтому необходимо находить оптимальное количество процессоров для каждой отдельно взятой задачи. В данном примере, при размерности входного сигнала менее 262144, оптимальное количество процессоров составляет 1. При размерности 262144-4194304 оптимум достигался при 8 процессорах. И при размерности более 4194304- 16 процессоров. Вычисления проводились на суперкомпьютере «Ломоносов».&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Существующие реализации алгоритма ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Существующие реализации алгоритма ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Самой распространенной и известной реализацией дискретного БПФ является библиотека [http://www.fftw.org/ FFTW], разработанная Маттео Фриго и Стивеном Г. Джонсоном в Массачусетском технологическом институте. Данная библиотека существует для языков C и FORTRAN и позволяет производить вычисления в одном или нескольких измерениях. Входной сигнал может быть как действительным так и комплексным, а его размерность не обязательно должна быть степенью двойки. На данный момент последняя версия FFTW 3.3.5. Другие особенности библиотеки:&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Самой распространенной и известной реализацией дискретного БПФ является библиотека [http://www.fftw.org/ FFTW], разработанная Маттео Фриго и Стивеном Г. Джонсоном в Массачусетском технологическом институте. Данная библиотека существует для языков C и FORTRAN и позволяет производить вычисления в одном или нескольких измерениях. Входной сигнал может быть как действительным так и комплексным, а его размерность не обязательно должна быть степенью двойки. На данный момент последняя версия FFTW 3.3.5. Другие особенности библиотеки:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Vagabond</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:1&amp;diff=7889&amp;oldid=prev</id>
		<title>Vagabond: /* Свойства алгоритма */</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:1&amp;diff=7889&amp;oldid=prev"/>
		<updated>2016-10-14T18:20:21Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Свойства алгоритма&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Предыдущая версия&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Версия от 18:20, 14 октября 2016&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l211&quot;&gt;Строка 211:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 211:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Данные могут быть как действительными так и комплексными.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Данные могут быть как действительными так и комплексными.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== Свойства алгоритма ===&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== Свойства алгоритма ===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;*Соотношение последовательной и параллельной сложности является &#039;&#039;линейным&#039;&#039;. Это хорошо видно из пункта [[#&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;ЧАСТЬ. &lt;/del&gt;Ресурс параллелизма алгоритма|ресурс параллелизма алгоритма]].&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;*Соотношение последовательной и параллельной сложности является &#039;&#039;линейным&#039;&#039;. Это хорошо видно из пункта [[#Ресурс параллелизма алгоритма|ресурс параллелизма алгоритма]].&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;*Вычислительная мощность алгоритма является &amp;#039;&amp;#039;логарифмической&amp;#039;&amp;#039;.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;*Вычислительная мощность алгоритма является &amp;#039;&amp;#039;логарифмической&amp;#039;&amp;#039;.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;*Устойчивость.  &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;*Устойчивость.  &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l218&quot;&gt;Строка 218:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 218:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;*алгоритм полностью детерминирован.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;*алгоритм полностью детерминирован.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;*Степень исхода вершины информационного графа не превышает двух.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;*Степень исхода вершины информационного графа не превышает двух.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= ЧАСТЬ. Программная реализация алгоритма =&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= ЧАСТЬ. Программная реализация алгоритма =&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Масштабируемость алгоритма и его реализации ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Масштабируемость алгоритма и его реализации ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Vagabond</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:1&amp;diff=7885&amp;oldid=prev</id>
		<title>Vagabond: /* Математическое описание алгоритма */</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:1&amp;diff=7885&amp;oldid=prev"/>
		<updated>2016-10-14T18:19:14Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Математическое описание алгоритма&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Предыдущая версия&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Версия от 18:19, 14 октября 2016&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l40&quot;&gt;Строка 40:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 40:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;Вычисление БПФ&amp;#039;&amp;#039;&amp;#039;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;Вычисление БПФ&amp;#039;&amp;#039;&amp;#039;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;После выполнения этапа бит-реверсирования выполняются вычисления проиллюстрированные &#039;&#039;на рисунке 2&#039;&#039; в разделе [[#&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;ЧАСТЬ. &lt;/del&gt;Информационный граф|Информационный граф]]. Рисунок 2 приведен для случая четырехмерного входного сигнала. Он предполагает совершение двух этапов. В общем же количество этапов равно &amp;lt;math&amp;gt;log_{2}n&amp;lt;/math&amp;gt;. Каждый этап содержит в себе вычисление одной и той же операции &quot;бабочки&quot;. Где на вход подаются два числа &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, на выходе же получаются &amp;lt;math&amp;gt;a+bU&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a-bU&amp;lt;/math&amp;gt;. Где &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;- это &#039;&#039;коэффициент поворота&#039;&#039;. Общая формула для коэффициента поворота: &amp;lt;math&amp;gt;e^{\frac{-ji\pi}{k}}&amp;lt;/math&amp;gt;. Где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;- размер шага &quot;бабочки&quot;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;- номер итерации вычислений над группой элементов, размером &amp;lt;math&amp;gt;2k&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;(0\leq j &amp;lt; k )&amp;lt;/math&amp;gt;.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;После выполнения этапа бит-реверсирования выполняются вычисления проиллюстрированные &#039;&#039;на рисунке 2&#039;&#039; в разделе [[#Информационный граф|Информационный граф]]. Рисунок 2 приведен для случая четырехмерного входного сигнала. Он предполагает совершение двух этапов. В общем же количество этапов равно &amp;lt;math&amp;gt;log_{2}n&amp;lt;/math&amp;gt;. Каждый этап содержит в себе вычисление одной и той же операции &quot;бабочки&quot;. Где на вход подаются два числа &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, на выходе же получаются &amp;lt;math&amp;gt;a+bU&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a-bU&amp;lt;/math&amp;gt;. Где &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;- это &#039;&#039;коэффициент поворота&#039;&#039;. Общая формула для коэффициента поворота: &amp;lt;math&amp;gt;e^{\frac{-ji\pi}{k}}&amp;lt;/math&amp;gt;. Где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;- размер шага &quot;бабочки&quot;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;- номер итерации вычислений над группой элементов, размером &amp;lt;math&amp;gt;2k&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;(0\leq j &amp;lt; k )&amp;lt;/math&amp;gt;.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== Вычислительное ядро алгоритма ===&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== Вычислительное ядро алгоритма ===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Vagabond</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:1&amp;diff=7876&amp;oldid=prev</id>
		<title>Vagabond: Новая страница: «= ЧАСТЬ. Свойства и структура алгоритмов = == Свойства и структура алгоритма ==  === Общее опи…»</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:1&amp;diff=7876&amp;oldid=prev"/>
		<updated>2016-10-14T18:11:02Z</updated>

		<summary type="html">&lt;p&gt;Новая страница: «= ЧАСТЬ. Свойства и структура алгоритмов = == Свойства и структура алгоритма ==  === Общее опи…»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Главная идея БПФ состоит в сокращении многочисленных повторов сложения и умножения, которые выполняются в ДПФ (повторяющиеся множители: &amp;lt;math&amp;gt;e^{\frac{-2kpi\pi}{n}}&amp;lt;/math&amp;gt; Например при условии, что  &amp;lt;math&amp;gt;(pk)mod(n)=const&amp;lt;/math&amp;gt;, при всех &amp;lt;math&amp;gt;k=\overline{0,n-1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p=\overline{0,n-1}&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Напомним формулу ДПФ: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_{p}=\sum_{k=0}^{n-1}x_{k}e^{\frac{-2kpi\pi}{n}}, p=\overline{0,n-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
За счет использования данного факта, происходит значительное сокращение количества вычислительных операций. В данной статье используется алгоритм Cooley – Tukey, который предполагает собой разбиение исходного множества входных сигналов на два равных подмножества. При этом множество входных сигналов должно быть степенью двойки. Далее операция деления множества продолжается для образовавшихся подмножеств, и так далее. В результате над каждым из полученных подмножеств выполняется БПФ. Данные вычисления можно выполнять независимо друг от друга. Этот факт используется для реализации параллельной версии алгоритма. В общем алгоритм Cooley – Tukey строится из двух основных шагов:&lt;br /&gt;
&lt;br /&gt;
* Преобразование входного массива данных (бит-реверсирование).&lt;br /&gt;
* Вычисление БПФ.&lt;br /&gt;
Приведем более детальное описание БПФ (математическое описание):&lt;br /&gt;
*Пусть &amp;lt;math&amp;gt;e^{\frac{-2kpi\pi}{n}}&amp;lt;/math&amp;gt; = &amp;lt;math&amp;gt;\omega _{n}^{kp}&amp;lt;/math&amp;gt;.&lt;br /&gt;
*Разобьем исходный сигнал &amp;lt;math&amp;gt;x(n)&amp;lt;/math&amp;gt; на два подмножества, с четными &amp;lt;math&amp;gt;x_{1}(2n)&amp;lt;/math&amp;gt; и нечетными &amp;lt;math&amp;gt;x_{2}(2n+1)&amp;lt;/math&amp;gt; номерами.&lt;br /&gt;
Тогда получаем: &amp;lt;math&amp;gt;y_{p}=\sum_{k=0}^{n-1}x_{k}\omega _{n}^{kp}= \sum_{k=0}^{\frac{n}{2}-1}x_{2k}\omega _{n}^{2kp}+\sum_{k=0}^{\frac{n}{2}-1}x_{2k+1}\omega _{n}^{(2k+1)p}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выпишем два свойства омеги:&lt;br /&gt;
*&amp;lt;math&amp;gt;\omega_{\frac{n}{2}}=e^{2(\frac{-2i\pi}{n})}=\omega_{n}^{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\omega_{n}^{\frac{n}{2}}=e^{\frac{-2ni\pi}{2n}}=e^{-i\pi}=-1&amp;lt;/math&amp;gt;&lt;br /&gt;
Воспользуемся первым: &amp;lt;math&amp;gt;y_{p}= \sum_{k=0}^{\frac{n}{2}-1}x_{2k}\omega _{n}^{2kp}+\omega_{n}^{p}\sum_{k=0}^{\frac{n}{2}-1}x_{2k+1}\omega _{n}^{2kp}=\sum_{k=0}^{\frac{n}{2}-1}x_{2k}\omega _{\frac{n}{2}}^{kp}+\omega_{n}^{p}\sum_{k=0}^{\frac{n}{2}-1}x_{2k+1}\omega _{\frac{n}{2}}^{kp}&amp;lt;/math&amp;gt;. Или, если обозначить &amp;lt;math&amp;gt;y_{1}(p)=\sum_{k=0}^{\frac{n}{2}-1}x_{2k}\omega _{\frac{n}{2}}^{kp}&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;y_{2}(p)=\sum_{k=0}^{\frac{n}{2}-1}x_{2k+1}\omega _{\frac{n}{2}}^{kp}&amp;lt;/math&amp;gt;, то получим формулу для вычисления координат изображения БПФ при &amp;lt;math&amp;gt;p=\overline{0...n/2}&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;y_(p)=y_{1}(p)+\omega_{n}^{p}y_{2}(p)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;y(p); y_{1}(p); y_{2}(p)&amp;lt;/math&amp;gt; обладают свойством периодичности, с периодом &amp;lt;math&amp;gt;\frac{n}{2}&amp;lt;/math&amp;gt;. Покажем это для &amp;lt;math&amp;gt;y_{1}(p)&amp;lt;/math&amp;gt; : &amp;lt;math&amp;gt;y_{1}(p+\frac{n}{2})=\sum_{k=0}^{\frac{n}{2}-1}x_{2k}\omega_{\frac{n}{2}}^{k(p+\frac{n}{2})}=\sum_{k=0}^{\frac{n}{2}-1}x_{2k}\omega_{\frac{n}{2}}^{kp}\omega_{\frac{n}{2}}^{\frac{kn}{2}}=\sum_{k=0}^{\frac{n}{2}-1}x_{2k}\omega_{\frac{n}{2}}^{kp}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как: &amp;lt;math&amp;gt;\omega_{\frac{n}{2}}^{\frac{kn}{2}}=e^{\frac{-4kni\pi}{2n}}=e^{-2ki\pi}=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее необходимо определить &amp;lt;math&amp;gt;y(p)&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;p\geq \frac{n}{2}&amp;lt;/math&amp;gt;. Теперь воспользуемся свойством периодичности обнаруженными нами ранее: &amp;lt;math&amp;gt;y(p+\frac{n}{2})=y_{1}(p+\frac{n}{2})+\omega_{n}^{(p+\frac{n}{2})}y_{2}(p+\frac{n}{2})&amp;lt;/math&amp;gt;. Воспользуемся вторым свойством омеги: &amp;lt;math&amp;gt;y(p)=y_{1}(p)-\omega_{n}^{p}y_{2}(p)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В конечном итоге мы пришли к конечной формуле для первого этапа вычисления БПФ. Дальнейшие этапы делят подмножества полученные на предыдущим этапе вычисления БПФ.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Бит-реверсирование&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Бит-реверсирование – это преобразование двоичного числа путем изменения порядка следования бит в нем на противоположный. Бит-реверсирование применимо только к индексам элементов массива и предназначено для изменения порядка следования этих элементов, при этом значения самих элементов не изменяются. Так, к примеру, четырехмерный вектор &amp;lt;math&amp;gt;(x_{0},x_{1},x_{2},x_{3})&amp;lt;/math&amp;gt; изменится на &amp;lt;math&amp;gt;(x_{0},x_{2},x_{1},x_{3})&amp;lt;/math&amp;gt;. Данная процедура необходима для разделения исходного сигнала на элементы подмножеств с четными и нечетными номерами, которые необходимы для вычисления &amp;lt;math&amp;gt;y_{1}(p)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;y_{2}(p)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Вычисление БПФ&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
После выполнения этапа бит-реверсирования выполняются вычисления проиллюстрированные &amp;#039;&amp;#039;на рисунке 2&amp;#039;&amp;#039; в разделе [[#ЧАСТЬ. Информационный граф|Информационный граф]]. Рисунок 2 приведен для случая четырехмерного входного сигнала. Он предполагает совершение двух этапов. В общем же количество этапов равно &amp;lt;math&amp;gt;log_{2}n&amp;lt;/math&amp;gt;. Каждый этап содержит в себе вычисление одной и той же операции &amp;quot;бабочки&amp;quot;. Где на вход подаются два числа &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, на выходе же получаются &amp;lt;math&amp;gt;a+bU&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a-bU&amp;lt;/math&amp;gt;. Где &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;- это &amp;#039;&amp;#039;коэффициент поворота&amp;#039;&amp;#039;. Общая формула для коэффициента поворота: &amp;lt;math&amp;gt;e^{\frac{-ji\pi}{k}}&amp;lt;/math&amp;gt;. Где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;- размер шага &amp;quot;бабочки&amp;quot;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;- номер итерации вычислений над группой элементов, размером &amp;lt;math&amp;gt;2k&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;(0\leq j &amp;lt; k )&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из двух вышеописанных этапов БПФ, бит-реверсирование является самым быстровыполнимым. Поэтому вычислительное ядро алгоритма будет лежать именно во втором этапе. А именно, им будет являться вычисление &amp;quot;бабочек&amp;quot;. Количество этапов выполнения БПФ, как описывалось выше, равно &amp;lt;math&amp;gt;log_{2}n&amp;lt;/math&amp;gt;. Учитывая количество этапов, размерность входного сигнала и идею деления на подмножества, всего &amp;quot;бабочек&amp;quot; получается &amp;lt;math&amp;gt;\frac{nlog_{2}n}{2}&amp;lt;/math&amp;gt;. При этом операция умножения выполняется &amp;lt;math&amp;gt;\frac{n}{2}&amp;lt;/math&amp;gt; раз. Это связано с тем, что результаты вычисления &amp;quot;бабочки&amp;quot; &amp;lt;math&amp;gt;a+bU&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a-bU&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из всего вышесказанного заключаем, что макроструктуру алгоритма легче всего описать при помощи рекурсии: &lt;br /&gt;
*&amp;lt;math&amp;gt;\frac{n}{2}&amp;lt;/math&amp;gt; преобразований Фурье порядка 2&lt;br /&gt;
*умножение &amp;lt;math&amp;gt;\frac{n}{2}&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;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Программный код (описан на языке С++) строится из ряда функций:&lt;br /&gt;
*бит-реверсирование&lt;br /&gt;
*инициализация размерности входного сигнала &lt;br /&gt;
*инициализация входного сигнала (при помощи генератора случайных чисел)&lt;br /&gt;
*процесс очистки памяти&lt;br /&gt;
*выполнение операции &amp;quot;бабочка&amp;quot;&lt;br /&gt;
*выполнение БПФ&lt;br /&gt;
*функция вывода результата (для тестирования)&lt;br /&gt;
----&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;главный программный код БПФ:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;С++&amp;quot;&amp;gt;&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
	complex&amp;lt;double&amp;gt; *inputSignal = NULL;   &lt;br /&gt;
	complex&amp;lt;double&amp;gt; *outputSignal = NULL; &lt;br /&gt;
	int size = 0;&lt;br /&gt;
	cout &amp;lt;&amp;lt; &amp;quot;FFT. Serial version.&amp;quot; &amp;lt;&amp;lt; endl;       &lt;br /&gt;
	ProcessInitialization(inputSignal, outputSignal, size);&lt;br /&gt;
	bit(inputSignal, outputSignal, size);&lt;br /&gt;
	SerialFFTCalculation(outputSignal, size);&lt;br /&gt;
	PrintSignal(outputSignal, size); //в случае тестирования&lt;br /&gt;
	ProcessTermination(inputSignal, outputSignal);&lt;br /&gt;
	cin.get();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
==== функция бит-реверсирования ====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;С++&amp;quot;&amp;gt;&lt;br /&gt;
void bit(complex&amp;lt;double&amp;gt; inputSignal[], complex&amp;lt;double&amp;gt; *outputSignal, int size)&lt;br /&gt;
{ // процесс бит-реверсирования&lt;br /&gt;
	int j = 0, i = 0;&lt;br /&gt;
	while (i &amp;lt; size) &lt;br /&gt;
	{&lt;br /&gt;
		if (j &amp;gt; i) &lt;br /&gt;
		{ &lt;br /&gt;
			outputSignal[i] = inputSignal[j];       &lt;br /&gt;
			outputSignal[j] = inputSignal[i]; &lt;br /&gt;
		}&lt;br /&gt;
		else       &lt;br /&gt;
			if (j == i)          &lt;br /&gt;
				outputSignal[i] = inputSignal[i];&lt;br /&gt;
		&lt;br /&gt;
		int m = size &amp;gt;&amp;gt; 1;     &lt;br /&gt;
		while ((m &amp;gt;= 1) &amp;amp;&amp;amp; (j &amp;gt;= m)) &lt;br /&gt;
		{ &lt;br /&gt;
			j -= m;       &lt;br /&gt;
			m = m &amp;gt;&amp;gt; 1; &lt;br /&gt;
		}     &lt;br /&gt;
		j += m;     &lt;br /&gt;
		i++;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==== инициализация размерности входного сигнала ====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;С++&amp;quot;&amp;gt;&lt;br /&gt;
void ProcessInitialization(complex&amp;lt;double&amp;gt;* &amp;amp;inputSignal, complex&amp;lt;double&amp;gt;* &amp;amp;outputSignal, int &amp;amp;size) &lt;br /&gt;
{&lt;br /&gt;
	// инициализация размера входного сигнала  &lt;br /&gt;
	do&lt;br /&gt;
	{&lt;br /&gt;
		cout &amp;lt;&amp;lt; &amp;quot;Enter the input signal length: &amp;quot;;&lt;br /&gt;
		cin &amp;gt;&amp;gt; size;&lt;br /&gt;
		if (size &amp;lt; 4)&lt;br /&gt;
			cout &amp;lt;&amp;lt; &amp;quot;Input signal length should be &amp;gt;= 4&amp;quot; &amp;lt;&amp;lt; endl;&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			int tmpSize = size;&lt;br /&gt;
			while (tmpSize != 1)&lt;br /&gt;
			{&lt;br /&gt;
				if (tmpSize % 2 != 0)&lt;br /&gt;
				{&lt;br /&gt;
					cout &amp;lt;&amp;lt; &amp;quot;Input signal length should be powers of two&amp;quot; &amp;lt;&amp;lt; endl;&lt;br /&gt;
					size = -1;&lt;br /&gt;
					break;&lt;br /&gt;
				}&lt;br /&gt;
				tmpSize /= 2;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	while (size &amp;lt; 4);  &lt;br /&gt;
	cout &amp;lt;&amp;lt; &amp;quot;Input signal length = &amp;quot; &amp;lt;&amp;lt; size &amp;lt;&amp;lt; endl; &lt;br /&gt;
	inputSignal = new complex&amp;lt;double&amp;gt;[size];   &lt;br /&gt;
	outputSignal = new complex&amp;lt;double&amp;gt;[size];&lt;br /&gt;
	DummyDataInitialization(inputSignal, size);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==== инициализация входного сигнала ====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;С++&amp;quot;&amp;gt;&lt;br /&gt;
void DummyDataInitialization(complex&amp;lt;double&amp;gt;* mas, int size)&lt;br /&gt;
{	&lt;br /&gt;
	for (int i = 0; i &amp;lt; size; i++)&lt;br /&gt;
	{&lt;br /&gt;
		mas[i] = int(rand() % 100);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==== процесс очистки памяти ====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;С++&amp;quot;&amp;gt;&lt;br /&gt;
void ProcessTermination(complex&amp;lt;double&amp;gt;* &amp;amp;inputSignal, complex&amp;lt;double&amp;gt;* &amp;amp;outputSignal) &lt;br /&gt;
{ &lt;br /&gt;
	//очистка памяти&lt;br /&gt;
	delete[] inputSignal;   &lt;br /&gt;
	inputSignal = NULL;   &lt;br /&gt;
	delete[] outputSignal;   &lt;br /&gt;
	outputSignal = NULL; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==== выполнение операции &amp;quot;бабочка&amp;quot; ====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;С++&amp;quot;&amp;gt;&lt;br /&gt;
void Butterfly(complex&amp;lt;double&amp;gt; *signal, complex&amp;lt;double&amp;gt; &amp;amp;u,int offset, int butterflySize)&lt;br /&gt;
{&lt;br /&gt;
	complex&amp;lt;double&amp;gt; tem = signal[offset + butterflySize] * u;&lt;br /&gt;
	signal[offset + butterflySize] = signal[offset] - tem;   &lt;br /&gt;
	signal[offset] += tem;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==== выполнение БПФ ====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;С++&amp;quot;&amp;gt;&lt;br /&gt;
void SerialFFTCalculation(complex&amp;lt;double&amp;gt; *signal, int size) &lt;br /&gt;
{&lt;br /&gt;
	int m = 0;   &lt;br /&gt;
	for (int tmp_size = size; tmp_size &amp;gt; 1; tmp_size /= 2, m++);&lt;br /&gt;
	for (int p = 0; p &amp;lt; m; p++)&lt;br /&gt;
	{&lt;br /&gt;
		int butterflyOffset = 1 &amp;lt;&amp;lt; (p + 1);&lt;br /&gt;
		int butterflySize = butterflyOffset &amp;gt;&amp;gt; 1;&lt;br /&gt;
		double coeff = M_PI / butterflySize;&lt;br /&gt;
&lt;br /&gt;
		for (int i = 0; i &amp;lt; size / butterflyOffset; i++)&lt;br /&gt;
			for (int j = 0; j &amp;lt; butterflySize; j++)&lt;br /&gt;
				Butterfly(signal,complex&amp;lt;double&amp;gt;(cos(-j*coeff),sin(-j*coeff)),j+i*butterflyOffset,butterflySize);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==== функция вывода результата (для тестирования) ====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;С++&amp;quot;&amp;gt;&lt;br /&gt;
void PrintSignal(complex&amp;lt;double&amp;gt; *signal, int size) &lt;br /&gt;
{&lt;br /&gt;
	cout &amp;lt;&amp;lt; &amp;quot;Result signal&amp;quot; &amp;lt;&amp;lt; endl;   &lt;br /&gt;
	for (int i = 0; i &amp;lt; size; i++)     &lt;br /&gt;
		cout &amp;lt;&amp;lt; signal[i] &amp;lt;&amp;lt; endl;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Рассмотренный алгоритм  Cooley – Tukey выполняется за &amp;lt;math&amp;gt;nlog_{2}n&amp;lt;/math&amp;gt; операций комплексного сложения и &amp;lt;math&amp;gt;\frac{n}{2}log_{2}n&amp;lt;/math&amp;gt; операций комплексного умножения. Таким образом последовательная сложность алгоритма является &amp;#039;&amp;#039;&amp;#039;линейно-логарифмической&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[file:Граф.jpg|center|thumb|800px|Рисунок 1. Алгоритм Cooley – Tukey для n=4, при предварительно сделанном бит-реверсировании]]&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
[[file:Парал.jpg|center|thumb|800px|Рисунок 2. Распараллеливание алгоритма Cooley – Tukey для n=8]]&lt;br /&gt;
Рисунок 2 получен из информационного графа, главной идеей которого является процедура деления множеств полученных на предыдущем шаге на два равных по мощности подмножества и применение к ним БПФ. То есть процесс вычисления распределяется между &amp;lt;math&amp;gt;\frac{n}{2}&amp;lt;/math&amp;gt; процессорами. И так как при последовательной реализации алгоритма было &amp;lt;math&amp;gt;\frac{n}{2}\log_{2}n&amp;lt;/math&amp;gt; операций комплексного умножения и &amp;lt;math&amp;gt;n\log_{2}n&amp;lt;/math&amp;gt; комплексного сложения/вычитания. Получается, что при параллельной реализации алгоритма мы будем иметь &amp;lt;math&amp;gt;\log_{2}n&amp;lt;/math&amp;gt; операций комплексного умножения и &amp;lt;math&amp;gt;2\log_{2}n&amp;lt;/math&amp;gt; комплексного сложения/вычитания. При этом, если используется функция HT(Hyper threading), то параллельная сложность быстрого преобразования Фурье (базовый алгоритм Кули-Тьюки) для векторов с длиной, равной степени двойки составляет &amp;lt;math&amp;gt;\log_{2}n&amp;lt;/math&amp;gt;.&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
*входные (вектор): &amp;lt;math&amp;gt;\overline{a}=(a_{1},a_{2},...,a_{n})&amp;lt;/math&amp;gt;&lt;br /&gt;
*выходные данные (вектор): &amp;lt;math&amp;gt;\overline{b}=(b_{1},b_{2},...,b_{n})&amp;lt;/math&amp;gt;&lt;br /&gt;
Данные могут быть как действительными так и комплексными.&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
*Соотношение последовательной и параллельной сложности является &amp;#039;&amp;#039;линейным&amp;#039;&amp;#039;. Это хорошо видно из пункта [[#ЧАСТЬ. Ресурс параллелизма алгоритма|ресурс параллелизма алгоритма]].&lt;br /&gt;
*Вычислительная мощность алгоритма является &amp;#039;&amp;#039;логарифмической&amp;#039;&amp;#039;.&lt;br /&gt;
*Устойчивость. &lt;br /&gt;
**Рассмотрим вопрос об устойчивости поближе. Так как БПФ отличается от ДПФ простым лишь сокращением одинаковых операций, то вопрос устойчивости можно рассматривать на примере ДПФ. Так, к примеру, возьмем формулу ДПФ и добавим возмущение: &amp;lt;math&amp;gt; y_{p}=\sum_{k=0}^{n-1}(x_{k}+\varepsilon )e^{\frac{-2*\pi*k*p*i}{n}}, p=\overline{0,n-1}&amp;lt;/math&amp;gt;. После чего преобразуем ее: &amp;lt;math&amp;gt;y_{p}=\sum_{k=0}^{n-1}x_{k}e^{\frac{-2*\pi*k*p*i}{n}}+\varepsilon\sum_{k=0}^{n-1} e^{\frac{-2*\pi*k*p*i}{n}}&amp;lt;/math&amp;gt; и оценим вторую сумму, которая является геометрической прогрессией со знаменателем &amp;lt;math&amp;gt;q=e^{\frac{-2*\pi*p*i}{n}}&amp;lt;/math&amp;gt;. Таким образом оцениваемая сумма будет равняться: &amp;lt;math&amp;gt;\varepsilon\frac{1-e^{\frac{-2*\pi*p*i*(n-1))}{n}}}{1-e^{\frac{-2*\pi*p*i}{n}}}&amp;lt;/math&amp;gt;. При достаточно больших размерностях входного сигнала данное выражение сводится к: &amp;lt;math&amp;gt;\varepsilon (1-e^{-2*\pi*p*i})&amp;lt;/math&amp;gt;. В тригонометрической форме данного выражения: &amp;lt;math&amp;gt;\varepsilon (cos(\frac{2*\pi*p*(n-1)}{n})-i*sin(\frac{2*\pi*p*(n-1)}{n}))&amp;lt;/math&amp;gt; видно, что принимая во внимание целочисленность индексов &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; получается 0. Таким образом, мы можем говорить об устойчивости алгоритма в целом, и абсолютной устойчивости алгоритма в асимптотике.&lt;br /&gt;
*исходя из информационного графа, можно сделать вывод о сбалансированности алгоритма.&lt;br /&gt;
*алгоритм полностью детерминирован.&lt;br /&gt;
*Степень исхода вершины информационного графа не превышает двух.&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
[[file:масш.jpg|center|thumb|1000px|Рисунок 3. Параллельная реализация алгоритма. Изменение эффективности(%)в зависимости от числа процессоров и размера области.]]&lt;br /&gt;
Как описывалось выше, каждый процессор получает достаточно низкий объем работы, что приводит к неэффективному распараллеливанию алгоритма (высокие затраты на передачу данных между процессорами по сравнению с вычислениями на них). Поэтому необходимо находить оптимальное количество процессоров для каждой отдельно взятой задачи. В данном примере, при размерности входного сигнала менее 262144, оптимальное количество процессоров составляет 1. При размерности 262144-4194304 оптимум достигался при 8 процессорах. И при размерности более 4194304- 16 процессоров. Вычисления проводились на суперкомпьютере «Ломоносов». &lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Самой распространенной и известной реализацией дискретного БПФ является библиотека [http://www.fftw.org/ FFTW], разработанная Маттео Фриго и Стивеном Г. Джонсоном в Массачусетском технологическом институте. Данная библиотека существует для языков C и FORTRAN и позволяет производить вычисления в одном или нескольких измерениях. Входной сигнал может быть как действительным так и комплексным, а его размерность не обязательно должна быть степенью двойки. На данный момент последняя версия FFTW 3.3.5. Другие особенности библиотеки:&lt;br /&gt;
*Скорость. (Поддержка SSE / SSE2 / Altivec, начиная с версии 3.0. Версия 3.3.1 поддерживает AVX и ARM Neon.)&lt;br /&gt;
*Параллельные вычисления (OpenMP, MPI).&lt;br /&gt;
*[http://www.fftw.org/fftw3_doc/ Документация] в форматах HTML, PDF.&lt;br /&gt;
*Данное программное обеспечение является свободным и распространяется по лицензии GNU (General Public License).&lt;br /&gt;
Здесь приводится пример реализации прямого БПФ для комплексных данных входного сигнала на языке C++. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;С++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;fftw3-mpi.h&amp;gt;&lt;br /&gt;
# include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
# include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/stat.h&amp;gt;&lt;br /&gt;
#include &amp;lt;fcntl.h&amp;gt;&lt;br /&gt;
# include &amp;lt;time.h&amp;gt;&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char **argv)&lt;br /&gt;
{&lt;br /&gt;
	const ptrdiff_t N0 = 4194304;&lt;br /&gt;
	fftw_plan planForw;&lt;br /&gt;
	fftw_complex *data, *dataOut;&lt;br /&gt;
	ptrdiff_t alloc_local, local_ni, local_i_start, i, j, local_no, local_o_start;&lt;br /&gt;
	int index, size;&lt;br /&gt;
	double startwtime, endwtime;&lt;br /&gt;
	MPI_Init(&amp;amp;argc, &amp;amp;argv);&lt;br /&gt;
	fftw_mpi_init();&lt;br /&gt;
	MPI_Comm_rank(MPI_COMM_WORLD, &amp;amp;index);&lt;br /&gt;
	MPI_Comm_size(MPI_COMM_WORLD, &amp;amp;size);&lt;br /&gt;
&lt;br /&gt;
	/* get local data size and allocate */&lt;br /&gt;
	alloc_local = fftw_mpi_local_size_1d(N0, MPI_COMM_WORLD, FFTW_FORWARD, FFTW_ESTIMATE,&lt;br /&gt;
		&amp;amp;local_ni, &amp;amp;local_i_start, &amp;amp;local_no, &amp;amp;local_o_start);&lt;br /&gt;
	data = fftw_alloc_complex(alloc_local);&lt;br /&gt;
	dataOut = fftw_alloc_complex(alloc_local);&lt;br /&gt;
	/* create plan  */&lt;br /&gt;
	planForw = fftw_mpi_plan_dft_1d(N0, data, dataOut, MPI_COMM_WORLD,&lt;br /&gt;
		FFTW_FORWARD, FFTW_ESTIMATE);&lt;br /&gt;
	/* initialize data to some function my_function(x,y) */&lt;br /&gt;
	for (i = 0; i &amp;lt; local_ni; ++i)&lt;br /&gt;
	{&lt;br /&gt;
		data[i][0] = rand() / (double)RAND_MAX;&lt;br /&gt;
		data[i][1] = rand() / (double)RAND_MAX;&lt;br /&gt;
	}&lt;br /&gt;
	if (index == 0){&lt;br /&gt;
		startwtime = MPI_Wtime();&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	fftw_execute(planForw);&lt;br /&gt;
	if (index == 0){&lt;br /&gt;
		endwtime = MPI_Wtime();&lt;br /&gt;
		printf(&amp;quot;wall clock time = %f\n&amp;quot;,&lt;br /&gt;
			endwtime - startwtime);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	fftw_destroy_plan(planForw);&lt;br /&gt;
	MPI_Finalize();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
[http://www.fftw.org/download.html Скачав] библиотеку и установив ее на рабочий компьютер, можно поэкспериментировать, используя вышеописанный исходный код. При этом, на стадии компиляции необходимо указывать директорию, где находятся заголовочные файлы и директорию, где находятся библиотечные файлы. Пример: mpicxx name.cpp -I/path/to/include/files -L/path/to/lib/files  -lfftw3_mpi -lfftw3 -lm. Для версии 2.1.4 описание на русском языке приводится [https://parallel.ru/cluster/fftw.html здесь].&lt;br /&gt;
&lt;br /&gt;
Остальные реализации:&lt;br /&gt;
*[http://www.gnu.org/software/gsl/ GSL - GNU Scientific Library]&lt;br /&gt;
*[https://developer.nvidia.com/cufft cuFFT]&lt;br /&gt;
*[http://www-03.ibm.com/systems/power/software/essl/ Engineering and Scientific Subroutine Library (ESSL) and Parallel ESSL]&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Бахвалов Н. С.,  Жидков Н. П., Кобельков. Г. М. — 6-е изд. — М. : БИНОМ. Лаборатория знаний&lt;br /&gt;
&lt;br /&gt;
[2] Г. Нуссбаумер. Быстрое преобразование Фурье и алгоритмы вычисления сверток&lt;br /&gt;
&lt;br /&gt;
[3] А.О. Лапаев Параллельное вычисление дискретного преобразования Фурье  полинома в простом поле&lt;/div&gt;</summary>
		<author><name>Vagabond</name></author>
	</entry>
</feed>