Быстрое преобразование Фурье ( БПФ ) — это алгоритм , который вычисляет дискретное преобразование Фурье (ДПФ) последовательности или его обратное преобразование (ИДПФ). Анализ Фурье преобразует сигнал из исходной области (часто времени или пространства) в представление в частотной области и наоборот. ДПФ получается путем разложения последовательности значений на компоненты разных частот. [1] Эта операция полезна во многих областях, но ее вычисление непосредственно из определения часто бывает слишком медленным, чтобы быть практичным. БПФ быстро вычисляет такие преобразования путем факторизации матрицы ДПФ в произведение редких (в основном нулевых) факторов. [2] В результате удается снизить сложность вычисления ДПФ от , которая возникает, если просто применить определение ДПФ, до , где n - размер данных. Разница в скорости может быть огромной, особенно для длинных наборов данных, где n может исчисляться тысячами или миллионами. При наличии ошибки округления многие алгоритмы БПФ оказываются гораздо более точными, чем прямое или косвенное вычисление определения ДПФ. Существует множество различных алгоритмов БПФ, основанных на широком спектре опубликованных теорий, от простой арифметики комплексных чисел до теории групп и теории чисел .
Быстрые преобразования Фурье широко используются в инженерии , музыке, науке и математике. Основные идеи были популяризированы в 1965 году, но некоторые алгоритмы были разработаны еще в 1805 году. [1] В 1994 году Гилберт Стрэнг описал БПФ как «самый важный численный алгоритм нашего времени», [3] [4] и был включен в десятку лучших алгоритмов 20-го века по версии журнала IEEE Computing in Science & Engineering . [5]
Самые известные алгоритмы БПФ основаны на факторизации n , но существуют БПФ со сложностью для всех, даже простых n . Многие алгоритмы БПФ зависят только от того факта, что это примитивный корень n -й степени из единицы , и, таким образом, могут быть применены к аналогичным преобразованиям над любым конечным полем , таким как теоретико-числовые преобразования . Поскольку обратное ДПФ — это то же самое, что и ДПФ, но с противоположным знаком в показателе степени и коэффициентом 1/ n , любой алгоритм БПФ можно легко адаптировать для него.
Развитие быстрых алгоритмов ДПФ можно проследить до неопубликованной работы Карла Фридриха Гаусса 1805 года об орбитах астероидов Паллада и Юнона . Гаусс хотел интерполировать орбиты на основе выборочных наблюдений; [6] [7] его метод был очень похож на тот, который был опубликован в 1965 году Джеймсом Кули и Джоном Тьюки , которым обычно приписывают изобретение современного общего алгоритма БПФ. Хотя работа Гаусса предшествовала даже результатам Жозефа Фурье 1822 года, он не анализировал сложность метода и в конечном итоге использовал другие методы для достижения той же цели.
Между 1805 и 1965 годами некоторые версии БПФ были опубликованы другими авторами. Фрэнк Йейтс в 1932 году опубликовал свою версию под названием « Алгоритм взаимодействия» , которая обеспечивала эффективное вычисление преобразований Адамара и Уолша . [8] Алгоритм Йейтса до сих пор используется в области статистического планирования и анализа экспериментов. В 1942 году Г. К. Дэниэлсон и Корнелиус Ланцос опубликовали свою версию расчета ДПФ для рентгеновской кристаллографии , области, где вычисление преобразований Фурье представляло собой серьезное узкое место. [9] [10] В то время как многие методы в прошлом были сосредоточены на уменьшении постоянного коэффициента для вычислений, используя преимущества «симметрии», Дэниэлсон и Ланцос поняли, что можно использовать «периодичность» и применить «трюк удвоения» к « double [ n ] с лишь немногим более чем удвоенным трудом», хотя, как и Гаусс, они не провели анализ, чтобы обнаружить, что это привело к масштабированию. [11]
Джеймс Кули и Джон Тьюки независимо заново открыли эти более ранние алгоритмы [7] и опубликовали более общее БПФ в 1965 году, которое применимо, когда n является составным и не обязательно представляет собой степень 2, а также для анализа масштабирования . [12] Тьюки пришла в голову эта идея во время заседания Научно-консультативного комитета при президенте Кеннеди , где обсуждалась тема обнаружения ядерных испытаний Советского Союза путем установки датчиков для окружения страны извне. Для анализа выходных данных этих датчиков потребуется алгоритм БПФ. В дискуссии с Тьюки Ричард Гарвин признал общую применимость алгоритма не только к проблемам национальной безопасности, но и к широкому кругу задач, включая одну, представляющую для него непосредственный интерес, определение периодичности ориентаций спинов в трехмерном кристалле. гелия-3. [13] Гарвин передал идею Тьюки Кули (оба работали в лабораториях IBM Watson ) для реализации. [14] Кули и Тьюки опубликовали статью за относительно короткий срок — шесть месяцев. [15] Поскольку Тьюки не работал в IBM, патентоспособность идеи была поставлена под сомнение, и алгоритм стал достоянием общественности, что благодаря компьютерной революции следующего десятилетия сделало БПФ одним из незаменимых алгоритмов в цифровой обработке сигналов .
Пусть это будут комплексные числа . ДПФ определяется по формуле
где – примитивный корень n -й степени из 1.
Оценка этого определения напрямую требует операций: имеется n выходов X k , и каждый выход требует суммы n членов. БПФ — это любой метод вычисления одних и тех же результатов в операциях. Все известные алгоритмы БПФ требуют операций, хотя нет известных доказательств того, что меньшая сложность невозможна. [16]
Чтобы проиллюстрировать экономию при использовании БПФ, рассмотрим подсчет комплексных умножений и сложений точек данных. Оценка сумм ДПФ напрямую включает в себя сложные умножения и сложные сложения, операции из которых можно сэкономить, исключив тривиальные операции, такие как умножение на 1, оставив около 30 миллионов операций. Напротив, алгоритм Кули-Тьюки с основанием 2 для n , степени 2, может вычислить тот же результат только с помощью комплексных умножений (опять же, игнорируя упрощения умножения на 1 и тому подобное) и сложных сложений, всего около 30 000 операций - в тысячу раз меньше, чем при прямой оценке. На практике реальная производительность современных компьютеров обычно зависит от других факторов, помимо скорости арифметических операций, и анализ является сложным предметом (например, см. Frigo & Johnson , 2005), [17] , но общее улучшение от до сохраняется.
Безусловно, наиболее часто используемым БПФ является алгоритм Кули – Тьюки. Это алгоритм «разделяй и властвуй» , который рекурсивно разбивает ДПФ любого составного размера на множество меньших ДПФ размеров и , а также умножения на комплексные корни из единицы, традиционно называемые коэффициентами вращения (по Джентльмену и Санде, 1966). [18]
Этот метод (и общая идея БПФ) был популяризирован публикацией Кули и Тьюки в 1965 году [12] , но позже было обнаружено [1] , что эти два автора независимо заново изобрели алгоритм, известный Карлу Фридриху Гауссу. около 1805 г. [19] (и впоследствии несколько раз переоткрыт в ограниченных формах).
Наиболее известное использование алгоритма Кули-Тьюки состоит в разделении преобразования на две части размера n/2 на каждом шаге и, следовательно, ограничено размерами степени двойки, но в целом можно использовать любую факторизацию (как было показано известный как Гауссу, так и Кули/Тьюки [1] ). Они называются случаями счисления счисления-2 и смешанного счисления соответственно (и другие варианты, такие как БПФ с разделенным основанием, также имеют свои собственные названия). Хотя основная идея является рекурсивной, большинство традиционных реализаций меняют алгоритм, чтобы избежать явной рекурсии. Кроме того, поскольку алгоритм Кули-Тьюки разбивает ДПФ на более мелкие ДПФ, его можно произвольно комбинировать с любым другим алгоритмом ДПФ, например описанным ниже.
Существуют другие алгоритмы БПФ, кроме Кули – Тьюки.
Для взаимно простых и можно использовать алгоритм простого фактора (Гуда-Томаса) (PFA), основанный на китайской теореме об остатках , для факторизации ДПФ аналогично Кули-Тьюки, но без коэффициентов вращения. Алгоритм Рейдера-Бреннера (1976) [20] представляет собой факторизацию типа Кули-Тьюки, но с чисто мнимыми коэффициентами вращения, сокращающими умножения за счет увеличения сложений и снижения числовой стабильности ; Позже он был заменен вариантом Кули – Тьюки с разделенной системой счисления (который обеспечивает тот же счетчик умножения, но с меньшим количеством сложений и без ущерба для точности). Алгоритмы, которые рекурсивно разлагают ДПФ на более мелкие операции, отличные от ДПФ, включают алгоритмы Брюуна и QFT. (Алгоритмы Рейдера-Бреннера [20] и QFT были предложены для размеров степени двойки, но возможно, что их можно адаптировать к общему составному n . Алгоритм Брюуна применим к произвольным даже составным размерам.) Алгоритм Брюуна , в частности, , основано на интерпретации БПФ как рекурсивной факторизации полинома , здесь в полиномы с реальными коэффициентами формы и .
Другая полиномиальная точка зрения используется в алгоритме БПФ Винограда [21] [22] , который разбивается на круговые многочлены — они часто имеют коэффициенты 1, 0 или -1 и, следовательно, требуют небольшого количества (если таковые имеются) умножений, поэтому Винограда можно используется для получения БПФ с минимальным умножением и часто используется для поиска эффективных алгоритмов для небольших коэффициентов. Действительно, Виноград показал, что ДПФ можно вычислить только с помощью иррациональных умножений, что привело к доказанной достижимой нижней границе количества умножений для размеров степени двойки; к сожалению, это происходит за счет многих дополнительных дополнений, а это компромисс, который больше не выгоден для современных процессоров с аппаратными множителями . В частности, Виноград также использует PFA, а также алгоритм Радера для БПФ простых размеров .
Алгоритм Рейдера , использующий существование генератора для мультипликативной группы по модулю простого числа n , выражает ДПФ простого размера n как циклическую свертку (составного) размера n – 1 , которая затем может быть вычислена с помощью пары обычных БПФ через теорема о свертке (хотя Виноград использует и другие методы свертки). Другое БПФ простого размера принадлежит Л. И. Блюстейну и иногда называется алгоритмом chirp-z ; он также повторно выражает ДПФ как свертку, но на этот раз того же размера (который может быть дополнен нулями до степени двойки и оценен, например, с помощью БПФ Кули – Тьюки по основанию 2) через тождество
Шестиугольное быстрое преобразование Фурье (HFFT) направлено на вычисление эффективного БПФ для данных с гексагональной выборкой с использованием новой схемы адресации для гексагональных сеток, называемой адресацией набора массивов (ASA).
Во многих приложениях входные данные для ДПФ являются чисто реальными, и в этом случае выходные данные удовлетворяют симметрии
и для этой ситуации были разработаны эффективные алгоритмы БПФ (см., например, Соренсен, 1987). [23] [24] Один из подходов состоит в использовании обычного алгоритма (например, Кули-Тьюки) и удалении избыточных частей вычислений, что позволяет сэкономить примерно в два раза время и память. В качестве альтернативы можно выразить ДПФ вещественного ввода четной длины как комплексное ДПФ половины длины (действительная и мнимая части которого являются четными/нечетными элементами исходных реальных данных) с последующими операциями постобработки.
Когда-то считалось, что ДПФ реального ввода можно более эффективно вычислять с помощью дискретного преобразования Хартли (ДНТ), но впоследствии утверждалось, что обычно можно найти специализированный алгоритм ДПФ реального ввода (БПФ), который требует меньше операций, чем соответствующий алгоритм DHT (FHT) для того же количества входов. [23] Алгоритм Брууна (выше) — это еще один метод, который изначально предлагался для использования реальных входных данных, но он не оказался популярным.
Существуют дополнительные специализации БПФ для случаев реальных данных, которые имеют четную/нечетную симметрию, и в этом случае можно получить еще один коэффициент примерно в два раза по времени и памяти, и ДПФ становится дискретным косинус / синусоидальным преобразованием(ями) ( DCT / DST ). Вместо прямой модификации алгоритма БПФ для этих случаев DCT/DST также можно вычислять с помощью БПФ реальных данных в сочетании с предварительной и постобработкой.
Какова нижняя граница сложности алгоритмов быстрого преобразования Фурье? Могут ли они быть быстрее, чем ?
Фундаментальным вопросом, вызывающим давний теоретический интерес, является доказательство нижних границ сложности и точного количества операций быстрого преобразования Фурье, и многие открытые проблемы остаются. Строго не доказано, действительно ли ДПФ требуют (т. е. порядка или большего) операций, даже для простого случая степени двух размеров, хотя алгоритмы с меньшей сложностью неизвестны. В частности, в центре внимания таких вопросов обычно находится подсчет арифметических операций, хотя реальная производительность современных компьютеров определяется многими другими факторами, такими как оптимизация кэша или конвейера ЦП .
Следуя работе Шмуэля Винограда (1978), [21] известна точная нижняя граница количества действительных умножений, необходимых для БПФ. Можно показать, что для вычисления ДПФ длины степени двойки требуются только иррациональные действительные умножения . Более того, известны явные алгоритмы, позволяющие добиться такого подсчета (Heideman & Burrus , 1986; [25] Duhamel, 1990 [26] ). Однако эти алгоритмы требуют слишком большого количества дополнений, чтобы быть практичными, по крайней мере, на современных компьютерах с аппаратными умножителями (Дюамель, 1990; [26] Frigo & Johnson , 2005). [17]
Точная нижняя граница количества необходимых дополнений неизвестна, хотя нижние оценки были доказаны при некоторых ограничительных предположениях в отношении алгоритмов. В 1973 году Моргенштерн [27] доказал нижнюю границу количества сложений для алгоритмов, в которых мультипликативные константы имеют ограниченные величины (что верно для большинства, но не для всех алгоритмов БПФ). Пан (1986) [28] доказал нижнюю оценку, предполагая оценку меры «асинхронности» алгоритма БПФ, но общность этого предположения неясна. В случае n степени двойки Пападимитриу ( 1979) [29] утверждал , что количество сложений комплексных чисел, достигаемых алгоритмами Кули-Тьюки, является оптимальным при определенных предположениях о графике алгоритма (его предположения подразумевают, среди прочего, кроме того, не используются никакие аддитивные тождества в корнях единицы). (Этот аргумент подразумевает, что требуются как минимум реальные сложения, хотя это не является жесткой границей, поскольку дополнительные сложения требуются как часть умножения комплексных чисел.) До сих пор ни один опубликованный алгоритм БПФ не достигал меньшего количества сложений, чем сложение комплексных чисел ( или их эквивалент) для степени двойки n .
Третья проблема — минимизировать общее количество действительных умножений и сложений, иногда называемое «арифметической сложностью» (хотя в этом контексте рассматривается точный подсчет, а не асимптотическая сложность). Опять же, не было доказано никакой жесткой нижней границы. Однако с 1968 года самый низкий опубликованный счетчик для степени двойки n долгое время достигался с помощью алгоритма БПФ с расщепленным основанием , который требует реальных умножений и сложений для n > 1 . Недавно это число было сокращено до (Джонсон и Фриго, 2007; [16] Ланди и Ван Баскирк, 2007 [30] ). Было показано , что немного больший отсчет (но все же лучше, чем разделенное основание системы счисления для n ≥ 256 ) является доказуемо оптимальным для n ≤ 512 при дополнительных ограничениях на возможные алгоритмы (потоковые графы, подобные расщепленному основанию, с мультипликативными коэффициентами единичного модуля), путем уменьшения к проблеме выполнимости по модулю теорий , которую можно решить грубой силой (Haynal & Haynal, 2011). [31]
Большинство попыток снизить или доказать сложность алгоритмов БПФ были сосредоточены на обычном случае сложных данных, поскольку он является самым простым. Однако БПФ для комплексных данных настолько тесно связаны с алгоритмами для решения подобных задач, таких как БПФ для реальных данных, дискретные косинусные преобразования , дискретные преобразования Хартли и т. д., что любое улучшение одного из них немедленно приведет к улучшению других ( Дюамель и Веттерли, 1990). [32]
Все рассмотренные выше алгоритмы БПФ точно вычисляют ДПФ (т. е. пренебрегая ошибками с плавающей запятой ). Однако было предложено несколько алгоритмов «БПФ», которые вычисляют ДПФ приблизительно с ошибкой, которую можно сделать сколь угодно малой за счет увеличения объема вычислений. Такие алгоритмы обменивают ошибку аппроксимации на увеличение скорости или других свойств. Например, приближенный алгоритм БПФ Эдельмана и др. (1999) [33] достигает меньших требований к связи для параллельных вычислений с помощью метода быстрых мультиполей . Приближенное БПФ на основе вейвлетов , разработанное Гуо и Буррусом (1996) [34], учитывает разреженные входные/выходные данные (локализация по времени/частоте) более эффективно, чем это возможно при точном БПФ. Другой алгоритм для приближенного вычисления подмножества результатов ДПФ принадлежит Шентову и др. (1995). [35] Алгоритм Эдельмана одинаково хорошо работает как для разреженных, так и для неразреженных данных, поскольку он основан на сжимаемости (дефиците ранга) самой матрицы Фурье, а не на сжимаемости (разреженности) данных. И наоборот, если данные разрежены, то есть если только k из n коэффициентов Фурье отличны от нуля, то сложность можно уменьшить до , и это, как было продемонстрировано, приводит к практическому ускорению по сравнению с обычным БПФ для n / k > 32 в примере с большим n ( n = 2 22 ) с использованием вероятностного аппроксимационного алгоритма (который оценивает самые большие k коэффициентов с точностью до нескольких десятичных знаков). [36]
Алгоритмы БПФ допускают ошибки при использовании арифметики с плавающей запятой конечной точности, но эти ошибки обычно весьма малы; большинство алгоритмов БПФ, например Кули-Тьюки, обладают превосходными числовыми свойствами вследствие структуры попарного суммирования алгоритмов. Верхняя граница относительной ошибки для алгоритма Кули-Тьюки равна , по сравнению с наивной формулой ДПФ, [18] где 𝜀 — относительная точность машины с плавающей запятой. Фактически, среднеквадратичные (rms) ошибки намного лучше этих верхних границ, только для Кули-Тьюки и для наивного ДПФ (Шацман, 1996). [37] Эти результаты, однако, очень чувствительны к точности коэффициентов, используемых в БПФ (т.е. значений тригонометрической функции ), и нет ничего необычного в том, что неосторожные реализации БПФ имеют гораздо худшую точность, например, если они используют неточные значения. тригонометрические рекуррентные формулы. Некоторые БПФ, кроме Кули-Тьюки, такие как алгоритм Рейдера-Бреннера, по своей сути менее стабильны.
В арифметике с фиксированной запятой ошибки конечной точности, накапливаемые алгоритмами БПФ, хуже, при этом среднеквадратичные ошибки растут, как и в алгоритме Кули – Тьюки (Welch, 1969). [38] Достижение такой точности требует пристального внимания к масштабированию, чтобы минимизировать потерю точности, а алгоритмы БПФ с фиксированной точкой включают изменение масштаба на каждом промежуточном этапе разложения, как Кули-Тьюки.
Чтобы проверить правильность реализации БПФ, можно получить строгие гарантии во времени с помощью простой процедуры проверки линейности, импульсной характеристики и свойств сдвига во времени преобразования на случайных входных данных (Ergün, 1995). [39]
Как определено в статье о многомерном ДПФ , многомерное ДПФ
преобразует массив x n с d -мерным вектором индексов с помощью набора d вложенных суммаций ( по каждому j ), где деление выполняется поэлементно. Эквивалентно, это композиция последовательности из d наборов одномерных ДПФ, выполняемых по одному измерению за раз (в любом порядке).
Эта композиционная точка зрения сразу же обеспечивает самый простой и наиболее распространенный многомерный алгоритм ДПФ, известный как алгоритм строки-столбца (после двумерного случая, описанного ниже). То есть просто выполняется последовательность d одномерных БПФ (по любому из вышеперечисленных алгоритмов): сначала выполняется преобразование по измерению n 1 , затем по измерению n 2 и так далее (фактически работает любое упорядочение). Легко показать, что этот метод имеет обычную сложность, где общее количество преобразованных точек данных. В частности, существует n / n 1 преобразований размера n 1 и т. д., поэтому сложность последовательности БПФ равна:
В двух измерениях x k можно рассматривать как матрицу , и этот алгоритм соответствует сначала выполнению БПФ всех строк (соответственно столбцов), группировке полученных преобразованных строк (соответственно столбцов) вместе в другую матрицу, а затем выполнение БПФ для каждого из столбцов (соответственно строк) этой второй матрицы и аналогичная группировка результатов в окончательную матрицу результатов.
При наличии более чем двух измерений для локальности кэша часто бывает выгодно группировать измерения рекурсивно. Например, трехмерное БПФ может сначала выполнять двумерное БПФ каждого плоского «среза» для каждого фиксированного n 1 , а затем выполнять одномерное БПФ в направлении n 1 . В более общем смысле, асимптотически оптимальный алгоритм без учета кэша состоит из рекурсивного разделения измерений на две группы , которые рекурсивно преобразуются (округление, если d нечетное) (см. Frigo and Johnson, 2005). [17] Тем не менее, это остается простой вариацией алгоритма строка-столбец, который в конечном итоге требует только одномерного алгоритма БПФ в качестве базового случая и по-прежнему имеет сложность. Еще одним вариантом является выполнение матричных транспозиций между преобразованиями последующих измерений, чтобы преобразования работали над смежными данными; это особенно важно для ситуаций с использованием внеъядерной и распределенной памяти , когда доступ к несмежным данным занимает чрезвычайно много времени.
Существуют и другие алгоритмы многомерного БПФ, которые отличаются от алгоритма строки-столбца, хотя все они имеют сложность. Возможно, самым простым БПФ без строк и столбцов является алгоритм БПФ с векторным основанием , который является обобщением обычного алгоритма Кули – Тьюки, в котором на каждом шаге размеры преобразования делятся на вектор оснований. (Это также может иметь преимущества для кэша.) Самый простой случай векторного основания - это когда все основания равны (например, векторное основание-2 делит все измерения на два), но это не обязательно. Векторное основание счисления только с одним неединичным основанием за раз, т. е . по существу представляет собой алгоритм строки-столбца. Другие, более сложные методы включают алгоритмы полиномиального преобразования Нуссбаумера (1977), [40] , которые рассматривают преобразование с точки зрения сверток и полиномиальных произведений. См. Дюамель и Веттерли (1990) [32] для получения дополнительной информации и ссылок.
Обобщение сферических гармоник на сфере s 2 с n 2 узлами было описано Моленкампом [41] вместе с алгоритмом , сложность которого предположительно (но не доказана); Моленкамп также предоставляет реализацию в библиотеке libftsh. [42] Алгоритм сферической гармоники со сложностью описан Рохлиным и Тайгертом. [43]
Алгоритм быстрого свертывания аналогичен БПФ, за исключением того, что он работает с серией объединенных сигналов, а не с серией действительных или комплексных скалярных значений. Вращение (которое в БПФ представляет собой умножение на комплексный вектор) представляет собой круговой сдвиг формы сигнала компонента.
Различные группы также опубликовали алгоритмы «БПФ» для неравноотстоящих данных, как описано в Potts et al. (2001). [44] Такие алгоритмы не строго вычисляют ДПФ (которое определено только для равноотстоящих друг от друга данных), а, скорее, некоторую его аппроксимацию (неравномерное дискретное преобразование Фурье , или NDFT, которое само по себе часто вычисляется только приблизительно). В более общем плане существуют различные другие методы спектральной оценки .
БПФ используется в программном обеспечении цифровой записи, дискретизации, аддитивного синтеза и коррекции высоты тона . [45]
Важность БПФ обусловлена тем фактом, что оно сделало работу в частотной области такой же вычислительной, как и работу во временной или пространственной области. Некоторые из важных применений БПФ включают: [15] [46]
Оригинальное применение БПФ в финансах , особенно при оценке опционов, было разработано Марчелло Миненной. [48]
Алгоритмы, связанные с БПФ:
Реализации БПФ:
Другие ссылки:
{{cite book}}
: |work=
игнорируется ( помощь )CS1 maint: location missing publisher (link){{cite book}}
: CS1 maint: location missing publisher (link)