Быстрое преобразование Фурье
Материал из MachineLearning.
(Новая: == Быстрое преобразование Фурье == '''Быстрое преобразование Фурье''' (БПФ, {{lang-en|Fast Fourier Transform, FFT}}) — клас...) |
|||
| Строка 1: | Строка 1: | ||
== Быстрое преобразование Фурье == | == Быстрое преобразование Фурье == | ||
| - | '''Быстрое преобразование Фурье''' (БПФ, | + | '''Быстрое преобразование Фурье''' (БПФ, Fast Fourier Transform, FFT) — класс алгоритмов, позволяющих вычислить [[Дискретное преобразование Фурье|дискретное преобразование Фурье]] (ДПФ) и обратное к нему за время <tex>O(N \log N)</tex>. Прямое вычисление ДПФ по определению требует <tex>O(N^2)</tex> арифметических операций, что делает БПФ незаменимым инструментом в задачах [[Цифровая обработка сигналов|цифровой обработки сигналов]], спектрального анализа, вычисления [[Свёртка|свёрток]] и умножения многочленов. |
== Определение и вычислительная сложность == | == Определение и вычислительная сложность == | ||
| Строка 27: | Строка 27: | ||
Пусть <tex>N</tex> чётно. Разобьём исходную последовательность <tex>x_n</tex> на две подпоследовательности половинной длины, выбирая отсчёты с чётными и нечётными индексами: | Пусть <tex>N</tex> чётно. Разобьём исходную последовательность <tex>x_n</tex> на две подпоследовательности половинной длины, выбирая отсчёты с чётными и нечётными индексами: | ||
| - | <tex> | + | <tex> x_n^{(e)} = x_{2n}, </tex> |
| - | x_n^{(e)} = x_{2n}, | + | <tex> x_n^{(o)} = x_{2n+1}, </tex> |
| - | </tex> | + | <tex> n = 0, \dots, N/2 - 1.</tex> |
Обозначим через <tex>E_k</tex> и <tex>O_k</tex> их <tex>N/2</tex>-точечные ДПФ: | Обозначим через <tex>E_k</tex> и <tex>O_k</tex> их <tex>N/2</tex>-точечные ДПФ: | ||
<tex> | <tex> | ||
| - | E_k = \sum_{n=0}^{N/2-1} x_{2n} W_{N/2}^{nk}, \ | + | E_k = \sum_{n=0}^{N/2-1} x_{2n} W_{N/2}^{nk}, \qquad O_k = \sum_{n=0}^{N/2-1} x_{2n+1} W_{N/2}^{nk}. |
| - | O_k = \sum_{n=0}^{N/2-1} x_{2n+1} W_{N/2}^{nk}. | + | |
</tex> | </tex> | ||
| Строка 41: | Строка 40: | ||
<tex> | <tex> | ||
| - | X_k = \sum_{n=0}^{N-1} x_n W_N^{nk} | + | X_k = \sum_{n=0}^{N-1} x_n W_N^{nk} = \sum_{n=0}^{N/2-1} x_{2n} W_N^{2nk} + \sum_{n=0}^{N/2-1} x_{2n+1} W_N^{(2n+1)k} = \sum_{n=0}^{N/2-1} x_n^{(e)} W_{N/2}^{nk} + W_N^k \sum_{n=0}^{N/2-1} x_n^{(o)} W_{N/2}^{nk}. |
| - | + | ||
| - | + | ||
</tex> | </tex> | ||
Версия 05:16, 18 июля 2026
Содержание |
Быстрое преобразование Фурье
Быстрое преобразование Фурье (БПФ, Fast Fourier Transform, FFT) — класс алгоритмов, позволяющих вычислить дискретное преобразование Фурье (ДПФ) и обратное к нему за время . Прямое вычисление ДПФ по определению требует
арифметических операций, что делает БПФ незаменимым инструментом в задачах цифровой обработки сигналов, спектрального анализа, вычисления свёрток и умножения многочленов.
Определение и вычислительная сложность
Пусть задана последовательность комплексных чисел . Её дискретное преобразование Фурье определяется как
где — комплексный корень из единицы, называемый поворачивающим множителем. Обратное дискретное преобразование Фурье (ОДПФ) задаётся аналогично с заменой
на
и нормировкой
.
Непосредственное вычисление всех коэффициентов
требует
комплексных умножений и
сложений, т. е. имеет временную сложность
. При больших
(порядка
–
, типичных в приложениях) такое количество операций неприемлемо.
Быстрым преобразованием Фурье называют любой алгоритм, понижающий сложность до . Наиболее распространённым является алгоритм Кули — Тьюки, основанный на методе «разделяй и властвуй». Далее основное внимание уделяется случаю
как наиболее простому и эффективному для изложения, хотя современные библиотеки (FFTW, Intel MKL) активно используют смешанные основания для достижения максимальной производительности.
Алгоритм Кули — Тьюки
Алгоритм Кули — Тьюки[1] был опубликован в 1965 г., хотя его идеи восходят к Гауссу. Ключевая идея состоит в рекурсивном сведении вычисления ДПФ длины к двум ДПФ длины
и последующем объединении результатов с помощью
комплексных умножений и
сложений. Алгоритм эксплуатирует алгебраические свойства корней из единицы, в частности периодичность и симметрию. Для случая
это приводит к временной сложности
.
Существуют две симметричные формы алгоритма — с прореживанием по времени и по частоте. Ниже подробно разбирается вариант с прореживанием по времени, который наиболее наглядно демонстрирует принцип «разделяй и властвуй».
Прореживание по времени (Decimation in Time, DIT)
Пусть чётно. Разобьём исходную последовательность
на две подпоследовательности половинной длины, выбирая отсчёты с чётными и нечётными индексами:
Обозначим через и
их
-точечные ДПФ:
Теперь выразим искомое ДПФ через
и
. Для любого
справедливо:
В последнем переходе использовалось тождество , которое следует из определения поворачивающего множителя:
.
Таким образом, для первой половины выходных индексов () получаем:
Для второй половины () воспользуемся периодичностью ДПФ половинной длины:
,
, и тем, что
. Подстановка даёт:
Два последних соотношения
называются базовой операцией «бабочка». Она составляет элементарный шаг алгоритма и за один раз вычисляет по одному элементу из каждой половины выходного массива, используя одно комплексное умножение и два сложения.
Рекурсивно применяя ту же процедуру к подзадачам длины , а затем к
и так далее, мы в конечном итоге дойдём до ДПФ длины 1, которое является просто тождественным отображением (
). Глубина рекурсии составляет
. На каждом уровне рекурсии выполняется
бабочек, каждая из которых содержит одно комплексное умножение и два сложения.
Формально время работы удовлетворяет рекуррентному соотношению ,
. По основной теореме о рекуррентности это даёт
, то есть общее число комплексных умножений —
, сложений —
.
Прореживание по частоте (Decimation in Frequency, DIF)
В альтернативном подходе исходная последовательность делится на две половины:
и
для
. Вместо рекурсивного вычисления ДПФ чётных и нечётных индексов здесь сначала с помощью бабочек формируются две промежуточные последовательности, после чего вычисляются
-точечные ДПФ для получения чётных и нечётных частот. Вычислительная сложность остаётся такой же —
.
Итеративная реализация и бит-реверсивная перестановка
Прямая рекурсивная реализация требует дополнительной памяти порядка для хранения промежуточных массивов. На практике используют итеративный алгоритм, работающий «на месте» (
) с
дополнительной памяти (не считая массива входных данных). Алгоритм состоит из двух фаз.
- Бит-реверсивная перестановка. Входной массив переупорядочивается так, что элемент с индексом
переносится в позицию, двоичное представление которой является обратным к двоичному представлению
(длина двоичных слов равна
). Например, для
индекс
переходит в
. После этой перестановки рекурсивные подзадачи оказываются расположенными в памяти последовательно, что позволяет выполнять слияние снизу вверх.
- Послойное вычисление бабочек. Пусть номер слоя
пробегает значения от
до
. На слое
размер блока ДПФ равен
, а полублока —
. Для каждого блока с индексом
и для каждого элемента внутри полублока
выполняется бабочка над парой элементов с индексами
и
:
Здесь — предвычисленный поворачивающий множитель. Внешний цикл идёт по слоям
, затем по блокам, и наконец по позициям внутри полублока. После завершения последнего слоя массив
содержит коэффициенты ДПФ в естественном порядке.
Итеративная схема лежит в основе большинства высокопроизводительных библиотек, включая FFTW и Intel MKL.
Другие алгоритмы БПФ
Помимо алгоритма Кули — Тьюки для степеней двойки, существует ряд методов, ориентированных на произвольные длины .
- Составное
и гнездовые алгоритмы — обобщение Кули — Тьюки на случай
, в том числе для смешанного основания. Рекурсивно сводят ДПФ к ДПФ меньших длин, возможно, разных. Пример — алгоритм Синглтона[1].
- Алгоритм Гуда — Томаса (алгоритм простых множителей) — применяется, когда
со взаимно простыми
. Использует китайскую теорему об остатках для переиндексации, сводя ДПФ к двумерному без дополнительных поворачивающих множителей.
- Алгоритм Винограда (WFTA) — использует свёрточную структуру ДПФ для простых длин и тензорное произведение для составных. Минимизирует число умножений ценой усложнения адресации[1].
- Алгоритм Блюстейна (Chirp Z-Transform) — позволяет вычислить ДПФ произвольной длины
, сводя его к вычислению линейной свёртки, которая затем эффективно вычисляется с помощью БПФ. Для этого используется БПФ длины
, где
— наименьшая степень двойки, не меньшая
[1].
- БПФ для действительных данных — использует симметрию спектра действительного сигнала (
), что позволяет вдвое сократить память и вычисления. Широко распространены упакованные форматы хранения (Hermitian-symmetric).
Выбор конкретного алгоритма зависит от длины , архитектуры вычислителя и допустимой задержки.
Приложения в анализе данных
Быстрое преобразование Фурье занимает важное место в современном анализе данных и машинном обучении. Его способность эффективно переводить временные и пространственные зависимости в частотную область открывает возможности для извлечения признаков, быстрой обработки и построения масштабируемых моделей.
Анализ временных рядов и спектральные признаки
В задачах прогнозирования и классификации временных рядов часто бывает полезно представить сигнал через его частотные компоненты. БПФ позволяет:
- Выделять периодические тренды. Амплитудный спектр
мгновенно выявляет доминирующие частоты, что используется для обнаружения сезонностей, циклических паттернов в финансовых, метеорологических и сенсорных данных.
- Формировать спектральные признаки. На основе БПФ строятся такие признаки, как энергия в заданных частотных полосах, спектральный центроид, спад спектра, коэффициенты кепстра. Они широко применяются в задачах распознавания активности по акселерометру, мониторинга состояния промышленного оборудования и анализа биомедицинских сигналов (ЭЭГ, ЭКГ).
- Детекция аномалий с помощью спектральных остатков. Метод Spectral Residual[1] использует БПФ для выделения «неожиданных» компонент во временном ряде, что позволяет эффективно находить выбросы и аномалии в потоковых данных без обучения.
Быстрая свёртка в машинном обучении
Свёрточные операции — основа архитектур свёрточных нейронных сетей (CNN). Для больших ядер свёртки или при работе с одномерными сигналами высокой размерности прямые вычисления становятся затратными. БПФ даёт альтернативный путь: дополнив последовательности нулями до длины (где
— длины исходных векторов), линейную свёртку можно вычислить как
где — дополненные нулями сигналы, а
— поэлементное умножение. Это не только ускоряет вычисления на CPU и GPU (особенно с помощью таких библиотек, как cuFFT), но и позволяет реализовать свёртку с очень большим рецептивным полем, что полезно в задачах обработки аудио и длинных последовательностей. Аналогично, взаимная корреляция через БПФ используется для быстрого сопоставления шаблонов, например, при поиске объекта на изображении.
Признаки для аудио- и речевой аналитики
Практически все стандартные признаки в обработке речи и музыки опираются на БПФ:
- Мел-частотные кепстральные коэффициенты (MFCC). Вычисление мел-спектрограммы и последующего дискретного косинусного преобразования начинается с БПФ коротких кадров сигнала. Эти коэффициенты служат входом для систем распознавания речи, идентификации диктора и музыкальных рекомендательных систем.
- Спектрограммы как изображения. Во многих нейросетевых подходах (например, SoundNet, VGGish) аудиосигнал преобразуется в логарифмическую мел-спектрограмму, которая затем подаётся на вход CNN. Сама спектрограмма строится с помощью БПФ, и её качество напрямую влияет на точность классификации.
Обработка изображений и компьютерное зрение
Двумерное БПФ, получаемое последовательным одномерным БПФ по строкам и столбцам, — мощный инструмент в арсенале дата-сайентиста:
- Фильтрация и улучшение изображений. Частотная фильтрация (низкочастотная для подавления шума, высокочастотная для выделения контуров) выполняется элементарным умножением спектра на маску, после чего применяется обратное БПФ. Это стандартный этап предобработки в задачах распознавания.
- Ускорение глубоких сетей. Некоторые исследовательские работы предлагают переносить свёртки внутрь нейросетей в частотную область, что может снизить вычислительную сложность для слоёв с большими фильтрами[1].
- Поиск по образцу и регистрация. Фазовая корреляция, основанная на БПФ, позволяет находить сдвиг между двумя изображениями с субпиксельной точностью, что используется при совмещении снимков, отслеживании объектов и в задачах оптического потока.
Другие направления
- Умножение многочленов и больших чисел. Умножение многочленов степени
эквивалентно свёртке коэффициентов и выполняется за
с помощью БПФ. Это находит применение в алгоритмах длинной арифметики и криптографии, а также при вычислении ядерных методов (полиномиальные ядра).
- Решение уравнений в частных производных. Спектральные методы на основе БПФ являются основным инструментом для моделирования турбулентности, прогноза погоды и физических симуляций, где требуется быстрое решение периодических задач.
- Беспроводная связь. OFDM-модуляция в Wi-Fi, LTE, 5G реализуется с помощью БПФ/ОБПФ, что обеспечивает эффективную передачу данных, однако это скорее область передачи данных, чем их анализа.
БПФ продолжает оставаться активной областью исследований: появляются разреженные БПФ (sparse FFT) для сигналов с небольшим числом ненулевых частот, квантовые алгоритмы БПФ и высокоэффективные реализации для графических процессоров.
Смотрите также
- Дискретное преобразование Фурье
- Алгоритм Кули — Тьюки
- Алгоритм Герцеля
- Оконное преобразование Фурье
- Свёртка (математический анализ)
- Цифровая обработка сигналов
- Теорема Котельникова
- FFTW

