Быстрое преобразование Фурье ( БПФ ) — это алгоритм , который вычисляет Дискретное преобразование Фурье (ДПФ) последовательности или его обратное (ОДПФ). Анализ Фурье преобразует сигнал из его исходной области (часто времени или пространства) в представление в частотной области и наоборот. ДПФ получается путем разложения последовательности значений на компоненты разных частот. [1] Эта операция полезна во многих областях, но вычисление ее непосредственно из определения часто слишком медленно, чтобы быть практичным. БПФ быстро вычисляет такие преобразования путем факторизации матрицы ДПФ в произведение разреженных (в основном нулевых) множителей. [2] В результате ему удается уменьшить сложность вычисления ДПФ из , которая возникает, если просто применить определение ДПФ, к , где n — размер данных. Разница в скорости может быть огромной, особенно для длинных наборов данных, где n может быть в тысячах или миллионах. При наличии ошибки округления многие алгоритмы БПФ гораздо точнее, чем оценка определения ДПФ напрямую или косвенно. Существует много различных алгоритмов БПФ, основанных на широком спектре опубликованных теорий, от простой арифметики комплексных чисел до теории групп и теории чисел .
Быстрые преобразования Фурье широко используются в инженерии , музыке, науке и математике. Основные идеи были популяризированы в 1965 году, но некоторые алгоритмы были получены еще в 1805 году. [1] В 1994 году Гилберт Стрэнг описал БПФ как «самый важный численный алгоритм нашего времени», [3] [4] и он был включен в Топ-10 алгоритмов 20-го века журналом IEEE Computing in Science & Engineering . [5]
Самые известные алгоритмы БПФ зависят от факторизации n , но существуют БПФ со сложностью для всех, даже простых , n . Многие алгоритмы БПФ зависят только от того факта, что является n -м примитивным корнем единицы , и , таким образом, могут применяться к аналогичным преобразованиям над любым конечным полем , таким как преобразования теории чисел . Поскольку обратное ДПФ такое же, как ДПФ, но с противоположным знаком в показателе степени и множителем 1/ n , любой алгоритм БПФ может быть легко адаптирован для него.
Развитие быстрых алгоритмов для DFT можно проследить до неопубликованной работы Карла Фридриха Гаусса 1805 года об орбитах астероидов Паллада и Юнона . Гаусс хотел интерполировать орбиты из выборочных наблюдений; [6] [7] его метод был очень похож на тот, который был опубликован в 1965 году Джеймсом Кули и Джоном Тьюки , которым обычно приписывают изобретение современного универсального алгоритма FFT. Хотя работа Гаусса предшествовала даже результатам Жозефа Фурье 1822 года, он не анализировал сложность метода и в конечном итоге использовал другие методы для достижения той же цели.
Между 1805 и 1965 годами некоторые версии БПФ были опубликованы другими авторами. Фрэнк Йейтс в 1932 году опубликовал свою версию, названную алгоритмом взаимодействия , которая обеспечивала эффективное вычисление преобразований Адамара и Уолша . [8] Алгоритм Йейтса до сих пор используется в области статистического проектирования и анализа экспериментов. В 1942 году Дж. К. Даниельсон и Корнелиус Ланцош опубликовали свою версию для вычисления ДПФ для рентгеновской кристаллографии , области, где вычисление преобразований Фурье представляло собой грозное узкое место. [9] [10] В то время как многие методы в прошлом были сосредоточены на уменьшении постоянного множителя для вычислений за счет использования «симметрий», Даниельсон и Ланцош поняли, что можно использовать «периодичность» и применить «трюк удвоения» для «удвоения [ n ] с лишь немного более чем удвоенным трудом», хотя, как и Гаусс, они не проводили анализ, чтобы обнаружить, что это приводит к масштабированию. [11]
Джеймс Кули и Джон Тьюки независимо друг от друга заново открыли эти более ранние алгоритмы [7] и опубликовали более общее БПФ в 1965 году, которое применимо, когда n является составным и не обязательно степенью 2, а также проанализировали масштабирование . [12] Тьюки выдвинул идею во время заседания Научного консультативного комитета президента Кеннеди , где темой обсуждения было обнаружение ядерных испытаний Советского Союза путем установки датчиков, чтобы окружить страну снаружи. Для анализа выходных данных этих датчиков потребовался бы алгоритм БПФ. В обсуждении с Тьюки Ричард Гарвин признал общую применимость алгоритма не только к проблемам национальной безопасности, но и к широкому кругу проблем, включая одну, которая представляла для него непосредственный интерес, определение периодичности ориентаций спинов в трехмерном кристалле гелия-3. [13] Гарвин передал идею Тьюки Кули (оба работали в лабораториях Уотсона IBM ) для реализации. [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 . Алгоритм Брууна применим к произвольным четным составным размерам.) Алгоритм Брууна , в частности, основан на интерпретации БПФ как рекурсивной факторизации многочлена , в данном случае на многочлены с действительными коэффициентами вида и .
Другая полиномиальная точка зрения используется алгоритмом Винограда FFT [21] [22], который факторизуется в циклотомические полиномы — они часто имеют коэффициенты 1, 0 или −1 и, следовательно, требуют немного (если вообще требуют) умножений, поэтому Виноград может быть использован для получения FFT с минимальным умножением и часто используется для поиска эффективных алгоритмов для малых множителей. Действительно, Виноград показал, что DFT можно вычислить только с помощью иррациональных умножений, что приводит к доказанной достижимой нижней границе числа умножений для размеров степени двойки; это достигается ценой гораздо большего количества сложений, компромисс, который больше не выгоден на современных процессорах с аппаратными умножителями . В частности, Виноград также использует PFA, а также алгоритм Рэдера для FFT простых размеров.
Алгоритм Рейдера , использующий существование генератора для мультипликативной группы по модулю простого числа n , выражает ДПФ простого размера n как циклическую свертку (составного) размера n – 1 , которая затем может быть вычислена парой обычных БПФ с помощью теоремы о свертке (хотя Виноград использует другие методы свертки). Другое БПФ простого размера принадлежит LI Bluestein и иногда называется алгоритмом chirp-z ; он также повторно выражает ДПФ как свертку, но на этот раз того же размера (который может быть дополнен нулями до степени двойки и оценен с помощью БПФ Кули–Тьюки по основанию 2, например), с помощью тождества
Гексагональное быстрое преобразование Фурье (HFFT) направлено на вычисление эффективного БПФ для данных с гексагональной выборкой с использованием новой схемы адресации для гексагональных сеток, называемой адресацией массивов (ASA).
Во многих приложениях входные данные для ДПФ являются чисто действительными, и в этом случае выходные данные удовлетворяют симметрии
и эффективные алгоритмы БПФ были разработаны для этой ситуации (см., например, Sorensen, 1987). [23] [24] Один из подходов состоит в том, чтобы взять обычный алгоритм (например, Cooley–Tukey) и удалить избыточные части вычислений, экономя примерно в два раза время и память. В качестве альтернативы можно выразить ДПФ четной длины с вещественным входом как комплексное ДПФ половинной длины (действительная и мнимая части которого являются четными/нечетными элементами исходных вещественных данных), за которым следуют операции постобработки.
Когда-то считалось, что ДПФ с действительными входными данными можно более эффективно вычислять с помощью дискретного преобразования Хартли (ДПХ), но впоследствии было высказано мнение, что обычно можно найти специализированный алгоритм ДПФ с действительными входными данными (БПФ), который требует меньше операций, чем соответствующий алгоритм ДПФ (БПХ) для того же количества входных данных. [23] Алгоритм Брууна (выше) — это еще один метод, который изначально был предложен для использования действительных входных данных, но он не стал популярным.
Существуют дополнительные специализации FFT для случаев реальных данных, которые имеют четную/нечетную симметрию, в этом случае можно получить еще один фактор примерно в два раза по времени и памяти, а DFT становится дискретным косинусным / синусным преобразованием ( DCT / DST ). Вместо того, чтобы напрямую изменять алгоритм FFT для этих случаев, DCT/DST также можно вычислять с помощью FFT реальных данных в сочетании с предварительной и последующей обработкой.
Фундаментальный вопрос давнего теоретического интереса заключается в доказательстве нижних границ сложности и точного количества операций быстрых преобразований Фурье, и многие открытые проблемы остаются. Строго не доказано, действительно ли DFT требуют (т. е. порядка или больше) операций, даже для простого случая размеров степени двойки , хотя алгоритмы с меньшей сложностью неизвестны. В частности, количество арифметических операций обычно находится в центре внимания таких вопросов, хотя фактическая производительность на современных компьютерах определяется многими другими факторами, такими как оптимизация кэша или конвейера ЦП .
После работы Шмуэля Винограда (1978), [21] известна точная нижняя граница для числа действительных умножений, требуемых БПФ. Можно показать, что для вычисления ДПФ длины степени двойки требуются только иррациональные действительные умножения . Более того, известны явные алгоритмы, которые достигают этого числа (Heideman & Burrus , 1986; [25] Duhamel, 1990 [26] ). Однако эти алгоритмы требуют слишком много сложений, чтобы быть практичными, по крайней мере, на современных компьютерах с аппаратными умножителями (Duhamel, 1990; [26] Frigo & Johnson , 2005). [17]
Нижняя граница числа требуемых сложений неизвестна, хотя нижние границы были доказаны при некоторых ограничительных предположениях относительно алгоритмов. В 1973 году Моргенштерн [27] доказал нижнюю границу числа сложений для алгоритмов, где мультипликативные константы имеют ограниченные величины (что верно для большинства, но не для всех алгоритмов БПФ). Пан (1986) [28] доказал нижнюю границу, предполагая ограничение меры «асинхронности» алгоритма БПФ, но общность этого предположения неясна. Для случая степени двойки n Пападимитриу ( 1979 ) [29] утверждал, что число сложений комплексных чисел, достигаемое алгоритмами Кули–Тьюки, является оптимальным при определенных предположениях относительно графика алгоритма (его предположения подразумевают, среди прочего, что никакие аддитивные тождества в корнях единицы не используются). (Этот аргумент подразумевает, что требуются как минимум действительные сложения, хотя это не жесткая граница, поскольку дополнительные сложения требуются как часть умножения комплексных чисел.) До сих пор ни один опубликованный алгоритм БПФ не достиг меньшего, чем сложение комплексных чисел (или их эквивалент) для степени двойки n .
Третья проблема заключается в минимизации общего числа действительных умножений и сложений, иногда называемого «арифметической сложностью» (хотя в этом контексте рассматривается именно точное число, а не асимптотическая сложность). Опять же, не было доказано никакой строгой нижней границы. Однако с 1968 года наименьшее опубликованное число для степени двойки n долгое время достигалось алгоритмом FFT с разделенным основанием , который требует действительных умножений и сложений для n > 1. Недавно это было сокращено до (Johnson and Frigo, 2007; [16] Lundy and Van Buskirk, 2007 [30] ). Было показано , что немного большее количество (но все же лучше, чем разделенное основание для n ≥ 256 ) является доказуемо оптимальным для n ≤ 512 при дополнительных ограничениях на возможные алгоритмы (поточные графы, подобные разделенному основанию, с единичными модулями мультипликативных множителей) путем сведения к проблеме выполнимости по модулю теорий, решаемой методом грубой силы (Хайнал и Хайнал, 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] Эти результаты, однако, очень чувствительны к точности коэффициентов поворота, используемых в БПФ (т. е. значений тригонометрических функций ), и для неосторожных реализаций БПФ нередко бывает гораздо худшая точность, например, если они используют неточные тригонометрические рекуррентные формулы. Некоторые БПФ, отличные от алгоритма Кули–Тьюки, такие как алгоритм Радера–Бреннера, по своей природе менее стабильны.
В арифметике с фиксированной точкой ошибки конечной точности, накапливаемые алгоритмами БПФ, хуже, при этом среднеквадратичные ошибки растут, как и для алгоритма Кули–Тьюки (Уэлч, 1969). [38] Достижение этой точности требует тщательного внимания к масштабированию, чтобы минимизировать потерю точности, а алгоритмы БПФ с фиксированной точкой включают перемасштабирование на каждом промежуточном этапе разложения, как Кули–Тьюки.
Для проверки правильности реализации БПФ строгие гарантии могут быть получены со временем с помощью простой процедуры проверки линейности, импульсной характеристики и свойств временного сдвига преобразования на случайных входах (Эргюн, 1995). [39]
Значения промежуточных частот могут быть получены различными методами усреднения.
Как определено в статье о многомерном ДПФ , многомерное ДПФ
преобразует массив x n с d -мерным вектором индексов с помощью набора d вложенных сумм (по для каждого j ), где деление выполняется поэлементно. Эквивалентно, это композиция последовательности d наборов одномерных DFT, выполняемых по одному измерению за раз (в любом порядке).
Эта композиционная точка зрения немедленно обеспечивает простейший и наиболее распространенный многомерный алгоритм DFT, известный как алгоритм строка-столбец (после двумерного случая, ниже). То есть, просто выполняется последовательность из d одномерных FFT (любым из вышеприведенных алгоритмов): сначала вы преобразуете по измерению n 1 , затем по измерению n 2 и так далее (на самом деле, любой порядок работает). Легко показать, что этот метод имеет обычную сложность, где — общее количество преобразованных точек данных. В частности, есть n / n 1 преобразований размера n 1 и т. д., поэтому сложность последовательности FFT равна:
В двух измерениях x k можно рассматривать как матрицу , и этот алгоритм соответствует первому выполнению БПФ всех строк (соответственно столбцов), группировке полученных преобразованных строк (соответственно столбцов) вместе в виде другой матрицы, а затем выполнению БПФ для каждого из столбцов (соответственно строк) этой второй матрицы и аналогичной группировке результатов в окончательную матрицу результатов.
В более чем двух измерениях для локальности кэша часто выгодно группировать измерения рекурсивно. Например, трехмерное БПФ может сначала выполнить двумерные БПФ каждого плоского «среза» для каждого фиксированного n 1 , а затем выполнить одномерные БПФ вдоль направления n 1 . В более общем смысле, асимптотически оптимальный алгоритм, игнорирующий кэш, состоит из рекурсивного деления измерений на две группы , которые преобразуются рекурсивно (округляя, если d не четное) (см. Frigo и Johnson, 2005). [17] Тем не менее, это остается простой вариацией алгоритма строка-столбец, которая в конечном итоге требует только одномерного алгоритма БПФ в качестве базового случая и все еще имеет сложность. Еще одна вариация заключается в выполнении транспозиций матриц между преобразованием последующих измерений, так что преобразования работают с непрерывными данными; это особенно важно для ситуаций вне ядра и распределенной памяти , когда доступ к ненепрерывным данным занимает чрезвычайно много времени.
Существуют и другие многомерные алгоритмы БПФ, которые отличаются от алгоритма строка-столбец, хотя все они имеют сложность. Возможно, самым простым не-строковым-столбцовым БПФ является векторный-радиксный алгоритм БПФ , который является обобщением обычного алгоритма Кули-Тьюки, где на каждом шаге делятся измерения преобразования на вектор оснований. (Это также может иметь преимущества кэширования.) Простейшим случаем векторного-радикса является случай, когда все основания равны (например, вектор-радикс-2 делит все измерения на два), но это не обязательно. Векторный-радикс только с одним неединичным основанием за раз, т. е. , по сути является алгоритмом строка-столбец. Другие, более сложные, методы включают алгоритмы полиномиального преобразования, предложенные Нуссбаумером (1977), [40] , которые рассматривают преобразование в терминах сверток и полиномиальных произведений. См. Дюамель и Веттерли (1990) [32] для получения дополнительной информации и ссылок.
Обобщение сферических гармоник на сфере S2 с n2 узлами было описано Моленкампом [ 41 ] вместе с алгоритмом, предположительно (но не доказано), имеющим сложность; Моленкамп также предоставляет реализацию в библиотеке libftsh. [42] Сферически-гармонический алгоритм со сложностью описан Рохлиным и Тигертом. [43]
Алгоритм быстрого сворачивания аналогичен БПФ, за исключением того, что он работает с серией сгруппированных волновых форм, а не с серией действительных или комплексных скалярных значений. Вращение (которое в БПФ является умножением на комплексный фазор) представляет собой круговой сдвиг компонентной волновой формы.
Различные группы также опубликовали алгоритмы «БПФ» для неравноширинных данных, как описано в работе Поттса и др. (2001). [44] Такие алгоритмы не вычисляют строго ДПФ (которое определено только для равноширинных данных), а скорее выполняют некоторую аппроксимацию ( неравномерное дискретное преобразование Фурье , или NDFT, которое само по себе часто вычисляется лишь приблизительно). В более общем смысле существуют различные другие методы спектральной оценки .
БПФ используется в программном обеспечении цифровой записи, сэмплирования, аддитивного синтеза и коррекции высоты тона . [45]
Важность БПФ вытекает из того факта, что он сделал работу в частотной области такой же вычислительно осуществимой, как и работа во временной или пространственной области. Некоторые из важных приложений БПФ включают: [15] [46]
Оригинальное применение БПФ в финансах, в частности при оценке опционов, было разработано Марчелло Миненной. [48]
Алгоритмы, связанные с БПФ:
Реализации БПФ:
Другие ссылки:
{{cite book}}
: CS1 maint: location missing publisher (link){{cite book}}
: CS1 maint: location missing publisher (link)