УДК 621.37
Е. А. АЛЬТМАН
Омский государственный университет путей сообщения
ОПТИМИЗАЦИЯ ВЫЧИСЛИТЕЛЬНОЙ СХЕМЫ БЫСТРОГО ПРЕОБРАЗОВАНИЯ ФУРЬЕ
В статье предлагается метод повышения быстродействия функции быстрого преобразования Фурье, основанный на использовании дополнительного буфера данных с целью ускорения доступа к памяти и уменьшения количества операций над указателями.
Быстрое преобразование Фурье является одним из наиболее часто используемых алгоритмов цифровой обработки сигналов. В том или ином варианте он применяется при гармоническом анализе, кодировании различного рода мультимедиа информации, фильтрации сигналов и для решения других задач. В связи с этим большое значение имеет эффективная реализация этого алгоритма для различных цифровых и универсальных процессоров.
Под названием «быстрое преобразование Фурье» (БПФ) скрывается большое количество различных алгоритмов, вычисляющих дискретное преобразование Фурье (ДПФ), каждый из которых имеет свои преимущества. Алгоритм Винограда (\Мподгаб) проводит преобразование с минимальным количеством умножений, а алгоритм Джонсона-Барраса (ЛоЬ-пэоп-ВигшБ) имеет минимальное суммарное количество операций сложения и умножения. Наибольшее практическое распространение получили алгоритмы Кули-Тьюки (Соо1еу-Тикеу), имеющие удобную структуру для программной реализации (1 ].
Алгоритмы Кули-Тьюки позволяют организовать вычислительный процесс таким образом, чтобы на каждой стадии вычислений результаты размещались в тех же ячейках памяти, что и входные данные (так называемые вычисления «на месте», т-р1асе). Эта схема оказалась удобной в реализации и получила широкое распространение. Алгоритмов и программ, использующих другие схемы, автору обнаружить не удалось.
Вместе с тем, вычисление БПФ «на месте» обладает рядом недостатков. Основной недостаток связан с тем, что на каждой стадии данные из памяти нужно считывать не последовательно, а в определенном порядке. В некоторых вычислительных системах последовательное считывание данных из памяти выполняется быстрее, чем при произвольном доступе к памяти, кроме того, для произвольного доступа требуется использование адресной арифметики.
Для увеличения быстродействия БПФ автором была предложена следующая идея: вычислительный процесс нужно организовать таким образом, чтобы на каждой стадии данные для обработки можно было бы считывать из памяти последовательно. Для этого на предыдущей стадии результаты вычислений нужно сохранять в требуемом порядке.
При реализации этой идеи данные на различных стадиях вычислений будут расположены различным образом, т.е. организовать вычисления «на месте» при данном подходе не получится. Поэтому для хранения данных нужно использовать два буфера. В те-
кущей стадии один из них используется для входных данных, другой — для выходных, на следующей стадии они меняются местами. В русском языке мя обозначения такого подхода часто применяется термин «пинг-понг», на английском, по аналогии с обычной схемой, более удачным будет название «out-place».
Применительно к БПФ можно реализовать различные схемы типа «пинг-понг». В данной статье излагается один из возможных подходов к построению таких схем, позволяющий, по мнению автора, получить наиболее эффективные и простые в реализации алгоритмы.
Для изложения этого подхода отметим некоторые моменты, лежащие в основе алгоритмов Кули-Тьюки.
ДПФ для N точек, где N = M'L, можно выполнить более эффективно следующим способом:
— исходный массив из N элементов представляется в виде двумерной матрицы размером M"L;
— вычисляются L-точечные ДПФ всех столбцов;
— все элементы матрицы умножаются на так называемые поворачивающие множители (twiddle factors);
— вычисляются М-точечные ДПФ всех строк;
— меняются местами строки и столбцы с получением спектра сигнала.
Данная схема может применяться рекурсивно, т.е. в том случае, если L или М составное число, ДПФ строк (или столбцов) также вычисляется с помощью пред9тавления строки (столбца) в виде матрицы.
В том случае, если N является степенью двойки, рекурсивные вычисления можно реализовать, оставляя на каждой стадии столбцы (строки) из двух элементов и выполняя вычисления ДПФ для двух точек. Это будет алгоритм Кули-Тьюки по основанию 2. Если на каждой стадии выполнять ДПФ для четырех точек, то получится алгоритм по основанию 4.
Обмен строк и столбцов после каждой стадии вычислений не позволяет организовать вычисления «in-place», поэтому применяется другой подход — один раз до или после выполнения основной операции (в зависимости от того, для строк или столбцов выполняется двухточечная ДПФ) выполняется так называемая бит-реверсная (дибит-реверсная для алгоритмов по основанию 4) сортировка элементов. Соответственно различают так называемые алгоритмы с прореживанием по частоте и с прореживанием по времени [2].
Рассмотрим возможный вариант реализации «out-place» алгоритма Кули-Тьюки по основанию 2.
На входе алгоритма мы имеет N точек входного сигнала, N = 2К, где К — количество стадий алгоритма.
Рис. 1. Структура обработки данных
На первой стадии представляем входные данные в виде матрицы из двух строк. Первая строка располагается в первой половине буфера, вторая строка — во второй половине. Над элементами каждого столбца выполняется двухточечное БПФ, умножаются нужные элементы на поворачивающие множители и записываются в выходной буфер в следующем порядке: первый элемент первого двухточечного БПФ, второй элемент первого двухточечного БПФ и далее элементы других БПФ.
Графически эта операция изображена на рисунке 1. На нем прямоугольниками обозначены буферы, точками — комплексные числа, над которыми выполняется БПФ, квадратами — операция двухточечного БПФ с умножением на поворачивающий множитель. Буферы представляют собой массивы, порядок данных в которых соответствует расположению точек слева направо. Различие в расположении точек по высоте не влияет на расположения чисел в памяти и введено лишь для более наглядного изложения алгоритма.
Для завершения ДПФ необходимо выполнить ДПФ строк, т.е. ДПФ четных и нечетных элементов (на рисунке они обведены прямоугольниками со скругленными углами).
На второй стадии параллельно выполняется ДПФ двух строк, каждая из которых, в свою очередь, представляется в виде матрицы из двух строк. Первая строка располагается в первой половине буфера, вторая строка — во второй половине. Над элементами каждого столбца выполняется двухточечное БПФ, умножаются нужные элементы на поворачивающие множители и записываются в выходной буфер в следующем порядке: первый и второй элемент первого двухточечного БПФ первой строки, первый и второй элемент первого двухточечного БПФ второй строки и далее элементы других БПФ. Для одинаковых эле-
ментов каждой из строк, для которых выполняется ДПФ, используется один поворачивающий множитель.
На каждой последующей стадии число строк, над которым параллельно выполняется ДПФ, удваивается. На последней стадии в строках остается по два элемента, над которыми выполняется двухточечное преобразование. После окончания последней стадии необходимо выполнить бит-реверную сортировку.
В рассмотренном алгоритме данные на каждой стадии считываются в два потока (из первой и второй половины буфера) и сохраняются в один поток, т.е. данные считываются последовательно и не требуется использование адресной арифметики.
Аналогичным образом можно построить «пинг-понг» алгоритм по основанию 4. Считывание данных в этом алгоритме может проводиться в 4, а сохранение в один поток; коэффициенты для каждой четверки чисел загружаются один раз.
По аналогии с алгоритмами прореживания по времени и по частоте можно построить «пинг-понг» алгоритмы, считывающие данные в один поток, а сохраняющие — в 2 или 4 потока.
Рассмотренный алгоритм был реализован на процессоре ZSP400 фирмы LSI Logic. Время выполнения преобразования Фурье для 128 точек (вход — комплексные 16-битные целые числа в формате 015, нормированные на половину диапазона, для предотвращения переполнения после каждой стадии данные делятся на два), включая сохранение контекста, составило 1900тактов (менее 15тактов наточку). Этот результат на 20% быстрее наилучшего из известных результатов (2400 тактов, менее 19 тактов на точку) для алгоритмов, выполняющих вычисления «на месте» [3].
Таким образом, алгоритмы типа «пинг-понг» позволяют получать в общем случае более быстрые и простые функции для вычисления спектров сигналов. Они были использованы при разработке функций БПФ математической библиотеки для процессоров на ядрах ZSP. Разработанные функции имеют производительность на 10-20% выше оценочных значений производительности классических алгоритмов.
Библиографический список
1. Блейхут Р. Быстрые алгоритмы цифровой обработки сигналов - М., Мир, 1989 - 445 с.
2. Рабинер Л., Гоулд Б. Теория и применение цифровой обработки сигналов — М„ Мир, 1978 — 835 с.
3. Форум разработчиков для процессоров ZSP http:// www.zsp-ug.com
АЛЬТМАН Евгений Анатольевич, кандидат технических наук, доцент кафедры АиСУ.
Статья поступила в редакцию 27.11.06 г. © Альтман Е.А.