Разработка устройств на основе цифровых сигнальных процессоров фирмы Analog Devices с использованием Visual DSP++ - Олег Вальпа
Шрифт:
Интервал:
Закладка:
Рис. 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.
Глава 25. Спектральный анализ сигнала в среде Visual DSP++
В этой главе рассматривается программный метод спектрального анализа цифрового сигнала на примере программы, выполняемой в среде разработки 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 FilesAnalogDevicesVisualDSP218xExamplesExample4 и разверните в нем программу, находящуюся в файле с именем «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; /* Запись результата мнимой величины */