Быстрое преобразование Фурье — различия между версиями
(Новая страница: «{{Определение |definition= '''Быстрое преобразование Фурье''' (англ. ''Fast Fourier Transform (FFT)'') {{---}} это м...») |
|||
Строка 3: | Строка 3: | ||
'''Быстрое преобразование Фурье''' (англ. ''Fast Fourier Transform (FFT)'') {{---}} это метод, позволяющий вычислять дискретное преобразование Фурье за время <tex>O(nlogn)</tex>. | '''Быстрое преобразование Фурье''' (англ. ''Fast Fourier Transform (FFT)'') {{---}} это метод, позволяющий вычислять дискретное преобразование Фурье за время <tex>O(nlogn)</tex>. | ||
}} | }} | ||
− | == | + | |
+ | == Описание задачи == | ||
+ | {{Задача | ||
+ | |definition= | ||
+ | Необходимо научиться вычислять прямое и обратное дискретное преобразование Фурье многочлена <tex>A(x)</tex> степени <tex>n</tex> за время <tex>O(nlogn)</tex>. | ||
+ | }} | ||
+ | |||
Метод основывается на том, что степени одних комплексных корней единицы в степени <tex>n</tex> дают другие. | Метод основывается на том, что степени одних комплексных корней единицы в степени <tex>n</tex> дают другие. | ||
Идея заключается в том, что сначала мы разделяем вектор коэффициентов на два вектора, рекурсивно вычисляем значение ДПФ для них, и объединяем их в одно ДПФ. | Идея заключается в том, что сначала мы разделяем вектор коэффициентов на два вектора, рекурсивно вычисляем значение ДПФ для них, и объединяем их в одно ДПФ. | ||
+ | == Алгоритм построения БПФ == | ||
Пусть имеется многочлен <tex>A(x)</tex> степени <tex>n</tex>, где <tex>n > 1, n = 2^t</tex>. Если <tex>n</tex> не является степенью двойки, добавим недостающие члены и положим коэффициенты равными нулю. | Пусть имеется многочлен <tex>A(x)</tex> степени <tex>n</tex>, где <tex>n > 1, n = 2^t</tex>. Если <tex>n</tex> не является степенью двойки, добавим недостающие члены и положим коэффициенты равными нулю. | ||
Строка 42: | Строка 49: | ||
== Алгоритм построения обратного БПФ == | == Алгоритм построения обратного БПФ == | ||
− | Пусть вектор <tex>y_0, y_1, \ldots , y_{n-1}</tex> {{---}} значения многочлена <tex>A</tex> степени <tex>n</tex> в точках <tex>n = \omega_n^k</tex>. Необходимо, по данному вектору восстановить коэффициенты <tex>(a_0, a_1, \ldots , a_{n-1})</tex> многочлена. | + | Пусть вектор <tex>(y_0, y_1, \ldots , y_{n-1})</tex> {{---}} значения многочлена <tex>A</tex> степени <tex>n</tex> в точках <tex>n = \omega_n^k</tex>. Необходимо, по данному вектору восстановить коэффициенты <tex>(a_0, a_1, \ldots , a_{n-1})</tex> многочлена. |
+ | |||
+ | Рассмотрим ДПФ в матричном виде: | ||
+ | |||
+ | <tex> | ||
+ | \begin{pmatrix} | ||
+ | \omega_n^0 & \omega_n^0 & \omega_n^0 & \ldots & \omega_n^0\\ | ||
+ | \omega_n^0 & \omega_n^1 & \omega_n^2 & \ldots & \omega_n^{n-1} \\ | ||
+ | \omega_n^0 & \omega_n^2 & \omega_n^4 & \ldots & \omega_n^{2(n-1)} \\ | ||
+ | \vdots& \vdots & \vdots &\ddots & \vdots\\ | ||
+ | \omega_n^0 & \omega_n^{n-1} & \omega_n^{2(n-1)} &\ldots & \omega_n^{(n-1)(n-1)} | ||
+ | \end{pmatrix} | ||
+ | \begin{pmatrix} | ||
+ | a_0 \\ | ||
+ | a_1 \\ | ||
+ | a_2 \\ | ||
+ | \vdots \\ | ||
+ | a_{n-1} | ||
+ | \end{pmatrix} | ||
+ | = | ||
+ | \begin{pmatrix} | ||
+ | y_0 \\ | ||
+ | y_1 \\ | ||
+ | y_2 \\ | ||
+ | \vdots \\ | ||
+ | y_{n-1} | ||
+ | \end{pmatrix} | ||
+ | </tex> | ||
+ | |||
+ | Отсюда можно найти вектор <tex>(a_0, a_1, \ldots ,a_{n-1}</tex>, умножив вектор <tex>(y_0, y_1, \ldots ,y_{n-1})</tex> на матрицу обратную матрице Вандермонда (матрица слева). | ||
+ | |||
+ | <tex> | ||
+ | \begin{pmatrix} | ||
+ | a_0 \\ | ||
+ | a_1 \\ | ||
+ | a_2 \\ | ||
+ | \vdots \\ | ||
+ | a_{n-1} | ||
+ | \end{pmatrix} | ||
+ | = | ||
+ | {\begin{pmatrix} | ||
+ | \omega_n^0 & \omega_n^0 & \omega_n^0 & \ldots & \omega_n^0\\ | ||
+ | \omega_n^0 & \omega_n^1 & \omega_n^2 & \ldots & \omega_n^{n-1} \\ | ||
+ | \omega_n^0 & \omega_n^2 & \omega_n^4 & \ldots & \omega_n^{2(n-1)} \\ | ||
+ | \vdots& \vdots & \vdots &\ddots & \vdots\\ | ||
+ | \omega_n^0 & \omega_n^{n-1} & \omega_n^{2(n-1)} &\ldots & \omega_n^{(n-1)(n-1)} | ||
+ | \end{pmatrix}}^{-1} | ||
+ | \begin{pmatrix} | ||
+ | y_0 \\ | ||
+ | y_1 \\ | ||
+ | y_2 \\ | ||
+ | \vdots \\ | ||
+ | y_{n-1} | ||
+ | \end{pmatrix} | ||
+ | </tex> | ||
+ | |||
+ | Непосредственной проверкой можно убедиться, что обратная матрица имеет вид: | ||
+ | |||
+ | <tex> | ||
+ | \dfrac{1}{n} | ||
+ | \begin{pmatrix} | ||
+ | \omega_n^0 & \omega_n^0 & \omega_n^0 & \ldots & \omega_n^0\\ | ||
+ | \omega_n^0 & \omega_n^{-1} & \omega_n^{-2} & \ldots & \omega_n^{-(n-1)} \\ | ||
+ | \omega_n^0 & \omega_n^{-2} & \omega_n^{-4} & \ldots & \omega_n^{-2(n-1)} \\ | ||
+ | \vdots& \vdots & \vdots &\ddots & \vdots\\ | ||
+ | \omega_n^0 & \omega_n^{-(n-1)} & \omega_n^{-2(n-1)} &\ldots & \omega_n^{-(n-1)(n-1)} | ||
+ | \end{pmatrix} | ||
+ | </tex> | ||
+ | |||
+ | Получаем формулу для <tex>a_k</tex>: | ||
+ | |||
+ | <tex>a_k = \dfrac{1}{n}\sum \limits_{j=0}^{n-1} {y_j \omega_n^{kj}} </tex> |
Версия 17:30, 4 декабря 2016
Определение: |
Быстрое преобразование Фурье (англ. Fast Fourier Transform (FFT)) — это метод, позволяющий вычислять дискретное преобразование Фурье за время | .
Описание задачи
Задача: |
Необходимо научиться вычислять прямое и обратное дискретное преобразование Фурье многочлена | степени за время .
Метод основывается на том, что степени одних комплексных корней единицы в степени дают другие.
Идея заключается в том, что сначала мы разделяем вектор коэффициентов на два вектора, рекурсивно вычисляем значение ДПФ для них, и объединяем их в одно ДПФ.
Алгоритм построения БПФ
Пусть имеется многочлен
степени , где . Если не является степенью двойки, добавим недостающие члены и положим коэффициенты равными нулю.
Разделим
на два многочлена, где один будет с четными, а другой с нечетными коэффициентами:Многочлен
получается из и следующим образом:
Мы разбили исходный многочлен на два многочлена, имеющих вдвое меньшую степень. Нам необходимо по вычисленным и за линейное время вычислить . Так как здесь используется идея "разделяй и властвуй", то асимптотическая оценка будет .
Пусть
и . Найдем вектор значений .- Из получаем значения для первой половины коэффициентов:
- Для второй половины получаем:
Заметим, что
, тогда:.
Таким образом, мы получили:
.
Алгоритм построения обратного БПФ
Пусть вектор
— значения многочлена степени в точках . Необходимо, по данному вектору восстановить коэффициенты многочлена.Рассмотрим ДПФ в матричном виде:
Отсюда можно найти вектор
, умножив вектор на матрицу обратную матрице Вандермонда (матрица слева).
Непосредственной проверкой можно убедиться, что обратная матрица имеет вид:
Получаем формулу для
: