Введение
На прошлой лекции мы изучили, что такое дискретное преобразование Фурье (ДПФ), изучили его свойства, подводные камни, способы улучшения результатов, а также частотно-временное преобразование Фурье.
(1)
Из него видно, что для расчёта -точечного ДПФ требуется вычислений с комплексными числами. Получается ресурсозатратно, особенно если мы имеем дело с большим количеством отсчётов.
Учёным не нравилось делать много вычислений, и несколько человек (существуют разные мнения, кто был первым) предложили алгоритмы, позволяющие вычислять ДПФ, производя меньшее количество математических операций. Называются такие алгоритмы Быстрое преобразование Фурье (БПФ).
Хочу сразу отметить, что БПФ возвращает абсолютно такие же результаты, что и ДПФ, использует в основе ту же формулу, только позволяет достичь этих результатов гораздо быстрее.
В рамках данной лекции рассмотрим два самых распространённых алгоритма БПФ — с прореживанием по времени и с прореживанием по частоте.
Итак, выше мы уже отметили, что для -точечного ДПФ требуется операций комплексного умножения и сложения. А что, если разделить исходный сигнал на два длиной отсчётов каждый? Тогда получается, что для вычисления ДПФ от одной из половин потребуется математических операций. Или для двух половин (если не считать процедуру разделения и объединения). Получается, эффективность вычислений возрастает в два раза! Но это ещё не предел. Мы можем делить наш сигнал до тех пор, пока не получим набор из сигналов, состоящих из двух отсчётов:
Теперь давайте немного модифицируем выражение (1). Пусть , тогда:
(2)
На примере сигнала из отсчётов рассчитаем несколько значений :
Можно заметить, что первая половина значений отличается от второй половины только знаком:
Если произведение выходит за диапазон от 0 до 7, мы также увидим повторяемость этих значений. Например, при , а :
Следовательно, в процессе ДПФ вычисление одних и тех же значений повторяется несколько раз. Наша задача — оптимизировать процесс так, чтобы избежать выполнение повторяющихся операций.
Алгоритм БПФ с прореживанием по времени
Давайте разделим сигнал на отсчёты с чётными и нечётными номерами, как показано на рисунке:
Эта операция называется прореживание по времени. Математически это можно записать следующим образом:
(3)
(4)
(5)
Тогда, выражение (3) принимает вид:
(6)
Это был расчёт ДПФ для первых отсчётов. Теперь запишем подобное выражение для второй половины отсчётов:
(7)
Давайте теперь по очереди разбираться со всеми множителями:
(8)
Т.к. , то выражение (8) принимает вид:
(9)
Рассмотрим следующий множитель:
(10)
(11)
то выражение (10) можно упростить:
(12)
Подставим результаты из (9) и (12) в уравнение (7) и получим:
(13)
Для простоты восприятия сделаем две замены:
(14)
(15)
Тогда, с учётом (14) и (15), сгруппируем уравнения (6) и (13):
(16)
Полученное выражение (16) называется графом “бабочка”. Почему? Это станет ясно, если посмотреть на его графическое представление:
Данное выражение лежит в основе БПФ с прореживанием по времени.
Таким образом, берём анализируемый сигнал и продолжаем разбивать его на сигналы, состоящие из чётных и нечётных индексов до тех пор, пока не получим набор сигналов из двух отсчётов. На рисунке ниже показан пример такого разбиения для сигнала из восьми отсчётов.
Для вычисления ДПФ такого сигнала требуется 3 стадии разбиения. На первом этапе получаем набор из четырёх ДПФ от сигналов из двух отсчётов:
Далее, на основе полученных результатов формируется два ДПФ для сигналов, состоящих из четырёх отсчётов:
И на последнем этапе формируются итоговые результаты восьмиточечного ДПФ:
ДПФ рассчитано!
Двоично-инверсная перестановка
Если количество отсчётов исходного сигнала , где — целое положительное число, то его разбиение на сигналы, состоящие из чётных и нечётных индексов вплоть до последнего уровня можно сделать легко и за одну итерацию с помощью двоично-инверсной перестановки.
Для этого записываем индексы всех отсчётов в двоичной системе счисления, при этом должны быть записаны все бит индекса, включая ведущие нули. Затем зеркально отображаем код каждого из этих двоичных чисел и записываем полученные результаты обратно в десятичную систему счисления. Готово! Если расставить элементы исходного массива в соответствии с полученными индексами, мы получим подряд идущие пары отсчётов для двухточечного ДПФ. Пример, как это работает для сигнала из восьми отсчётов, представлен в таблице:
Номер до перестановки | Двоичное | Двоично-инверсная перестановка | Десятичное |
---|---|---|---|
0 | 000 | 000 | 0 |
1 | 001 | 100 | 4 |
2 | 010 | 010 | 2 |
3 | 011 | 110 | 6 |
4 | 100 | 001 | 1 |
5 | 101 | 101 | 5 |
6 | 110 | 011 | 3 |
7 | 111 | 111 | 7 |
Можете сравнить с рисунком выше, действительно совпадает. Именно поэтому, рассматриваемые нами алгоритмы также называются БПФ по основанию два. У них есть одно небольшое ограничение — количество отсчётов анализируемого сигнала должно быть равно степени двойки (например, 16, 32, 64, 128, 256 и т.д.). “Но как же быть, если, скажем, в моём сигнале всего 200 отсчётов?” — спросите вы. Ничего страшного, нужно просто дополнить сигнал нулевыми отсчётами, пока его длина не станет равна ближайшей степени двойки.
Алгоритм БПФ с прореживанием по частоте
Как вы догадались из названия раздела, прореживать можно не только время, но ещё и частоту. Граф “бабочка” для БПФ с прореживанием по частоте показан на рисунке:
Подробно рассматривать данный алгоритм не будем, просто примем его как данность. Пример БПФ с прореживанием по частоте для сигнала, состоящего из 8 отсчётов показан ниже:
Прореживание (двоично-инверсная перестановка) в данном случае производится уже после вычисления ДПФ, т.е. по частотным отсчётам, отсюда и такое название.
По количеству операций умножения данный алгоритм схож с алгоритмом прореживания по времени, поэтому эффективность их схожая. Какой метод выбрать — решать вам.
Поворотные коэффициенты
В вышеупомянутых “бабочках” есть множитель . Он называется поворотным коэффициентом. На нижнем уровне БПФ, когда имеем дело с двумя отсчётами, требуется всего один поворотный коэффициент . Умножение на единицу считается тривиальной операцией, откуда следует, что на первом уровне не требуется ни одной операции умножения, только сложение и вычитание.
На втором уровне у нас получается два поворотных коэффициента и . Умножение на также делается просто: нужно поменять местами действительную и мнимую часть, а также инвертировать знак мнимой части. На этом уровне также не требуется операций умножения.
На следующем уровне требуется четыре поворотных коэффициента , , и , их значения мы рассчитывали в начале нашей статьи.
Давайте проиллюстрируем на графике все упомянутые выше поворотные коэффициенты (и даже немного больше):
Из графика видно, что на каждом следующем уровне количество поворотных коэффициентов увеличивается в два раза, при этом половина из них совпадает с поворотными коэффициентам предыдущего уровня.
Когда БПФ используется для решения каких-либо задач в устройствах цифровой обработки сигналов, количество отсчётов анализируемого сигнала как правило заранее известно и скорее всего не будет меняться в процессе работы устройства. Поэтому, чтобы не тратить время на вычисление , их заранее рассчитанные значения для заданного количества отсчётов и всех уровней разбиения записывают в памяти в виде таблицы констант, которые в дальнейшем будут использоваться для умножения в графах “бабочка”.
Выводы
БПФ — это всего лишь алгоритм эффективного вычисления ДПФ, поэтому результаты вычисления БПФ и ДПФ получаются абсолютно идентичны.
Для вычисления ДПФ сигнала, состоящего из отсчётов нам требуется вычислений с комплексными числами, в случае с БПФ — вычислений с комплексными числам.
Чтобы наглядно продемонстрировать эффективность алгоритма, давайте взглянем на таблицу:
Кол-во отсчётов, N |
Количество вычислений с комплексными числами |
Эффективность | |
---|---|---|---|
ДПФ | БПФ | ||
256 | 65 536 | 1 024 | 64:1 |
512 | 262 144 | 2 304 | 114:1 |
1024 | 1 048 576 | 5 120 | 205:1 |
2048 | 4 194 304 | 11 264 | 373:1 |
4096 | 16 777 216 | 24 576 | 683:1 |
Особенно заметен прирост эффективности с увеличением количества отсчётов.
Скачать конспект в pdf: FFT Lecture – V.V. Leonidov.pdf
Comments (1)