В этой части книги говорится об установке на компьютер современного средства разработки программ для сигнальных процессоров — программного пакета Visual DSP++, его запуске и работе. Приводятся примеры программ и их отладка в среде разработки. Демонстрируется спектральный анализ сигнала с помощью Visual DSP++. Рассказывается о программировании на Си в данной среде разработки.
В этой главе говорится об установке на компьютер современного средства разработки программ для сигнальных процессоров — программного пакета Visual DSP++.
После знакомства с архитектурой и аппаратными блоками сигнального процессора, а также с его системой команд и директивами языка программирования, пришло время познакомиться с программами, реализующими различные методы математической обработки с помощью сигнального процессора.
В предыдущих материалах мы рассмотрели средства программирования сигнальных процессоров для операционной системы MS DOS. В настоящее время существует более мощное и современное средство программирования для операционной системы Windows, которое носит название Visual DSP++.
Для знакомства с новыми примерами программ удобнее использовать Visual DSP++, поскольку он имеет интегрированный интерфейс разработчика и обладает мощными средствами визуализации и отладки программ. В этом читатели вскоре смогут убедиться самостоятельно.
Программный пакет Visual DSP++ свободно распространяется фирмой Analog Device со своего сервера в Интернете. Он представляет собой тестовую (trial) версию и может быть загружен по адресу http://www.analog.com/processors/resources/crosscore.
Кроме самого программного пакета, необходимо скачать инсталлятор лицензий и пройти бесплатную регистрацию на сервере для получения лицензии.
Тестовую версию Visual DSP++, кроме Интернета, можно получить в представительстве компании Analog Device, или у официальных дистрибьюторов компании на компакт-диске. Фирма Analog Device периодически создает новые версии Visual DSP++, тем не менее при этом соблюдается совместимость с предыдущими программными продуктами, и интерфейс данного пакета легко узнаваем для любой версии. Поскольку описываемый программный пакет не русифицирован и содержит всю информацию на английском языке, ниже дается методика установки программного пакета Visual DSP++, с целью избавления от ошибок при установке пакета и экономии времени читателей.
Рассмотрим поэтапно установку программного пакета Visual DSP++ на примере версии 3.0.
Вначале необходимо загрузить файл программы установки пакета и файл программы его лицензирования с источника, указанного выше. После успешной загрузки программ установки и лицензирования, необходимо получить серийный номер для последующей регистрации пакета, зайдя в Интернет по ссылке http://forms.analog.сom/Form_Pages/processors/visualDSPTestDrive.sp и заполнив одностраничную форму. Серийный номер пакета будет выслан вам по электронной почте на адрес, который вы укажете в анкете.
Для установки пакета на компьютер необходимо иметь не менее 100 Мб свободного дискового пространства. Процесс установки Visual DSP++ начинается с запуска самораспаковывающегося файла VisualDSP++3.0for21xx.exe. При этом на экране монитора отобразится окно (рис. 22.1), текст которого сообщает о том, что вам будет предложен каталог для распаковки пакета перед его установкой.
Рис. 22.1
Этот временный каталог необходим только для установочных целей и не является конечным каталогом, куда будет окончательно установлено приложение.
Если вы установили ранее любое из аппаратных устройств (например, такое, как EZ-KIT Lite, или аппаратные средства ICE), вам понадобится в дальнейшем указать «Мастеру Новых Устройств» на этот каталог, когда Windows пытается установить драйверы устройств.
Ознакомившись с данным сообщением, необходимо нажать программную кнопку «Далее». При этом появится новое окно (рис. 22.2), в котором предлагается ввести название временного каталога, куда будут распакованы файлы программы. Если указанный каталог не существует, его необходимо будет создать. Вы можете вручную подкорректировать указанный каталог или выбрать его из созданных ранее, нажав кнопку «Browse». После чего необходимо нажать кнопку «Continue».
Рис. 22.2
Далее программа предложит создать несуществующий каталог (рис. 22.3) и начнет распаковку файлов в этот каталог (рис. 22.4), если будет нажата кнопка «Да».
Рис. 22.3
Рис. 22.4
После чего на экране кратковременно отобразится окно с цветной заставкой программного пакета Visual DSP++ (рис. 22.5) и откроется окно с приглашением процедуры установки пакета (рис. 22.6). В этом окне сообщается о том, что на вашу систему будет произведена установка программного обеспечения для сигнальных процессоров семейства 218x и 219x, инструменты, спецификации и документация.
Рис. 22.5
Рис. 22.6
После нажатия на кнопку «Next» установка будет продолжена и на экране отобразится лицензионное соглашение (рис. 22.7), определяющее права и обязанности пользователя данного продукта. Для продолжения установки необходимо подтвердить свое согласие с условиями использования пакета путем нажатия кнопки «Yes».
Рис. 22.7
Далее будет предложено ввести ваше имя и название компании (рис. 22.8). Здесь необходимо ввести те имена, которые вы использовали при заполнении анкеты на получение серийного номера для регистрации пакета, например Ivan Soft.
Рис. 22.8
Нажмите на кнопку «Next», и перед вами откроется новое окно установки (рис. 22.9), в котором предлагается ввести рабочий каталог программы, куда будет установлен сам программный пакет Visual DSP++.
Рис. 22.9
Здесь можно оставить все без изменений или выбрать другой каталог, по аналогии с процедурой определения временного каталога для установки программы.
Для продолжения установки нажмите кнопку «Next». Теперь откроется окно выбора устанавливаемых компонентов (рис. 22.10).
Рис. 22.10
Здесь необходимо отметить те вспомогательные компоненты, которыми вы располагаете. В нашем случае можно отметить ADSP 2181 EZ-KIT Lite, поскольку тестовая плата, описанная ранее, совместима с указанным устройством, и ею можно пользоваться, так же как отладочным средством ADSP 2181 EZ-KIT Lite. В принципе, можно отметить все компоненты или, наоборот, не отмечать ни одного дополнительного компонента, поскольку сам программный пакет Visual DSP++ в любом случае все равно будет работоспособен. Установка компонентов влияет лишь на присутствие или отсутствие дополнительных функций пакета.
После нажатия кнопки «Next» процесс инсталляции продолжится, и на экране начнется отображение окон, подобных представленным на рис. 22.11 и рис. 22.12, в которых сообщается об именах распаковываемых файлов и краткая информация о самом пакете соответственно.
Рис. 22.11
Рис. 22.12
Заканчивается первый этап установки отображением окна приведенного на рис. 22.13, в котором сообщается об успешном окончании установки и предлагается нажать кнопку «Finish» для завершения установки.
Рис. 22.13
Следующим шагом в установке пакета является его регистрация. Для выполнения этой процедуры необходимо запустить файл лицензирования LicenseInstaller5RC45.exe, который после запуска отобразит окно (рис. 22.14) с сообщением, в котором предлагается выбрать тип лицензии.
Рис. 22.14
Самым простым и распространенным видом лицензирования является установка одиночного пользователя лицензии (Install Single User License).
Для выполнения этого выбора необходимо нажать соответствующую надпись в окне. После нажатия программной кнопки «Next» на экране появится окно с содержанием лицензионных прав (рис. 22.15).
Рис. 22.15
Для продолжения установки необходимо подтвердить свое согласие с условиями использования пакета путем нажатия программной кнопки «Yes». После этого появится окно (рис. 22.16) с предложением ввести серийный номер продукта, который был выслан вам по электронной почте и обычно представляет собой строку, состоящую из 3 букв и 15 цифр.
Рис. 22.16
После введения номера и нажатия кнопки «Next» появится окно с сообщением о том, что данный серийный номер позволяет вам использовать установленный продукт, включающий в себя среду Visual DSP++, симулятор, компилятор, ассемблер и компоновщик, в течение 30 дней с момента регистрации (рис. 22.17).
Рис. 22.17
Нажмите на кнопку «Next». В результате на экране появится окно, сообщающее об успешном лицензировании пакета Visual DSP++ (рис. 22.18). Здесь необходимо нажать кнопку «Finish».
Рис. 22.18
На этом процесс установки программного пакета Visual DSP++ заканчивается, и можно приступать к его использованию. Кроме того, теперь можно удалить все файлы из временного каталога, поскольку программа инсталляции не делает этого самостоятельно.
В этой главе говорится об использовании современного средства разработки программ для сигнальных процессоров — программного пакета VisualDSP++.
После установки программного пакета VisualDSP++ на компьютер можно начать работу с ним. Установленная программа находится по умолчанию в каталоге «C:\Program_Files\Analog Devices\VisualDSP\System\ldde.exe» и запускается по пути: Пуск→Программы→VisualDSP→VisualDSP++ Environment.
При первом запуске этой программы на экране монитора отобразится окно (рис. 23.1), текст которого сообщает о том, что ваша лицензия на использование VisualDSP++ истечет через 30 дней. После чего необходимо будет либо купить, либо вновь зарегистрировать данный программный пакет.
Рис. 23.1
Окно, появляющееся после истечения срока лицензии, приведено на рис. 23.2. В нем сообщается об окончании срока лицензии и предлагается посетить в Интернете страницу по адресу: http://www.analog.com/dsp/tools/register\VisualDSP\System\reg_info.txt, содержащую регистрационную информацию.
Рис. 23.2
До истечения лицензии данное окно не появляется, и после нажатия программной кнопки «OK» на экране появится окно новой сессии (рис. 23.3), в котором необходимо выбрать семейство процессоров, платформу и тип процессора, с которым будет выполняться работа.
Рис. 23.3
Здесь можно выбрать вариант, представленный на рис. 23.3 для работы с устройством EZ-KIT Lite или тестовой платой, описанной ранее, либо задать вариант, представленный на рис. 23.4 для работы в режиме программной эмуляции процессора. Во втором случае никаких аппаратных средств при использовании VisualDSP++ не потребуется.
Рис. 23.4
Среда разработки VisualDSP++ предполагает работу как с отдельными файлами, так и с проектами, включающими в себя набор файлов, различных по назначению и содержанию. Это могут быть файлы с программами, входными и выходными данными, настройками среды разработки и т.п.
После нажатия кнопки «OK» откроется основное рабочее окно программы (рис. 23.5), представляющее собой среду разработки.
Рис. 23.5
Рассмотрим интерфейс пользователя VisualDSP++. В верхней части программы находится главное меню, с помощью которого можно выполнять различные программные действия. Ниже размещаются кнопки меню инструментов, дублирующие некоторые команды главного меню. В левой части программы размещается окно проекта, в котором содержатся сведения о файлах проекта. Справа находится окно дизассемблированного кода. Окно выходной информации, содержащее стандартные текстовые сообщения ввода-вывода, сообщения об ошибках и др. сообщения, находится внизу. Средняя часть экрана отведена под окно редактирования. Внешний вид среды разработки может настраиваться по вкусу пользователя, позволяя отображать необходимую для отладки программы информацию. Более детально познакомиться с интерфейсом среды можно, изучая примеры программ, входящих в состав самого пакета, и с помощью встроенной электронной справки.
Установленный на компьютере программный пакет VisualDSP++ включает в себя множество готовых примеров программ и большой объем справочной информации. Файлы с примерами программ и справкой находятся в каталогах
«C:\Program_Files\AnalogDevices\VisualDSP\218x\Examples»
и
«C:\Program_Files\AnalogDevices\VisualDSP\Help».
Рассмотрим работу программы на основе готового примера из самого пакета. Выберите в главном меню программы команду: Project→Open и в открывшемся окне диалога (рис. 23.6) укажите путь к проекту с именем Example1 в каталоге
«C:\Program_Files\Analog Devices\VisualDSP\218x\Examples\Example1».
Рис. 23.6
Откройте каталог «Example1», выделите в нем файл проекта «Example1» и нажмите кнопку «Открыть». После этого найдите в открывшемся проекте файл с названием «Vectadd.asm» и щелкните по нему дважды левой кнопкой мыши.
В центре экрана откроется новое окно, для редактирования выбранного файла. Разверните это окно, щелкнув кнопку разворота окна, и закройте окно дизассемблирования, если оно открыто.
Это позволит увеличить область редактирования, для удобства восприятия информации. Среда разработки примет при этом вид, подобный тому, что изображен на рис. 23.7.
Рис. 23.7
Данный проект содержит программу, предназначенную для сложения двух векторов (массивов) данных x_input[n] и y_input[n] и размещения результата по адресу ввода-вывода z_out. В программе иллюстрируется начальная инициализация входных массивов и настройка генераторов адреса. Среда разработки VisualDSP++ позволяет по шагам посмотреть процедуру инициализации массивов, выборки чисел из памяти и их сложения в цикле. Массивы имеют длину n=10, объявленную в самом начале программы с помощью оператора: #define n10. Результат сложения будет пересылаться в область ввода-вывода с адресом z_out=0x100, объявленным в программе с помощью оператора: #define z_out x100. Массив данных x_input[n] будет храниться в памяти данных процессора после загрузки из файла «xin.dat», что определено строками программы:
.section/data data1;
.VAR x_input[n] = "xin.dat";
Второй массив данных y_input[n] будет храниться в памяти программ процессора после загрузки из файла «yin.dat», что определяется строками программы:
.section/pm pm_da;
.VAR y_input[n] = "yin.dat";
Далее в программе размещаются векторы прерываний. Тело основной программы состоит из строк:
.section/pm program;
start: I2=x_input; /*pointer to x input buffer*/
L2=0; /*noncircular buffer*/
I6=y_input; /*pointer to y input buffer*/
L6=0;
M0=1; L0=0;
M5=1; L5=0;
CNTR=n-1;
AX0=DM(I2,M0), AY0=PM(I6,M5); /*Get first data*/
DO add_loop UNTIL CE;
AR=AX0+AY0, AX0=DM(I2,M0), AY0=PM(I6,M5);
add_loop: io(z_out)=AR; /*Write output*/
AR=AX0+AY0;
io(z_out)=AR;
IDLE;
Выполним данную программу в пошаговом режиме. Для этого вначале произведем компиляцию программы, нажав на клавиатуре клавишу F7. В результате программа будет скомпилирована, и отобразится окно, приведенное на рис. 23.8.
Рис. 23.8
Этот же результат можно получить, выполнив команду главного меню Project→Build project или нажав соответствующую ей кнопку на панели инструментов. Из рисунка видно, что стрелка, показывающая очередную выполняемую программу, располагается напротив строки с меткой «reset». Кроме того, справа автоматически открывается окно дизассемблированных команд программы. Выполнять программу в пошаговом режиме можно, нажимая клавишу F11, выполнив команду Debug→Step Into или нажав соответствующую ей кнопку на панели инструментов.
При каждом таком действии будет выполняться очередная строка команд. Результат работы программы можно наблюдать по изменению содержимого памяти и регистров процессора. Окна, отображающие память процессора, вызываются с помощью главного меню «Memory». Для отображения окон с содержимым регистров процессора используется кнопка главного меню «Register». Для отображения регистров удобно воспользоваться командой Register→Custom, которая позволяет выбрать только те регистры, которые необходимо видеть пользователю. При выполнении этой команды откроется окно, изображенное на рис. 23.9.
Рис. 23.9
Выделяя в этом окне с помощью мышки необходимые для контроля регистры и щелкая по кнопке «Add», можно создать набор регистров для отображения на дисплее в одном окне. Кроме того, в строке «Title of window» можно задать название отображаемого окна. Таким образом, можно создать несколько окон для отображения различных групп регистров для контроля их состояния. Создав такое окно, можно продолжать выполнение программы по шагам. При этом в окне регистром будет видно изменение содержимого регистров, которые участвовали в выполнении очередной строки команд программы. Текущие изменения будут выделяться красным цветом. Выполнение программы завершается оператором IDLE, который переводит процессор в режим энергосбережения. Для повторного запуска программы необходимо вновь выполнить команду Project→Build. Перед повторной компиляцией проекта в программу можно вносить собственные изменения с целью получения практики программирования. Можно, например, изменить программу таким образом, чтобы результат сложения массивов записывался не по адресу ввода-вывода, а в память данных. Закрытие проекта производится командой Project→Close.
В этой главе рассматриваются очередные примеры программ, способы настройки симулятора и получение загрузочного файла в среде разработки VisualDSP++.
Рассмотрим еще один пример программы, который демонстрирует работу с последовательным портом и предназначен для освоения работы с симулятором и потоками ввода-вывода.
Откройте в установленном пакете Visual DSP++ каталог с примером проекта программы «Example2», выделите в нем файл проекта «Example2» и нажмите кнопку «Открыть». После этого найдите в открывшемся проекте файл с названием «Sport.asm» и щелкните по нему дважды левой кнопкой мыши. В центре экрана откроется новое окно, позволяющее просматривать и редактировать выбранный файл. Разверните это окно, щелкнув кнопку развертывания окна.
В этой программе выполняется инициализация последовательных портов SPORT0 и SPORT1 с последующей передачей данных, используя процедуру прерываний.
В обработчике прерываний процессор вначале считывает данные из последовательного порта SPORT1, а затем передает их в этот же порт. Данный обработчик прерываний состоит из следующих строк:
sample: AX0=RX1; /*принять данные в AX0*/
TX1=АХ0; /*передать данные из AX0*/
RTI;
В рассматриваемой программе организован бесконечный цикл за счет того, что процессор находится в состоянии ожидания до тех пор, пока не будет сгенерировано прерывание от приемника SPORT1. Входные и выходные потоки данных могут моделироваться с помощью файлов. Перед запуском этой программы необходимо настроить потоки ввода-вывода.
Для этого необходимо подключить ко входу и выходу порта файлы, которые будут содержать входные и выходные данные. Выполните команду главного меню: «Setting→Streams2». После этого на дисплее откроется окно «Streams», показанное на рис. 24.1.
Рис. 24.1
Щелкните в открывшемся окне по кнопке «Add» (добавить). Во вновь открывшемся окне «Add New Streams» (рис. 24.2) в группе настроек «Source» выберите группу «File» и, щелкнув по кнопке «Browse» (обзор), найдите, выделите и откройте файл «Serin.dat» с помощью кнопки «Open» (открыть).
Рис. 24.2
После чего выберите в списке «Format» строку «Binary». Остальные настройки данной группы оставьте без изменений. Теперь в группе настроек «Destination» выберите в списке «Device» устройство Sport1 и нажмите кнопку «OK». После этого вновь открывается окно «Streams», в котором будет присутствовать заданная нами настройка.
Далее необходимо подключить выходной файл. Вновь щелкните в окне «Streams» по кнопке «Add». В открывшемся окне «Add New Streams» в группе настроек «Source» переключитесь на группу «Debug target» и выберите в списке «Device» устройство «Sport1». Теперь в группе настроек «Destination» выберите группу «File» и, щелкнув по кнопке «Browse», найдите, выделите и откройте файл «Serout.dat» с помощью кнопки «Save» (сохранить) или задайте это имя для выходного файла. В списке «Format» выберите строку «Binary» и нажмите кнопку «OK».
Теперь в открывшемся окне «Streams» будут присутствовать две записи настроек, показанные на рис. 24.3. Нажмите в окне «Streams» кнопку «OK», и оно закроется.
Рис. 24.3
Перед запуском программы создайте с помощью команды меню Register→Custom окно, в котором будут отображаться регистры AX0, RX1, TX1. Кроме того, откройте еще одно с помощью команды меню Register→Program Control для отображения содержимого регистров управления процессора. Изменение содержимого этих регистров можно будет наблюдать в процессе пошагового выполнения программы. Допускается добавление окон для отображения и других регистров, но помните, что избыточная информация загромождает экран и затрудняет изучение программы.
Теперь можно скомпилировать и запустить программу в пошаговом режиме, с помощью клавиш F7 и F11 соответственно. Кроме того, программу можно запустить в непрерывном режиме, используя команду Debug→Run, или клавишу F5, или соответствующую кнопку на панели инструментов. В результате выполнения программы, данные из входного файла Serin.dat должны без изменений переписаться в выходной файл Serout.dat. После окончания работы программы в окне выходной информации появится сообщение: «Error in reading from stream for Sport 1», которое означает, что отладчик достиг конца входного файла при чтении данных.
При выполнении программы в непрерывном режиме допускается устанавливать точки останова в тех местах программы, где необходимо проконтролировать значение каких-либо данных в регистрах или памяти процессора. Для этих целей используются кнопки панели инструментов в виде кисти руки или синих флажков. Для установки точки останова необходимо выделить какую-либо строку программы и нажать кнопку с именем «Toggle Bookmark». Снятие любой точки останова производится повторным нажатием этой же кнопки. Для снятия всех точек останова в программе используется кнопка с именем «All Clear Bookmark». Переход между точками останова вверх или вниз производится с помощью кнопок «Next Bookmark» и «Prevision Bookmark» соответственно.
В исследуемом примере программы, инициализация SPORT1 задает формирование внутреннего кадрового сигнала порта. Программный пакет Visual DSP++ позволяет симулировать внешний кадровый сигнал для порта, с заданными временными параметрами. Для того чтобы задействовать данный механизм, произведите небольшую корректировку программы, изменив настройку кадровой синхронизации для порта SPORT1. Затем установите параметры внешнего прерывания кадровым сигналом с помощью команды главного меню «Setting→Interrupts». В открывшемся окне (рис. 24.4) выберите в качестве источника внешнего прерывания (External Interrupts) кадровый сигнал приемника RFS1 и задайте число циклов Min cycles=0 a Max cycles=10. Нажмите кнопку «Add», а затем «OK». Теперь на панели инструментов найдите и нажмите кнопку «Restart» и выполните программу по шагам, нажимая клавишу F11.
Рис. 24.4
Выполняя программу в пошаговом режиме, можно наблюдать за изменением всех регистров, а также определять число циклов процессора при выполнении любой строки команд.
В программном пакете Visual DSP++ можно создавать новые проекты. Для этого необходимо закрыть открытый ранее проект с помощью команды Project→Close и выполнить команду Project→New. При этом откроется окно «Save New Project As» для создания нового проекта (рис. 24.5).
Рис. 24.5
Нажмите в этом окне кнопку создания нового каталога и задайте ему новое имя. Теперь откройте вновь созданный каталог и задайте имя нового проекта. После чего нажмите кнопку «Save» (сохранить). При этом откроется окно свойств проекта «Project Options» (рис. 24.6). Выберите в этом окне в списке «Processor» тип ADSP-2181 и закройте окно с помощью кнопки «OK».
Рис. 24.6
Далее создайте новый файл программы с помощью команды «File→New» и введите в него текст программы, подобный тому, что приведен ниже:
.section/pm interrupts;
__reset: JUMP start; NOP; NOP; NOP; /*reset vector*/
RTI; NOP; NOP; NOP; /*IRQ2*/
RTI; NOP; NOP; NOP; /*IRQL1*/
RTI; NOP; NOP; NOP; /*IRQL2*/
RTI; NOP; NOP; NOP; /*SPORT0 transmit*/
RTI; NOP; NOP; NOP; /*SPORT0 receive*/
RTI; NOP; NOP; NOP; /*IRQE*/
RTI; NOP; NOP; NOP; /*BDMA*/
RTI; NOP; NOP; NOP; /*SPORT1 transmit*/
RTI; NOP; NOP; NOP; /*SPORT1 receive*/
RTI; NOP; NOP; NOP; /*Timer*/
RTI; NOP; NOP; NOP; /*Power down*/
.section/pm program;
start: nop;
jump start;
Этот текст в дальнейшем можно использовать в качестве шаблона (заготовки) новой программы для сигнального процессора. Сохраните созданный файл с каким-либо допустимым именем и расширением «asm» и выполните команду Project→Add to Project→File(s). Выберите сохраненный файл с программой и нажмите кнопку «Add». Теперь необходимо добавить в каталог с проектом файл Adsp-2189.ldf, который можно взять из рассмотренных ранее каталогов с примерами проектов. Данный файл необходим для определения типа процессора и трансляции программы. После этого программу можно транслировать и запускать на выполнение. При успешной компиляции проекта, в подкаталоге «Debug» проекта должен появиться исполняемый файл с расширением «dxe», который автоматически загружается в отладчик-симулятор при запуске программы.
Для получения файла в рассмотренном нами ранее формате «lda» можно воспользоваться специальной утилитой elf2aexe.exe, входящей в состав Visual DSP++. С целью автоматизации этого процесса предлагаю использовать командный файл, имеющий следующее содержание:
cls
elf2aexe.exe %1.dxe %1
del %1.lda
del %1.sym
ren %1.exe %1.lda
Здесь вначале производится очистка дисплея, затем вызывается утилита elf2aexe.exe с именем преобразовываемого файла в качестве входного параметра. После чего выполняются операции удаления вспомогательных файлов и переименования полученного файла. Данный командный файл можно назвать именем dxe_lda.bat и использовать для его вызова команду: dxe_lda.bat имя_файла.
Полученный таким образом файл с расширением «lda» можно использовать для загрузки в аппаратный эмулятор или тестовую плату через интерфейс IDMA.
В этой главе рассматривается программный метод спектрального анализа цифрового сигнала на примере программы, выполняемой в среде разработки Visual DSP++.
Наиболее распространенной и актуальной задачей цифровой обработки сигналов является спектральный анализ сигнала. Полученный в результате анализа спектр сигнала позволяет получить такие важные характеристики сигнала как частоту и амплитуду гармоник, из которых состоит сигнал. Имея эти данные, можно проводить анализ сигнала, на содержание в нем той или иной частоты с определенной амплитудой и длительностью.
Одним из наиболее распространенных и известных методов получения спектра является метод дискретного преобразования Фурье (ДПФ). Этот метод активно применяется в анализаторах спектра, устройствах обработки звука и изображений, распознавания образов и т.п.
ДПФ позволяет преобразовать N комплексных отсчетов сигнала во временной области в N комплексных отсчетов спектра в частотной области. Из многих теоретических источников известно, что во временной области входному сигналу с частотой, равной f, в частотной области соответствует спектр сигнала, отображаемый в диапазоне от -f/2 до f/2, где отрицательные значения составляют мнимую, а положительные значения — действительную часть спектра сигнала. Причем действительная часть спектра обладает четной симметрией, а мнимая часть нечетной. С целью сокращения количества операций и ускорения тем самым расчетов спектра сигнала, обычно ограничиваются вычислением модуля спектра сигнала в области частот от 0 до f/2.
Вычисление N отсчетов спектра сигнала с помощью ДПФ производится с помощью уравнения, приведенного на рис. 25.1. Здесь X(k) являются искомыми отсчетами спектра сигнала, а x(n) — исходными отсчетами сигнала во временной области. N представляет собой количество отсчетов при вычислении ДПФ.
Рис. 25.1. Вычисление N отсчетов спектра сигнала с помощью ДПФ
В квадратных скобках уравнения присутствуют коэффициенты для действительной и мнимой частей.
Рассмотрим очередной пример программы, демонстрирующей реализацию метода дискретного преобразования Фурье для получения спектра сигнала в среде Visual DSP++. Откройте в программном пакете Visual DSP++ очередной проект из каталога C:\Program Files\AnalogDevices\VisualDSP\218x\Examples\Example4 и разверните в нем программу, находящуюся в файле с именем «Dft.asm». В этой программе производится расчет спектра сигнала по N отсчетам сигнала, используя алгоритм дискретного преобразования Фурье. Текст этой программы с переведенными автором книги комментариями приведен ниже:
/*====================================================================
Файл:DFT.ASM Процессор:ADSP-218х Дискретное Преобразование Фурье (ДПФ)
Эта программа выполняет ДПФ для N точек согласно следующему уравнению:
N-1
real(k)+j *imag(k) = SUM input(n) [С - j*S]; k=0 до N-1
n=0
где: C=cos(2*pi*k*n/N), S=sin(2*pi*k*n/N), j=sqrt(-1)
====================================================================*/
#define N 64 /* Константа - количество входных отсчетов * /
#define COS 0x000C1 /* Адрес буфера временных данных COS */
#define SIN 0x000C5 /* Адрес буфера временных данных SIN */
.section/data data1;
.VAR input[N]=etest64.date; /* Таблица данных тестируемого сигнала */
.VAR real[N]; /* Буфер действительных значений спектра * /
.VAR imag[N]; /* Буфер мнимых значений спектра */
.section/pm pm_da;
.VAR sine[N]="sine64.dat";/* Таблица данных гармонического сигнала */
.section/pm interrupts;
__reset: JUMP start; rti; rti; rti; /* 0x0000: reset */
rti; rti; rti; rti; /* 0x0004: IRQ2 */
rti; rti; rti; rti; /* 0x0008: IRQL1 */
rti; rti; rti; rti; /* 0x000c: IRQL0 */
rti; rti; rti; rti; /* 0x0010: SPORT0 tx */
rti; rti; rti; rti; /* 0x0014: SPORT1 rx */
rti; rti; rti; rti; /* 0x0018: IRQE */
rti; rti; rti; rti; /* 0x001c: BDMA */
rti; rti; rti; rti; /* 0x0020: SPORT1 tx or IRQ1 */
rti; rti; rti; rti; /* 0x0024: SPORT1 rx or IRQ0 */
rti; rti; rti; rti; /* 0x0028: timer */
rti; rti; rti; rti; /* 0x002c: power down */
.section/pm seg_code; /* Пример установки программы ДПФ */
start:
M1=1;
M2=0;
M7=1;
M5=0;
I0=input;
L0=64; /* Входной буфер циклический */
I1=imag;
L1=0; /* Нециклический буфер Image */
I2=real;
L2=0; /* Нециклический буфер Real */
/* ______________Подпрограмма ДПФ_____________________ */
dft:
I6=sine; /* Указатель на Sine */
L6=64; /* Для N=64 значений */
I7=sine + N/4; /* Получение косинуса из синуса */
L7=64; /* Сдвиг указателя на pi/2 */
/* и использование циклического буфера.*/
I4=COS;
L4=2;
I3=SIN;
L3=2;
I5=0;
L5=0;
CNTR=N;
DO outer UNTIL CE;
M6=I5;
DM(I4,M7)=0; DM(I4,M7)=0;/* Очистка буфера временных данных COS */
DM(I3,M1)=0; DM(I3,M1)=0;/* Очистка буфера временных данных SIN */
CNTR=N;
DO calc UNTIL CE;
MX0=DM(I0,M1), MY0=PM(I7,M6); /* Чтение input, чтение COS */
MX1=MX0 /* Копирование input */
MY1=PM(I6,M6); /* Чтение SIN */
MR1=DM(I4,M7); /* Чтение текущего значения COS и суммирование */
MR0=DM(I4,M7);
MR=MR+MX0*MY0(SS);/* Мультисуммирование COS */
DM(I4,M7)=MR1; /* Запись нового накопленного значения COS */
DM(I4,M7)=MR0;
MR1=DM(I3,M1); /* Чтение текущего значения SIN и суммирование */
MR0=DM(I3,M1);
MR=MR-MX1*MY1(SS);/* Мультисуммирование SIN */
DM(I3,M1)=MR1; /* Запись нового накопленного значения SIN */
calc : DM(I3,M1)=MR0;
AR=DM(I4,M5);
DM(I2,M1)=AR; /* Запись результата действующей величины * /
AR=DM(I3,M2);
DM(I1,M1)=AR; /* Запись результата мнимой величины */
outer: MODIFY(I5,M7); /* Модификация указателей циклической таблицы */
end: IDLE;
Как видно из текста программы, в ней задействованы регистры генераторов адреса DAG для задания указателей на буфер данных тестируемого сигнала, таблицу значений гармонического сигнала, буферы результата и другие вспомогательные буферы. Вычисление значений спектра производится в двух циклах, счетчики которых инициализируются числом отсчетов N = 64. Вся программа выполняется за N*N групп операций. Результат работы программы заносится в выходные буферы действительных значений real и мнимых значений imag спектра.
Для выполнения программы выполните ее трансляцию с помощью клавиши F7. Затем установите точку останова на последнем операторе программы и запустите ее с помощью клавиши F5. Через несколько секунд программа выполнит свою работу и остановится. Визуальный просмотр тестируемого сигнала, а также результатов работы программы и других вспомогательных буферов данных можно осуществлять с помощью открытия окна памяти данных процессора, используя для этого команду Memory→Data. Кроме того, эти данные можно просматривать в графическом виде. Для этого необходимо выполнить команду: View→Debug Windows→Plot→New. При этом откроется окно конфигурации графического построителя Plot Configuration, показанное на рис. 25.2.
Рис. 25.2. Окно конфигурации графического построителя Plot Configuration
Рассмотрим работу с данным конфигуратором на примере просмотра буфера данных тестируемого сигнала. Оставьте в открывшемся окне конфигуратора без изменений строку Line Plot в поле Type группы настроек Plot. В поле Title введите имя графика «Input» или другое схожее по смыслу.
В группе Data Setting оставьте без изменений имя Data Set1 в поле Name и тип памяти DM в поле Memory. Нажмите на кнопку Browse в поле Address и выделите в открывшемся окне Browse for Symbol строку с именем input (рис. 25.3), после чего нажмите кнопку OK.
Рис. 25.3
В поле смещения данных Offset оставьте нулевое значение, а в поле счетчика Count замените значение 100 на 64, что соответствует количеству отсчетов в программе. Оставьте шаг сетки в поле Stride по умолчанию равным 1, а формат данных в поле Data целочисленным int. Нажмите на кнопку Add для добавления заданных установок в поле Data sets графического построителя. При желании, в это поле можно добавить и другие данные для отображения, а затем установить или снять перед соответствующим именем графика флажок для отображения этого графика. Теперь, нажмите на кнопку OK, после чего в правой части окна Visual DSP++ отобразится график заданных данных (рис. 25.4).
Рис. 25.4.
Для разворачивания и сворачивания окно графика имеет кнопку в виде стрелки. Аналогично можно построить и рассмотреть график, сформированный из буфера синусоидальных значений и хранящихся после выполнения программы в области памяти программ PM процессора с именем «sin» (рис. 25.5).
Рис. 25.5
Данные из буфера синусоидальных значений используются в программе в качестве табличных значений гармонического сигнала для расчета коэффициентов при вычислении спектра сигнала.
После выполнения программы результат ее работы будет храниться в буферах с именами real и imag и также может быть визуально изучен.
Встроенный в программный пакет Visual DSP++ графопостроитель обладает рядом дополнительных функций. Эти функции доступны с помощью контекстного меню (рис. 25.6), открываемого щелчком правой кнопки мыши на окне графика.
Рис. 25.6
Первой в этом меню присутствует команда Data Cursor, которая позволяет узнать координатное значение любой точки графика, щелкая по нему левой кнопкой мыши. Следующая команда Reset Zoom приводит вид графика в исходное состояние. Команда Configure вызывает окно сконфигурированный графопостроителя, рассмотренное выше. Команда Modify Setting вызывает окно установок Plot Setting построителя (рис. 25.7).
Рис. 25.7
Данное окно состоит из пяти закладок и позволяет настроить изображение графопостроителя по вкусу пользователя.
Закладка General позволяет задать имя Title и вспомогательное имя Subtitle для графика. В группе Grid Lines этой закладки можно задать цвет Grid color и присутствие сетки графика по осям X, Y, обеим осям (Both) или их отсутствие (None). Группа Background Color задает цвет графика Plot и фона окна Window. Группа Margins позволяет изменить масштаб графика или произвести сброс пользовательских установок масштаба с помощью кнопки Reset. Наконец, группа Option позволяет отображать рядом с графиком его имя и статистические данные с помощью флажков, устанавливаемых в поле Legend и Statistics соответственно.
Следующая закладка 2-D Axis (рис. 25.8) позволяет задать имя осей X и Y графика в полях Title, а также начальное значение оси X в поле Start value и ее шаг в поле Increment value.
Рис. 25.8
Для оси Y можно задать линейный или логарифмический вид представления графика с помощью поля Linear/Log. Для обеих осей имеются группы Scale для задания автоматического (Auto) или ручного (Manual) масштабирования осей. При этом параметры Min value и Max value задают соответственно минимальное и максимальное значение по осям ординат, а параметр Multiplier определяет множитель шкалы.
Закладка Font (рис. 25.9) позволяет задать имя (Font name), цвет (Font color) и размер (Font size) шрифта для отображения надписей на графике.
Рис. 25.9
Очередная закладка Style (рис. 25.10) кон фигурирует линии графика с помощью полей типа линии (Line type), ее ширины (Line width), цвета (Line color) и символов (Symbol) для отображения линии с их размерами (Symbol size).
Рис. 25.10
Наконец, последняя закладка Data Processing (рис. 25.11) позволяет задать для любого графика с именем, выбранным в поле Data Sets, формат его преобразования, определяемый в поле Data Process. При этом допускается отображение графика без преобразования (None), с преобразованием в шкалу децибел (Convert to dB), преобразованием Фурье (FF Magnitude) или двумерным преобразованием Фурье (D FF Magnitude). Кроме того, на этой закладке можно задать частоту преобразования в поле Sample rate и сохранение следов в поле Stored traces. Поле Trigger позволяет задать нарастание (Rising), спадание (Falling) и величину порога триггера (Threshold value) для исследуемого сигнала, наподобие установок осциллографа.
Рис. 25.11
Следующая команда Save Settings контекстного меню (см. рис. 25.6) позволяет сохранить заданные выше настройки Plot Setting.
Очередная команда Export контекстного меню вызывает окно Export Plot (рис. 25.12), которое позволяет задать приемник для экспорта данных графопостроителя. В качестве такого приемника может быть буфер обмена (Clip Board), файл (File), принтер (Printer) или звуковая карта (Sound Card). При экспорте данных в файл пользователю предоставляется возможность выбрать любой из следующих форматов файла: jpg, bmp, gif, tif, eps, txt или dat.
Рис. 25.12
Снятие флажка перед командой Allow Docking приводит к преобразованию окна графика в перемещаемое окно.
Щелчок левой кнопкой мыши по графику вызывает цветную рамку, задающую область графика для увеличения.
Команда Close контекстного меню закрывает график.
Наконец, команда Float In Main Window вызывает перемещение графика в главное окно среды Visual DSP++.
Время вычисления спектра сигнала является основной характеристикой спектрального анализатора. Чем оно меньше, тем производительнее анализатор. Поэтому для ускорения вычисления спектра используют метод быстрого преобразования Фурье (БПФ).
Фактически БПФ является модернизацией ДПФ за счет сокращения количества операций умножения и сложения. Это стало возможным благодаря использованию свойств симметрии и периодичности коэффициентов уравнения преобразования, представляющих собой базовые гармонические функции. Если для вычисления N отсчетов спектра сигнала при использовании ДПФ требуется N*N операций умножения комплексных чисел, то при использовании БПФ количество операций сокращается до (N/2)log2(N). Эффективность БПФ по сравнению с ДПФ становится существенной, когда количество точек увеличивается до нескольких тысяч.
В табл. 25.1 приведено соотношение объема вычислительных затрат при различном объеме входных данных.
Таблица 25.1 Соотношение объема вычислительных затрат при различном объеме входных данных
Количество отсчетов N | Количество умножений | Коэффициент эффективности | |
---|---|---|---|
ДПФ | БПФ | ||
2 | 4 | 1 | 4 |
4 | 16 | 4 | 4 |
8 | 64 | 12 | 5 |
16 | 256 | 32 | 8 |
32 | 1024 | 80 | 13 |
64 | 4096 | 192 | 21 |
128 | 16384 | 448 | 37 |
256 | 65536 | 1024 | 64 |
1024 | 1048576 | 5120 | 205 |
2048 | 4194304 | 11264 | 372 |
4096 | 16777216 | 24576 | 683 |
При вычислении спектра сигнала методом БПФ используют различные алгоритмы. Алгоритм по основанию два (Radix2) разделяет полное вычисление ДПФ на комбинацию двухточечных ДПФ. Каждое двухточечное ДПФ использует базовую операцию умножения с накоплением (так называемую «бабочку»). При этом число точек в БПФ должно быть степенью двойки. Если количество точек является степенью числа четыре, то можно использовать алгоритм по основанию четыре (Radix4). Эти алгоритмы хорошо реализуются в программах для сигнальных процессоров, поскольку в них имеются генераторы адреса с битреверсивной адресацией, предназначенной как раз для реализации подобных алгоритмов.
Это заключительная глава книги, в которой рассматриваются примеры программ на языке программирования Си и их выполнение в среде разработки Visual DSP++.
Кроме ассемблерных программ, среда разработки Visual DSP++ позволяет транслировать программы, написанные на языке программирования «Си». Рассмотрим пример простой программы, написанной на языке «Си», которая вычисляет значения тригонометрической функции синуса для четырех заданных значений аргумента.
Создайте новый проект с именем «С» и подключите к проекту новый файл с именем «c1.c», набрав в нем текст программы, приведенный ниже:
#include
#define PI 3.14159 /* Число Пи */
int y1, y2, y3, y4;
main() {
y1 = sin(0);
y2 = sin(PI/2.0);
y3 = sin(PI);
y4 = sin(PI+PI/2.0);
}
Здесь используются стандартные директивы и операторы языка «Си». В начале программы оператор включения подключает библиотеку математических функций math.h. Далее производится определение символьного имени PI. Ниже объявляются целочисленные переменные y1–y4. В данном примере переменные объявлены целочисленными для наглядности представления результата работы программы. Главный цикл программы main состоит из четырех однотипных операций вычисления значений функции синуса для различных значений аргумента. В данном случае аргумент принимает значения, кратные PI/2. Результатом данной программы будут значения функции синус, которые очевидно должны принимать значения 0, 1, 0 и -1.
Выполните трансляцию этой программы, нажав клавишу F7. Затем выполните ее, нажав клавишу F5. После выполнения программы в правой части экрана откроется окно дизассемблера, в котором будет присутствовать текст программы на языке ассемблера. Этот текст позволяет увидеть соответствие операторов языка «Си» набору ассемблерных инструкций. Для просмотра результата работы программы необходимо открыть окно памяти данных с помощью команды Memory→Data. По умолчанию, в этом окне данные отображаются в шестнадцатеричном виде. Для отображения результатов в знаковом целочисленном виде щелкните на окне правой кнопкой мыши и в открывшемся контекстном меню (рис. 26.1) выберите формат Select Format→Signed Integer.
Рис. 26.1. Контекстное меню
В результате данные в окне будут представлены в более привычном для человека виде (рис. 26.2).
Рис. 26.2. Данные в окне представлены в более привычной для человека форме
Как видно, результат работы программы оказался абсолютно точен. Заметьте, что благодаря лаконичности записи, присущей языку высокого уровня «Си», программа для вычисления тригонометрических функций состоит всего лишь из несколько строк. Для написания подобной программы на ассемблере понадобилось бы несколько десятков строк.
Теперь немного усложним программу, изменив ее текст на тот, что приведен ниже:
#include
#define PI 3.14159 /* Число Пи */
#define D PI/180.0 /* Число Дельта */
#define N 100 /* Число отсчетов */
float y1[N], y2[N];
main() {
int i;
for (i=0; i
y1[i] = sin(10.0*i*D);
y2[i] = cos(10.0*i*D);
}
}
Здесь определены два массива y1 и y2 с данными в формате float. Значения этих массивов будут вычисляться в цикле for для N значений аргумента функций синуса и косинуса.
Выполните трансляцию программы и установите точку останова на последней строчке программы. После чего запустите программу на выполнение. Через несколько секунд выполнение программы завершится. Для просмотра результата ее работы откройте новое окно графопостроителя. Для этого выполните команду View→Debug Windows→Plot→New. В открывшемся окне задайте значения всех полей в соответствии с рис. 26.3 и нажмите программную кнопку «Browse».
Рис. 26.3. Окно для задания значений полей
В новом открывшемся окне (рис. 26.4) найдите и выделите в памяти данных строку с массивом y1, после чего нажмите кнопку «OK».
Рис. 26.4. Окно для сопровождения работы программы
Нажмите в окне Plot Configuration программную кнопку «Add». При этом в поле Data sets появится запись Data set1. Теперь еще раз нажмите программную кнопку «Browse» и выделите в памяти данных строку с массивом y2, после чего нажмите кнопку «OK». Вновь нажмите в окне Plot Configuration программную кнопку Add. После этих действий в поле Data sets появится новая запись Data set2. Убедитесь, что строке Data set1 соответствует адрес y1, а строке Data set2 — адрес y2, выделяя по очереди каждую из строк в окне Plot Configuration. Для обеих строк данные должны иметь тип float. Если это не так — исправьте формат данных на float.
Теперь нажмите в окне кнопку «OK», разверните окно с графиками результатов работы программы (рис. 26.5).
Рис. 26.5. Кривые функций синуса и косинуса
Как видно из рисунка, графики представляют собой кривые функций синуса и косинуса, полученные из результатов работы программы.
С помощью графопостроителя можно увидеть и спектр сигналов. Для этого необходимо щелкнуть правой кнопкой мыши по окну с графиками и в открывшемся контекстном меню выбрать команду Modify Setting.
Далее в открывшемся окне Plot Setting открыть закладку Data Processing и выделить в поле Data Process строку FF Magnitude (рис. 26.6).
Рис. 26.6. Окно для сопровождения дальнейшей работы программы
После чего закрыть окно, нажав кнопку OK. В результате график преобразуется к виду, приведенному на рис. 26.7.
Рис. 26.7. Функция косинуса и спектр функции синуса
Здесь отображены одновременно функция косинуса и спектр функции синуса.
Подобным образом можно производить вычисление и других математических функций, для которых существуют готовые библиотеки в трансляторе языка Си. Среда разработки Visual DSP++ содержит ряд других примеров, в том числе на языке Си, изучив которые, можно расширить объем знаний в этой области. Кроме того, встроенная справочная система среды разработки дает большой объем дополнительной информации по многим вопросам, возникающим в процессе программирования.