Дискретное преобразование Фурье#
Напоминание про ряд Фурье (непрерывный случай)#
Рассмотрим разложение произвольной действительной функции в следующем виде
Здесь мы определяем набор частот \(\left\{\nu_i\right\}\) некоторым способом, который мы обсудим позже. Значения амплитуд и сдвиг фаз оцениваются для каждого данного \(\nu_i\). Ряд Фурье описывает сигнал \(x(t)\) набором пар \(\left\{A_i^2, \nu_i\right\}_{i=1}^n\), где \(A_i^2\) представляет собой интенсивность \(i\)-й косинусоиды. Этот набор пар называется спектром.
Как вычислить \(A_i\)? Раскроем к общепринятому виду.
А тогда разложение,
где все коэффициенты считаются как
и
Дискретный Фурье (DFT)#
На компьютере нельзя задать континуальный набор точек - любой сигнал это дискретизованный конечный набор точек \(\left\{x_n\right\}_{n=0}^{N-1}\). Его вывод возьмём с википедии
Рассмотрим некоторый периодический сигнал \(x(t)\) с периодом, равным Т. Разложим его в ряд Фурье:
Проведем дискретизацию сигнала так, чтобы на периоде было \(\mathrm{N}\) отсчетов. Дискретный сигнал представим в виде отсчетов: \(x_n=x\left(t_n\right)\), где \(t_n=\frac{n}{N} T\), тогда эти отсчеты через ряд Фурье запишутся следующим образом:
Используя соотношение \(e^{\frac{2 \pi i}{N}(k+m N) n}=e^{\frac{2 \pi i}{N} k n}\), получаем:
Таким образом мы получили обратное дискретное преобразование Фурье. Умножим теперь скалярно выражение для \(x_n\) на \(e^{-\frac{2 \pi i}{N} m n}\) и получим:
Здесь использованы: а) выражение для суммы конечного числа членов (экспонент) геометрической прогрессии, и б) выражение символа Кронекера как предела отношения функций Эйлера для комплексных чисел. Отсюда следует, что:
Эта формула описывает прямое дискретное преобразование Фурье. В литературе принято писать множитель \(\frac{1}{N}\) в обратном преобразовании, и поэтому обычно пишут формулы преобразования в следующем виде:
Не столь важно, где этот коэффициент находится. Наиболее ествественным, вообще говоря, является \(\frac{1}{\sqrt {N}}\) в обоих выражениях.
Дискретный Фурье как оператор#
Заметим, что дискретный Фурье можно задать в операторной форме:
с матрицей \(M\) заданной
Итого,
Для обратного преобразования Фурье можно применять алгоритм прямого преобразования Фурье — нужно лишь использовать \(\varepsilon^{-1}\) вместо \(\varepsilon\) (или применить операцию комплексного сопряжения вначале к входным данным, а затем к результату, полученному после прямого преобразования Фурье), и окончательный результат поделить на \(N\).
Аналогично можно определить \(m\)-мерный Фурье. Пример для Фурье преобразования матрицы:
Связь оператора дискретного Фурье с быстрым умножением многочленов*#
Дискретное преобразование Фурье является линейным преобразованием, которое переводит вектор временных отсчётов \(\vec x\) в вектор спектральных отсчётов той же длины. Таким образом преобразование может быть реализовано как умножение симметричной квадратной матрицы на вектор:
матрица \(\mathcal F\) имеет вид:
где \(\omega_n = e^{-\frac{2\pi i}{n}}\)
Тут мы видим так называемую матрицу Вандермонда. Она тесно связана с полиномиальной интерполяцией.
А тогда дискретное преобразование Фурье вектора \((a_0,\,a_1,\,\dots,\,a_{n-1})\) может быть интерпретировано как вычисление значений многочлена
в следующих точках:
Иными словами, Фурье-образ \((A_0,\,A_1,\,\dots,\,A_{n-1})\) вектора \((a_0,\,a_1,\,\dots,\,a_{n-1})\) можно страктовать как
Значения многочлена \(n\)-й степени в \(n+1\) точках однозначно определяют сам многочлен. Таким образом, если мы уже знаем преобразование Фурье \(\vec{A}\) (вычислили по формулам выше или через fft (формулы ниже)), мы имеем всю информацию для задания многочлена p(x).
Теорема. Пусть есть два многочлена каких-то своих степеней
Тогда для быстрого нахождения коэффициентов многочлена \((q\cdot p) \,(x)=c_0+c_1 x + \dots + c_{n+m-2}x^{n+m-2}\) достаточно применить обратное дискретное преобразование Фурье для вектора
Примечание. Алгоритм выше эффективнее простого перемножения коэффициентов, если использовать fft (о нём ниже, работает за \(O(n log n)\)) для вычисления дискретного преобразования Фурье.
Следствие. Так как любое натуральное число представимо в виде многочлена от основания системы счисления:
умножение двух чисел может быть в свою очередь сведено к умножению двух многочленов и нормализации результата. Работать такое умножение будет за \(O(N log N)\), где \(N\) - суммарное количество цифр в десятичной записи обоих чисел.