УДК 517.443
Н.А. ГАЛАНИНА, А.Д. ЕФИМОВ
МОДЕЛИРОВАНИЕ ОПТИМАЛЬНЫХ АЛГОРИТМОВ БЫСТРОГО ПРЕОБРАЗОВАНИЯ ФУРЬЕ И ИХ СРАВНИТЕЛЬНЫЙ АНАЛИЗ
Ключевые слова: быстрое преобразование Фурье (БПФ), позиционная система счисления, система счисления в остаточных классах, сигнальный процессор, аналого-цифровое преобразование.
Разработан программный комплекс моделирования быстрого преобразования Фурье, включающий программу генерации сигнала, его аналого-цифровое преобразование и модули, реализующие вычисление преобразования Фурье в позиционной и непозиционных системах счисления. Проведена оценка временных и аппаратурных затрат.
N.A. GALANINA, A.D. EFIMOV OPTIMUM FFT ALGORITHMS MODELING AND THEIR COMPARATIVE ANALYSIS
Key words: Fast Fourier Transform (FFT), Position Calculator System, Remain class System, Digital Signal, Analog-to-Digital Converter.
Program Complex modeling FFT and including Signal Generation Program, its Analog-to-Digital Converter and modules realizing FFT in position and non-position System was designed. Time and device expenditures were organized, also.
Разработанный программный комплекс моделирования БПФ содержит, во-первых, программу генерации сигнала, воздействующего на систему обработки и его последующее аналого-цифровой преобразование, и, во-вторых, программные модули, реализующие вычисление БПФ в позиционной и непозиционной системах.
Упрощённая структура модулей разработанного программного комплекса приведена на рис. 1.__________
Интерфейс прикладной
Модуль генерации отсчётов сигнала
Настройка АЦП сигнала
Модуль АЦП генерированного сигнала
Отображение генерированного
DevExpress.XtraGrid
Модуль обработки переполнения в результате выполненной операции
РБТ. Модуль вычисления БПФ в СОК
Модуль упаковки данных
Чтение упакованных данных
Запись упакованных данных
Модуль генерации поворачивающих множителей
Модуль выгрузки в файл
Файловое хранилище
Рис. 1. Структура модулей программного комплекса
Статистическое моделирование сигналов сводится к формированию последовательности случайных чисел, подчиняющихся заданному закону распределения вероятностей. Для большинства систем обработки основным входным воздействием является аддитивная смесь гауссовской коррелированной помехи и когерентного полезного сигнала. Вследствие узкополосности сигналов, наблюдаемых на входе таких систем, их удобно представить с помощью синфазной и квадратурной составляющих в комплексной форме. Смесь сигнала и помех можно записать в виде
¥к = (Яс Як + ЯпПк +$ к + Яип5ип , (!)
где яс, яп, яип - вещественные коэффициенты, определяющие вклад полезного
сигнала, коррелированной и импульсной помех, соответственно, в мощность наблюдаемого сигнала относительно «белого» гауссовского шума £ с единичной дисперсией; Як, цк, 5 ип - отсчеты комплексных огибающих, соответственно полезного сигнала, коррелированной и импульсной помех в к-й момент времени; Жк - огибающая пачки импульсов. Рассмотрим моделирование сигналов, входящих в (1).
Для моделирования пассивной помехи пк используется двухсвязная цепь. Тогда выражение для коррелированной помехи примет вид
Пк = Ь1Пк-1 + Ь2 Пк-2 +у1 1 - (Ь1 К1 + Ь2 К2)$ к , (2)
где $ к - случайный сигнал с нормальным распределением при нулевом ма-
тематическом ожидании и единичной дисперсии; Ь1 и Ь2 - коэффициенты, определяемые по формулам:
= ^г-^; ь2 = , (3)
1 Я1 -1 Я1 -1
здесь Я1 и Я2 - коэффициенты корреляции, рассчитываемые по формулам:
Я1 = ехр
п
; Я2 = ехр
/02Г
V 2,8 ,
(4)
Для начальных выборок при к = 1, 2, 3 значение цк определяется следующим образом:
п =$1; ________
П2 = Ь1П1 +41 - Ь1$ 2;_______________ (5)
Пз = Ь1П2 + Ь2П + д/1 - (Ь1 Е1 + Ь2Я2)$з;
Сигнал Як рассчитывается по формуле:
Як = Я • БЯ, (6)
где S - комплексное число, определяемое по формуле
Я = С08(ф) + ] 8т(ф) , (7)
где ф - равномерно распределенная начальная фаза (фе[-п;п]); БЯ - комплексное число, которое находится по формуле
БЯ = с08(п • Б¥) + ] 8т(п • Б¥), (8)
где В¥ - относительная частота сигнала:
DF = T • fo • к . (9)
Реализация обоих алгоритмов была осуществлена на процессоре семейства TigerSHARC-101 компании Analog Devices. Архитектура этих процессоров совмещает технологии VLIW и SIMD и поддерживает параллельное выполнение до 4 операций умножения 32-разрядных чисел с плавающей точкой. Процессоры семейства также работают на более высоких частотах: до 600 МГц. Процессоры ADSP-TS10x/20x работают с данными различной разрядности и поддерживают формат как с фиксированной, так и с плавающей точкой. По этой причине данное семейство может быть также классифицировано и как высокопроизводительный чип с фиксированной точкой. Процессоры TigerSHARC отличаются еще и тем, что содержат память DRAM на кристалле.
Процессор TigerSHARC - это статический суперскалярный DSP-процессор, имеющий ультравысокую производительность и оптимизированный на выполнение задач, требующих обработки больших объемов сигнальной информации в реальном масштабе времени. На сегодняшний день TigerSHARC обеспечивает наиболее высокую производительность, гибкость и эффективность.
Минимальные требования к системе следующие:
- ОС Windows 2000/Server 2003/XP/Vista/Server 2008;
- Microsoft .NET Framework версии 3.5 и выше;
- 256 Мб ОЗУ (рекомендуется 1024 Мб);
- процессор с частотой 1 ГГц (рекомендуется 2 ГГц).
Программа написана в IDE MS Visual Studio 2008 на языке программирования C# с использованием библиотеки классов .NET версии 3.5, а также с использованием сторонней библиотеки Exocortex.DSP, реализующей некоторые алгоритмы цифровой обработки сигналов.
Программа состоит из модулей, выполненных в отдельных файлах. Взаимодействие модулей между собой реализуется при помощи инструментов среды разработки. Для функционирования программы необходима установка пакета MS.NET Framework версии 3.5 или выше.
Кроме того, имеется исходный XAML-код построения пользовательского интерфейса. Основными модулями программы являются классы SignalGenerator и ADCHelper.
Класс SignalGenerator ответствен за моделирование сигнала входного воздействия, и основным результатом работы объекта этого класса является коллекция отсчётов генерированного сигнала.
Метод NextNormalRandom возвращает случайное число, полученное с нормальным («гауссовским») распределением.
Метод GenerateWhiteNoise генерирует заданное параметром count количество отсчётов белого шума.
Метод DegToRadians преобразует значение, заданное в градусах, в значение, заданное в радианах.
Метод GenerateSignal генерирует отсчёты входного сигнала, воздействующего на систему обработки, в соответствии с заданными параметрами.
Блок-схема алгоритма, реализованного в методе GenerateSignal, представлена на рис. 2.
Класс ADCHelper отвечает за моделирование аналого-цифрового преобразования входного сигнала при заданных параметрах. В результате работы объекта этого класса программист также получает серию отсчётов сигнала, прошедшего через этап АЦП.
Метод Discretize производит дискретизацию сигнала, заданного первым входным параметром с частотой, заданной вторым входным параметром.
Метод Quantize производит квантование сигнала по уровням в соответствии с заданной разрядностью квантованного числа.
Метод MakeADC производит непосредственно моделирование аналогоцифрового преобразования входного сигнала, которое заключается в последовательном вызове методов Discretize и Quantize. Причём в качестве параметра в метод Quantize передаётся результат, возвращённый методом Discretize, после чего уже результат, возвращённый методом Quantize, получает программист, использующий объект ADCHelper.
Для разработки процессорной программы использован пакет VisualDSP++.
Процесс отладки проекта после написания кода программы и успешной компиляции включает три основных этапа: моделирование (Simulation), оценку (Evaluation) и эмуляцию (Emulation). На этапе моделирования работает моделирующая программа (симулятор), которая имитирует работу процессора.
Симулятор используется для проверки и отладки программного кода до того, как будет изготовлена плата с процессором. Интерфейс пакета VisualDSP++ - единый для всех серий сигнальных процессоров, включая 16-, 32-битные, а также TigerSHARC и Blackfin.
Общие сведения о программе. Разработанная программа реализована в IDE VisualDSP++ и предназначена для оценки затрат времени и памяти на вычисление БПФ с использованием средств позиционной и непозиционной арифметики. Рассматривались следующие возможные случаи:
- вычисление БПФ в позиционной системе счисления без учёта возможного переполнения в результате выполненной операции;
- вычисление БПФ в позиционной системе счисления с учётом возможного переполнения в результате выполненной операции;
- вычисление БПФ в системе остаточных классов с оптимизацией по времени;
- вычисление БПФ в системе остаточных классов с оптимизацией по памяти.
Оценка временных затрат проводилась путём получения значения процессорного счётчика циклов соответственно до и после вычисления БПФ указанным методом, после чего вычислялась разность между этими двумя значениями.
Минимальные системные требования следующие:
- ОС Windows 98/2000/Server 2003/XP/Vista/Server 2008;
- установленная среда разработки Visual DSP++ 5.0 и симулятор;
- процессор ADSP TS-101 либо отладочная плата EZ-KIT c интерфейсом аппаратной отладки JTAG;
- 128 Мб ОЗУ;
- процессор с частотой 533 МГц.
Ввод коэффициентов:
Оэ - сигнал,
Оп - коррелир-я помеха, Оип - импульсная помеха, частота ^ , периода Т,
N - количество отсчётов
Выбирается п значений из случайной последовательности, подчиняющейся равномерному распределению. Значения п=12 достаточно для получения «гауссового» шума
Рассчитываем отсчёты коррелированной помехи, начиная с третьего отсчёта и основывась на предыдущих двух отсчётах
Моделирование отсчёта «белого» гауссовского шума с
п ЛУ2 п
тг)
Инкремент /;
Расчёт первых двух отсчётов коррелированной помехи:
П = $1 _________
П = Ь1П +л] 1 - Ь1Л$2
Расчёт очередного отсчёта коррелированной помехи
ьап*-1 + ь2Пк-2 + V1 - (ЬЛ + ь2 кг)$к
Инкремент I;
БК=Т/0 •к
БЯ = соя(ж* БК) + ] 8т(ж* БК)
Я = С08( ф) + у Бт( ф)
Як = Я * БЯ
7к = («А + ЯпПк + $ + Яип5ип
Инкремент /';
Рассчитываем результирующую смесь сигнала и помехи
Величина ф расположена равномерно на отрезке
[-я; я]
Конец
Рис. 2. Блок-схема алгоритма моделирования сигнала
Руководство программиста. Программа состоит из нескольких модулей, каждый из которых реализует один из методов вычисления БПФ или является вспомогательным модулем. Модули в данном случае представлены функциями, реализованными на языках Си или Assembler.
Функция extern "C" float FFT(float* samples, float* twiddles) вычисляет БПФ отсчётов сигнала, хранящихся в массиве samples, проводя вычисления в позиционной системе счисления. Кроме того, вторым параметром в функцию передаётся массив поворачивающих множителей. Функция построена таким образом, что вначале вычисляется необходимое количество этапов БПФ. Отметим, что вычисления производятся «по группам» с общим поворачивающим множителем. Таким образом, операция чтения поворачивающего множителя из массива производится для группы один раз на каждом из этапов вычисления БПФ. Блок-схема функции приведена на рис. 3
Функция extern "C" void FFT_SOK(int* samples, float*twiddles) вычисляет БПФ отсчётов сигнала, записанных в массиве samples аналогично функции FFT, но в СОК. При установленном макросе #define MEMORY массив samples воспринимается функцией как массив упакованных данных.
Функция extern "C" void WriteValue(int* array, int elenemtNumber, int value) записывает значение value в массив упакованных данных по индексу elementNumber. Блок-схема этой функции приведена на рис. 4.
Функция extern "C" int ReadValue(int* array, int elenemtNumber) возвращает значение элемента массива упакованных данных array по индексу ele-mentNumber. Алгоритм работы этой функции аналогичен алгоритму работы WriteValue за тем исключением, что производится чтение.
Функция extern "C" void PackData(int* output, void* input) производит упаковку данных массива input в массив меньшего размера output. Алгоритм работы функции PackData приведён на рис. 5, а на рис. 6 показан пример ее работы.
Функция extern "C" float FFT_Checks(float* samples, float* twiddles) производит вычисление БПФ с осуществлением проверки переполнения регистра в результате операций, а также с масштабированием сигнала в случае обнаружения такого переполнения.
Функция void OverflowCheck(int* data, int length) осуществляет проверку переполнения через регистр XSTAT и, в случае обнаружения, масштабирует данные в массиве data длиной length.
Функция void SwapToBitReversed(float* input, int N) переставляет элементы массива input длиной N в соответствии с бит-реверсным порядком.
Результаты тестовых испытаний. Испытание каждого метода вычисления БПФ проводилось следующим образом:
- посредством прикладной программы генерировались отсчёты сигнала и моделировалось АЦП, после чего полученные отсчёты записывались в файл в текстовом формате;
- затем отсчёты из данного файла статически попадали в массивы данных в процессорной программе путём использования директивы препроцессора #include;
- на следующем этапе процессорная программа компилировалась и запускалась на исполнение, в процессе чего вычислялось БПФ каждым из реализованных методов;
- для каждого из методов измерялось затраченное процессорное время в циклах, а затем выводилось на консоль среды разработки.
В случае работы алгоритма в СОК после каждой операции берётся модуль числа по основанию канала СОК
При работе с упакованными данными запись также производится посредством специальных функций
Рис. 3. Блок-схема функции т с комментариями изменений, касающихся ЕЕТ_БОК
Если число не помещается полностью в текущую ячейку массива, выбирается следующая за ней и недостающие биты дописываются в неё '
Рис. 4. Блок-схема алгоритма работы функции Шп1;еУа1ие
Рис. 5. Блок-схема алгоритма работы функции РасШа1а
00... 000111000
N8 = 5 <56>5 = 110= 0001 2 (4 бита)
0 0 0 1
Рис. 6. Пример работы функции РасШа1а Результаты тестовых испытаний приведены на рис. 7.
200000
32 64 256 512 1024
Количество точек, ед.
Рис. 7. Результаты испытаний методов вычисления БПФ
Реализация вычисления БПФ в СОК, как можно увидеть из рис. 7, выигрывает в скорости вычислений у реализации вычисления БПФ в ПСС с проверкой переполнения регистров. Следует заметить, что наименьшее количество циклов затрачивается на вычисление БПФ в ПСС, но без осуществления проверок переполнения, что оправдано только при очень малом динамическом диапазоне сигнала и не подходит для наиболее распространенных практических случаев. Необходимо отметить, что специфика вычисления БПФ в СОК требует некоторого увеличения аппаратных затрат, хотя наличие двух вычислительных блоков в процессоре ЛБ8Р Т8-101 позволяет организовать одновременное вычисление в двух каналах БПФ в СОК. Наиболее затратной с точки зрения процессорного времени оказалась реализация БПФ в СОК с оптимизацией использования памяти. Это связано с тем, что оптимизация памяти предполагает реализацию и постоянное использование специальных методов доступа к упакованным данным, которые хранятся не в соответствии с процессорным выравниванием, а более плотно. На рис. 8 можно увидеть зависимость степени упаковки данных от модуля канала СОК.
Модуль канала СОК, ^
Рис. 8. Зависимость степени упаковки данных от модуля канала СОК
Следует отметить, что возникающие проблемы с аппаратными затратами БПФ в СОК связаны как с архитектурной, так и с аппаратной нацеленностью современных процессоров на использование ППС.
Литература
1. Блейхут Р. Быстрые алгоритмы цифровой обработки сигналов: пер. с англ. / Р. Блей-хут. М.: Мир, 1989. 448 с.
2. Лебедев Е.К. Быстрые алгоритмы цифровой обработки сигналов / Е.К. Лебедев. Красноярск: Изд-во Краснояр. ун-та, 1989. 192 с.
3. http://www.fastvideo.ru/info/dsp/tigersharc/ts201.htm.
ГАЛАНИНА НАТАЛИЯ АНДРЕЕВНА - кандидат технических наук, доцент кафедры математического и аппаратного обеспечения информационных систем, Чувашский государственный университет, Россия, Чебоксары (galaninacheb@mail.ru).
GALANINA NATALIYA ANDREEVNA - candidate of technical sciences, associate professor of math and hardware information systems char, Chuvash State University, Russia, Cheboksary.
ЕФИМОВ АЛЕКСАНДР ДМИТРИЕВИЧ - студент V курса, Чувашский государственный университет, Россия, Чебоксары (ead@mail.ru).
EFIMOV ALEKSANDR DMITRIEVICH - student, Chuvash State University, Russia, Cheboksary.