Быстрое преобразование Фурье

Материал из testwiki
Перейти к навигации Перейти к поиску

Быстрое преобразование Фурье (сокр. БПФ, по англ. Fast Fourier Transform или FFT) — алгоритм ускоренного вычисления дискретного преобразования Фурье, позволяющий получить результат за время, меньшее чем O(N2) (требуемого для прямого, поформульного вычисления). Иногда под быстрым преобразованием Фурье понимается один из алгоритмов, называемый алгоритмом прореживания по частоте — времени, имеющий сложность O(Nlog(N)).

Алгоритм применим к любым коммутативным ассоциативным кольцам с единицей, чаще применяют к полю комплексных чисел (c ε=e2πi/n) и к кольцам вычетов (которым, в частности, является компьютерный целый тип).

Основной алгоритм

Шаблон:Основная статья

Амплитуды быстрого преобразования Фурье для разного количества компонент разложения N. Первый случай: N=L10, где L — количество отсчётов сигнала; второй случай: N=L; третий: N=L+10. В первом и последних случаях спектральные характеристики оцениваются менее точно. Данный эффект связан с Шаблон:Iw.

При применении основного алгоритма дискретное преобразование Фурье может быть выполнено за O(N(p1++pn)) действий при N=p1p2pn, в частности, при N=2n понадобится O(Nlog(N)) действий.

Дискретное преобразование Фурье преобразует набор чисел a0,,an1 в набор чисел b0,,bn1, такой, что bi=j=0n1ajεij, где ε — первообразный корень из единицы, то есть εn=1 и εk1 при 0<k<n. Основной шаг алгоритма состоит в сведении задачи для N чисел к задаче с меньшим числом. Для N=pq,p>1,q>1 над полем комплексных чисел вводятся: εν=e2πi/ν, ενν=1, где ν — любое число. Дискретное преобразование Фурье может быть представлено в виде bi=k=0p1j=0q1akq+jεN(kq+j)i. (Эти выражения могут быть легко получены, если исходную сумму разбить на меньшее число сумм с меньшим числом слагаемых, а после полученные суммы привести к одинаковому виду путём сдвига индексов и их последующего переобозначения).

Таким образом:

bi=k=0p1j=0q1akq+jεN(kq+j)i=j=0q1εNij(k=0p1akq+jεNkiq).

С учётом того, что εNkiq=εN/qki и N/q=p, окончательная запись:

bi=j=0q1εNij(k=0p1akq+jεpki).

Далее вычисляется каждое bi, где i=0,p1, здесь по-прежнему требуется совершить O(N) действий, то есть на этом этапе производится pO(N)=O(Np) операций.

Далее считается bi+mp, где i=0,p1,m=1,q1. При замене ii+mp в последней формуле, выражения, стоящие в скобках, остались неизменными, а так как они уже были посчитаны на предыдущем шаге, то на вычисление каждого из них потребуется только O(q) действий. Всего p(q1)=Np чисел. Следовательно, операций на этом шаге (Np)O(q)=O((N1)q)O(Nq). Последнее с хорошей точностью верно при любых N.

Алгоритм быстрого преобразования Фурье логично применять для N1, потому как при малом числе отсчётов он даёт небольшой выигрыш в скорости по отношению к прямому расчёту дискретного преобразования Фурье. Таким образом, для того чтобы полностью перейти к набору чисел b0,,bN1, необходимо O(Np)+O(Nq) действий. Следовательно, нет разницы, на какие два числа разбивать N — ответ от этого сильно не будет меняться. Уменьшено же число операций может быть только дальнейшим разбиением N.

Скорость алгоритма (N=pq):

  1. pqO(Np)
  2. pqO(Nq)
  3. pqO(Nq)

То есть число операций при любом разбиении N на два числа, есть O(Nc), где c=max(p,q).

Обратное преобразование Фурье

Для обратного преобразования Фурье можно применять алгоритм прямого преобразования Фурье — нужно лишь использовать ε1 вместо ε (или применить операцию комплексного сопряжения вначале к входным данным, а затем к результату, полученному после прямого преобразования Фурье), и окончательный результат поделить на N.

Общий случай

Шаблон:Основная статья Общий случай может быть сведён к предыдущему. Для 4N>2k2N имеет место:

bi=εi2/2j=0N1ε(i+j)2/2εj2/2aj.

Обозначая a¯i=εi2/2ai,b¯i=εi2/2bi,ci=ε(2N2i)2/2 получается:

b¯i=j=02N2ia¯jc2N2ij,

если положить a¯i=0 при iN.

Таким образом задача сведена к вычислению свёртки, но это можно сделать с помощью трёх преобразований Фурье для 2k элементов: выполняется прямое преобразование Фурье для {a¯i}i=0i=2k1 и {ci}i=0i=2k1, поэлементно перемножаются результаты, и выполняется обратное преобразование Фурье.

Вычисления всех a¯i и ci требуют O(N) действий, три преобразования Фурье требуют O(Nlog(N)) действий, перемножение результатов преобразований Фурье требует O(N) действий, вычисление всех bi зная значения свёртки требует O(N) действий. Итого для дискретного преобразования Фурье требуется O(Nlog(N)) действий для любого N.

Этот алгоритм быстрого преобразования Фурье может работать над кольцом только когда известны первообразные корни из единицы степеней 2N и 2k.

Вывод преобразования из дискретного

Наиболее распространённым алгоритмом быстрого преобразования Фурье является алгоритм Кули — Тьюки, при котором дискретное преобразование Фурье от N=N1N2 выражается как сумма дискретных преобразований Фурье более малых размерностей N1 и N2 рекурсивно для того, чтобы достичь сложность O(Nlog(N)). Элементарный шаг сочленения меньших преобразований Фурье в этом алгоритме называется «бабочка». В вычислительной технике наиболее часто используется рекурсивное разложение преобразований надвое, то есть с основанием 2 (хотя может быть использовано любое основание), а количество входных отсчётов является степенью двойки. Для случаев, когда дискретное преобразование считается от количества отсчётов, являющихся простыми числами, могут быть использованы алгоритмы Блуштайна и Рейдера.

Например, для вычисления быстрого преобразования Фурье по алгоритму Кули — Тьюки с основанием 2 для вектора x, состоящего из N элементов:

X=A^x,

с элементами A^ вида:

aNmn=e2πiNmn

дискретное преобразование можно выразить как сумму двух частей: сумму чётных индексов m=2n и сумму нечётных индексов m=2n+1:

Xm=n=0N1xnaNmn=n=0N/21x2naN2nm+n=0N/21x2n+1aN(2n+1)m.

Коэффициенты aN2nm и aN(2n+1)m можно переписать следующим образом:

aN2nm=e(2πi2mnN)=e(2πimnN/2)=aN/2nm
aN(2n+1)m=e(2πimN)aN/2nm

В результате:

Xm=n=0N/21x2naN/2nm+e2πiNmn=0N/21x2n+1aN/2nm

Вычисление данного выражения можно упростить, используя:

  • свойство периодичности ДПФ:
    aN/2(m+N2)n=aN/2nm,
  • коэффициент поворота БПФ удовлетворяет следующему равенству:
    e2πiN(m+N/2)=e2πimNπi=eπie2πimN=e2πimN

В результате упрощений, обозначив дискретное преобразование Фурье чётных индексов x2m через Em и преобразование нечётных индексов x2m+1 через Om, для 0m<N2 получается:

Xm=Em+e2πiNmOmXm+N2=Eme2πiNmOm

Данная запись является базой алгоритма Кули — Тьюки с основанием 2 для вычисления быстрого преобразования Фурье, то есть дискретное преобразование от вектора, состоящего из N отсчётов, приведено к линейной композиции двух дискретных преобразований Фурье от N2 отсчётов, и, если для первоначальной задачи требовалось N2 операций, то для полученной композиции — N22 (за счёт повторного использования промежуточных результатов вычислений Em и Om). Если N является степенью двух, то это разделение можно продолжать рекурсивно до тех пор, пока не доходит до двухточечного преобразования Фурье, которое вычисляется по следующим формулам:

{X0=x0+x1X1=x0x1

При рекурсивном делении дискретного преобразования Фурье от N входных значений на сумму 2 дискретных преобразований по N/2 входных значений сложность алгоритма становится равной O(Nlog(N)).

См. также

Примечания

Шаблон:Примечания

Шаблон:Нет источников

Ссылки

Шаблон:Wikibooks