45099

Программная реализация алгоритма ДПФ на языке ассемблера процессора ADSP-2181

Лабораторная работа

Информатика, кибернетика и программирование

Сигнальный процессор взаимодействует с внешней средой путем использования адресной шины ADDR, шины данных параллельного обмена DATA, мультиплексированной шины адреса/данных IAD, линий последовательного обмена DT0, DR0, DT1, DR1 и использования информационных, управляющих, служебных сигналов и сигналов прерываний

Русский

2013-11-15

4.2 MB

24 чел.

Федеральное агентство образования РФ

РГРТУ

Кафедра РТС

 

Лабораторная работа № 3

по дисциплине «Техника цифровой обработки сигналов»

Программная реализация алгоритма ДПФ на языке ассемблера процессора  ADSP-2181

                                                                                                        Выполнил:

студент 514 группы                                                                                                      Андреев Р.Н.                                                                                                         Проверил:

Сальников Н.И.

Рязань 2009

Описание

В данной работе изучается общий принцип, способ и особенности вычисления  прямого дискретного преобразования Фурье на базе DSP ADSP 2181.

Сигнальный процессор взаимодействует с внешней средой путем использования адресной шины ADDR, шины данных параллельного обмена DATA, мультиплексированной шины адреса/данных IAD, линий последовательного обмена DT0, DR0, DT1, DR1 и использования информационных, управляющих, служебных сигналов и сигналов прерываний – рис. 1. Внутренняя структура ЦСП ADSP-2181 приведена на рис. 2

Рис. 1. Структурная схема микропроцессорной системы

Рис. 2. Внутренняя структура ЦСП ADSP-2181

Регистровые модели ALU, MAC, SHIFTER

 ALU обеспечивает выполнение стандартных арифметических и логических операций: сложение, вычитание, изменение знака, инкремент, декремент, нахождение модуля числа, деление, логическое И, ИЛИ, исключающее ИЛИ, НЕ.

Операндами-источниками данных для ALU по входу X могут быть:

АХ0, АХ1 – входные регистры;

AR  – регистр результатов;

MR0, MR1, MR2 – регистры результатов MAC;

SR0, SR1    – регистры результатов устройства сдвига

Операндами-источниками данных для ALU по входу Y могут быть:

АY0, АY1           –  входные регистры; AF  – регистр обратной связи

Регистры-приемники данных с выхода ALU:

AR                 – регистр результатов;  AF   – регистр обратной связи

Признаки результата, получаемого с выхода ALU хранятся в арифметическом регистре состояний ASTAT. Биты-признаки, входящие в состав регистра состояний ASTAT:

AZ       - признак нулевого результата (AZ=1);

AN     - знаковый бит результата;

AV   - признак переполнения разрядной сетки (AV=1);

AC  - перенос из старшего разряда;

AS   - знаковый бит операнда по входу Х;

AQ               - знаковый бит частного при делении

MAC выполняет умножение, умножение и сложение с накопленной суммой, умножение и вычитание из накопленной разности, функции насыщения и сброса в ноль. Возможно любое сочетание знаковых S и беззнаковых U перемножаемых операндов.

Операндами-источниками данных для MAC по входу X могут быть:

МХ0, МХ1  – входные регистры;

AR  – регистр результатов ALU;

MR0, MR1, MR2 – регистры результатов;

SR0, SR1 – регистры результатов устройства сдвига

Операндами-источниками данных для MAC по входу Y могут быть:

MY0, MY1  – входные регистры MAC;

MF – регистр обратной связи

 Регистры – приёмники данных с выхода MAC:

MR (MR2, MR1, MR0)  – регистр результатов;

MF  – регистр обратной связи

Признаки результата, получаемого с выхода МАС хранятся в арифметическом регистре состояний ASTAT:

MV – переполнение 32-разрядной сетки (MR2/MR1); и в регистре состояний MSTAT:

MSTAT.4 – бит-признак формата числа в регистре результата

MR (MSTAT.4=0/1 – формат дробного/целого числа).

Исходное состояние регистров в результате сброса или перезапуска процессора АSTAT = 0х00; MSTAT = 0х00.

SHIFTER (устройство сдвига) выполняет набор функций сдвига для 16- разрядных входных чисел, в результате на выходе, в общем случае, получается 32-разрядное число.

Функции устройства сдвига: арифметический сдвиг (ASHIFT), логический сдвиг (LSHIFT), нормализация (NORM), определение порядка  (EXP), определение  порядка  самого  большого  по абсолютной величине числа (блочного порядка) в  массиве чисел (EXPANDJ). Эти базовые функции могут комбинироваться для эффективного преобразования форматов чисел, включая представление чисел с плавающей точкой.

Операнды – источники ввода данных в устройстве сдвига:

SI                 – регистр ввода устройства сдвига;

AR   – регистр результатов АЛУ;

MR0, MR1, MR2 – регистры результатов MAC;

SR0, SR1   – регистры вывода устройства сдвига

Регистр SE (порядок устройства сдвига), 8-разрядный, содержит значение порядка при проведении операций нормализации и денормализации. Регистр SB (блочный порядок устройства сдвига), 5-разрядный, содержит значение блочного порядка, то есть величину сдвига для нормализации самого большого числа в массиве чисел.

Используемые карты памяти

Память данных DM

Внутренняя память данных DM занимает диапазон 0x0000 – 0x3FFF. Внешняя оверлейная  память DM Overlay 1 занимает 0х10000 – 0х11FFF  (8K слов), внешняя оверлейная  память DM Overlay 2 занимает 0х20000 – 0х21FFF  (8K слов). Выбор оверлейной памяти (адрес ее начала) задается в регистре DM_OVERLAY.

Память программ PM

Внутренняя память данных PM занимает диапазон 0x0000 – 0x3FFF. Внешняя оверлейная  память PM Overlay 1 занимает 0х12000 – 0х13FFF  (8K слов), внешняя оверлейная  память PM Overlay 2 занимает 0х12000 – 0х13FFF  (8K слов). Выбор оверлейной памяти (адрес ее начала) задается в регистре PM_OVERLAY.

Текст программы

/*__________________________________________________________________

DFT.ASM ADSP-2181 Дискретное преобразование Фурье

           Программа выполняет преобразование

           исходной дискретной последовательности input(n) длиной N

           отсчётов в дискретный спектр real(k)+j*imag(k) длиной N

           спектральных отсчётов в соответствии с формулой

                                             N-1

           real(k)+j*imag(k) = SUM input(n)[C - 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                                 // Определение символической константы N,

                                                    // количество входных отсчётов N=64

.section/data data1;                      // DM, начало секции данных, data1 - раздел, который

                                                    // содержит данные

.VAR input[N]="test_std1.dat"; // Организовать в DM входной буфер с

                                                   // именем input длиной N и загрузить в буфер

                                                   // содержимое файла инициализации "test… .dat"

                                                   // Файл инициализации содержит

                                                   // исходную последовательность отсчётов

.VAR real[N];                             // Организовать в DM выходные буферы длиной N

.VAR imag[N];                           // для хранения вычисленных программой

                                                   // спектральных отсчётов: real - для действительных

.VAR spectr[N];                         // составляющая спектра, imag - для мнимых

                                                   // составляющих, spectr - для амплитудных

                                                   // значений дискретных спектральных отсчётов

.section/pm pm_da;                    // PM, начало секции данных, pm_da - раздел,

                                                   // который содержит данные

.VAR sine[N]="sine64_00.dat"; // Организовать в PM буферы длиной N

.VAR cos[N]="cos64_00.dat";   // c именами sine и cos и загрузить

                                                   // в них файлы инициализации "sine64_00.dat"

                                                   // и "cos64_00.dat"

.section/pm interrupts;                // PM, начало секции для хранения адресов

                                                   // векторов прерываний

__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;                // PM, начало секции программного кода

start: M0=1;                               // Содержимое регистров модификации,

M1=1;                                        // обеспечивающее последовательное обращение

M2=1;                                        // к соседним ячейкам буферов

M3=1;

M7=1;

I0=input;                                   // В индексном регистре адрес ячейки входного

                                                 // буфера input, адрес входного отсчёта

L0=64;                                      // Длина входного буфера input, буфер циклический

I1=imag;                                   // В индексном регистре адрес ячейки выходного

                                                 // буфера imag, адрес выходного отсчёта

L1=0;                                        // Выходной буфер нециклический

I2=real;                                     // В индексном регистре адрес ячейки выходного

                                                 // буфера real, адрес выходного отсчёта

L2=0;                                        // Выходной буфер нециклический

I3=spectr;                                  // В индексном регистре адрес ячейки выходного

                                                 // буфера spectr, адрес выходного отсчёта

L3=0;                                        // Выходной буфер нециклический

dft: I6=sine;                              // В индексном регистре адрес ячейки буфера

                                                 // sine, адрес дискретного значения синуса

L6=64;                                      // Длина буфера sine, буфер циклический

I7=cos;                                      // В индексном регистре адрес ячейки буфера

                                                 // cos, адрес дискретного значения косинуса

L7=64;                                      // Длина буфера cos, буфер циклический

I5=0;

L5=0;

CNTR=N; DO outre UNTIL CE; // Внешний цикл вычисления real (k)

                                                     // по изменению k

M6=I5;                                          // Содержимое регистра модификации изменяемое

                                                     // для реализации чтения таблицы cos с переменным

                                                     // коэффициентом прореживания при изменении k

MR=0;                                          // Сброс выходного регистра МАС

CNTR=N; DO calcre UNTIL CE; // Внутренний цикл вычисления

                                                     // real (k) по изменению n

MX0=DM(I0,M0); MY0=PM(I7,M6);

calcre: MR=MR+MX0*MY0(SS);

DM(I2,M2)= MR1;                       // Сохранение real (k) в буфере

outre: MODIFY(I5,M7);               // Увеличение коэффициента

                                                     // прореживания на 1

                                                     // для чтения таблицы cos

                                                     // в следующем внутреннем цикле

I5=0;

L5=0;

CNTR=N; DO outim UNTIL CE; // Внешний цикл вычисления

                                                     // imag (k) по изменению k

M6=I5;

MR=0;

CNTR=N; DO calcim UNTIL CE; // Внутренний цикл вычисления

                                                       // imag (k) по изменению n

MX0=DM(I0,M0); MY0=PM(I6,M6);

calcim: MR=MR-MX0*MY0(SS);

DM(I1,M1)= MR1;                       // Сохранение imag (k) в буфере

outim: MODIFY(I5,M7);              // Увеличение коэффициента

                                                     // прореживания на 1 для чтения

                                                     // таблицы sine в следующем

                                                     // внутреннем цикле

I1=imag;

I2=real;

I3=spectr;

CNTR=N; DO outsp UNTIL CE; // Цикл вычисления

                                                     // spectr(k)= [real(k)]^2 + [imag(k)]^2

MR=0;

MX0=DM(I1,M1); MY0=MX0;

MR=MX0*MY0(SS);                  // Получение [imag(k)]^2

AX0=MR1;

MX0=DM(I2,M2); MY0=MX0;

MR=MX0*MY0(SS);                  // Получение [real(k)]^2

AY0=MR1;

AR=AX0+AY0;

outsp: DM(I3,M3)=AR;               // Сохранение [real(k)]^2 + [imag(k)]^2

                                                     // в буфере spectr

end: IDLE;                                    // Перевод процессора в состояние

                                                     // ожидания прерывания, в режим

                                                     // с малым потреблением

Выполнение работы

1) Анализ текста программы:

         Программа  вычисления дискретного спектра сигнала выполнена непосредственно по математической формуле (дискретный ряд Фурье в комплексной форме):

,

,

         Таким образом, вычисление спектра сводится к вычислению реальной и мнимой составляющей суммы. Для этого согласно формуле необходимо организовать два цикла – один цикл по изменению k – номера гармоники, второй цикл – по n – номеру сходного отсчета. При этом видно, что цикл по k должен содержать цикл по n, т. е. для каждого k необходимо вычислить сумму по n и так N раз. Для вычисления требуется умножить отсчет входного сигнала на дискретной отсчет функции (косинус для реальной части, синус для мнимой части) и накопить сумму с предыдущим результатом. Для отображения спектра сигнала используется амплитудный спектр равный

         Однако из-за сложности реализации нахождения квадратного корня используют квадрат спектрального отсчета.

         Рассмотрим, как это реализуется в данной программе.

Содержание программы:

1) объявление константы (размерность входного сигнала, количество входных отсчетов) с помощью директивы ассемблера #define

2) описание секции DM в карте памяти с помощью директивы .section. Имя раздела data1

3) организация буферов input, real, imag, spectr

буфер input – буфер в DM, содержащий входные отсчеты

буфер real – буфер в DM, в который затем будут записываться реальная  часть спектра

буфер imag – буфер в DM, в который затем будут записываться мнимые составляющие спектра

буфер spectr – буфер в DM, в который затем будут записываться амплитудные значения спектра, вычисленный из реальной и мнимых частей.

Размерности всех буферов равны 64, т.е. количество входных отсчетов сигнала. Буфер input заполняется из файла инициализации test_std1.dat, находящийся в папке с программой и содержащий исходные выборки сигнала.

4) описание секции PM в карте памяти с помощью директивы .section. Имя раздела pm_da

5) организация буферов cos, sine

В эти буферы записываются отсчеты тригонометрических функций синус и косинус, необходимые для вычисления спектра согласно формуле.

6) организация секции прерывания, содержащая адреса векторов прерываний

7) начало секции программного кода seg_code

Секция программного кода состоит из 8 меток.

Метка start. Заполняются регистры модификации DAG1 (M0,M1,M2,M3) и DAG2(M7). Все они заполняются единицами, что обеспечивает последовательное обращение к индексным регистрам I0, I1, I2, I3, I7 (после обращения прибавляется единица к адресу индексного регистра для следующего обращения). В индексный регистр I0 записывается адрес элемента буфера input, задается что это циклический буфер L0=64. Индексным регистрам I1, I2, I3 присваиваются соответственно адреса элементов буферов real, imag, spectr. Задается, что они нециклические буферы L=0.

Метка dft. Задаются индексные регистры I6, I7 соответственно буферам sine и cos. Буферы объявляются циклическими. Обнуление индексного регистра I5, задание нециклического буфера.

         Организация внешнего цикла вычисления real(k) по k. Цикл организуется как и в предыдущей работе с помощью DO outre UNTIL CE, т.е. выполнение outre пока не выполнится условие CE – счетчик пуст. Цикл вычисления реальной части спектра состоит из двух меток calcre и outre. В начале первой метки содержимое регистра модификации M6 изменяется на I5 для реализации чтения таблицы буфера cos при каждом следующем шаге по k; сбрасывается (обнуляется) выходного регистра MAC MR.

         Организация внутреннего цикла вычисления real(k) по n происходит так же по команде DO calcre UNTIL CE. Цикл вычисления содержит 4 команды: 1 команда – MX0=DM(I0,M0) – копирование каждого последующего отсчета из индексного регистра I0 (буфера input) во входной регистр по входу X MAC; 2 команда – MY0=PM(I7,M6) - копирование каждого последующего отсчета из индексного регистра I7 (буфера cos) во входной регистр по Y MAC; 3 команда – MR=MR+MX0*MY0(SS) – перемножение регистра MX0 на MY0 и сложение с предыдущим значением выходного регистра MR (задается формат каждого операнда при перемножении S – знаковые); это стандартная операция, предусмотренная MAC и распространенная для ДПФ, 4 команда – DM(I2,M2)=MR1 –   перемещение содержимого регистра MR1 в буфер real (индексный регистр I2). Интересна команда MODIFY (I5, M7). Она необходима для циклического чтения таблицы косинусов (затем и синусов) при каждом следующем обращении к I5. Так происходит увеличение коэффициента прореживания регистра I5 на величину, содержащуюся в регистре M7.

Затем следует внешний цикл imag(k) по k. Он аналогичен внешнему циклу real(k).

         Внутренний цикл imag(k) по n отличается от внутреннего real(k) по n тем, что в качестве второго операнда при перемножении используется буфер sine (регистр I6), т.к. там содержатся отсчеты синуса, необходимые для вычисления мнимой части спектра. Также различие заключается в том, что происходит накопление с вычитанием, а не накопление с суммированием как в предыдущем цикле. Это также является стандартной операцией для MAC. Заключительным этапом в вычислении амплитудного спектра сигнала является вычисления модуля суммы составляющих спектра. Для этого организуется внешний цикл по n. Цикл заключается в сложении квадратов реальной и мнимой части. При этом получается квадрат реального амплитудного спектра. Квадрат мнимой части сохраняется в регистре AX0, квадрат реальной части – в регистре AY0. Сумма квадратов записывается в регистр AR и является результатом работы программы. Последний командой является перевод процессора в ждущий режим с пониженным потреблением.

2) Состояние моделирующей программы после завершения трансляции.

а) Состояние программы после завершения трансляции

         После трансляции текста программа переходит на метку _reset, после которой размещается команда JUMP – переход на метку start, по которой в свою очередь размещается программный код. После обработки прерывания происходит возврат в главную программу с помощью команды rti. Всего в процессоре предусмотрено 12 источников прерываний. Высший приоритет у прерывания Reset (запуск после сброса или выхода из малого энергопотребления), низший у Timer (внутреннее прерывание от таймера). Адреса векторов прерываний размещаются с интервалом в 4 ячейки.

 

б) Состояние регистров ASTAT, MSTAT, STAT, регистров выполнения операций ALU, MAC  

         Регистры состояний ASTAT, MSTAT, SSTAT находятся в исходном состоянии. В регистре ASTAT записан 0x00, что говорит о том, что работа всего процессора еще не началась. Регистр ASTAT отвечает за выработку признаков выполнения команды ALU. В регистре SSTAT записано 0x55=b#10101010. Утверждается, что стек программного счетчика пуст, стек счетчика пуст, стек регистров состояний пуст, стек циклов. MSTAT=0x00. Регистр MSTAT отвечает за состояние режима работы. Видно, что бит-реверсивная адресация отключена – BIT_REVERSE=b#0

   

в) Адреса и содержимое буферов в DM

         В области памяти DM объявлены буферы input, real, imag, spectr. При запуске и инициализации процессора заполняется только буфер input, содержащий отсчеты входного сигнала. Все остальные буферы пусты, так как в них записываются данные, получаемые при вычислении спектра.

Диапазон адресов буфера input 0х000000 – 0х00003F

Диапазон адресов буфера real 0x000040 – 0x00007F

Диапазон адресов буфера imag 0x000080 – 0x0000BF

Диапазон адресов буфера spectr 0x0000C0 – 0x000108

г) Адреса и содержимое буферов в PM

         В области памяти PM содержится подпрограмма обработки прерываний (метка _reset) и секция программного кода (метки start, dft, calcre, outre, calcim, outim, outsp). Метки определяют секции кодов команд.

Метка start 0x000030 – 0x00003C

Метка dft 0x00003D – 0x000049

Метка calcre 0x00004B

Метка outre 0x00004D – 0x000057

Метка calcim 0x000058

Метка outim 0x00005A – 0x000068

Метка outsp 0x00006A

Метка end 0x00006B

д) Исходное состояние управляющих регистров DAG

         Первые четыре тройки I, M, L регистров  относятся к DAG1 (I0,M0,L0 – I3,M3,L3) и обеспечивают доступ только к памяти DM. Остальные ячейки относятся к DAG2 и обеспечивают доступ и к DM и к PM.  

         Перед началом работы эти регистры находятся в неопределенном состоянии.

е) Cостояние регистров фиксации состояния программы    

         Перед началом работы регистры состояния имеют следующие значения:

программный счетчик PC, содержащий адрес исполняемой команды, обнулен; счетчик циклов CNTR в неопределенном состоянии; число циклов CYCLES, пройденного процессором, нулевое; адрес последней команды PM_ADDR в PM неопределенное; адрес последней команды DM_ADDR в DM неопределенное; PMOVLAY и DMOVLAY – внутренние регистры выбора внутренней или внешней памяти, т.к. они обнулены, то используется внутренняя память PM и DM.  

ж) Значение условия состояния «Счетчик пуст»

         Определение условия завершения цикла DO UNTIL; счетчик находится в неопределенном состоянии  

3) Исходные данные для расчета спектра сигнала

а) Для расчета спектра используется входной сигнал, который содержится в файле инициализации test_bs17, находящийся в папке с программой. Просмотрим содержание этого файла в среде системы и буфера, который хранится в памяти DM. Из сравнения двух рисунков видно, что действительно в буфере input памяти DM хранится массив входного сигнала. В файле test_bs17 записаны отсчеты пилообразного сигнала, причем указано, что числа являются дробными (суффикс r – указатель дробности числа). В буфере же содержатся числа близкие к записанным в файле test_bs17 с поправкой на округление чисел с учетом конечной разрядной сетки процессора.

    

б) Просмотрим графическое представление входного сигнала

Как видно сигнал представляет собой периодическое колебание пилообразной формы, приподнятое над временной областью. Входной сигнал содержит 64 отсчета (8 периодов одиночного импульса).

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     

в) Просмотрим графическое содержимое буферов real, imag, spectr. Все буферы пусты, так как расчет спектра еще начинался.

         Просмотрим теперь в графическом виде эти же буферы после выполнения программы (на метке end)

Спектральные составляющие реального спектра находятся в буфере real 0x000040 – 0x00007F и содержат 8 ненулевых отсчетов:

0 отсчет,  

8 отсчет,

16 отсчет,

24 отсчет,

32 отсчет,

40 отсчет,

48 отсчет,

56 отсчет

         

Спектральные составляющие мнимого спектра находятся в буфере imag 0x000080 – 0x0000BF и содержат 6 ненулевых отсчетов:

8 отсчет,

16 отсчет,

24 отсчет,

40 отсчет,

48 отсчет,

56 отсчет

Амплитудный спектр исследуемого сигнала является периодическим – каждому 8-ому отсчету сигнала в частотной области соответствует ненулевой отсчет; причем спектр симметричен относительно центрального отсчета (32 отсчета). При этом спектр симметричен в силу свойств ДПФ. Это свойство называется сопряженной симметрией относительно N/2 отсчетов. Это свойство характерно только для вещественных сигналов.  Спектральные составляющие энергетического спектра находятся в буфере spectr 0x0000C0 – 0x0000FF:

 0 отсчет, 8 отсчет, 16 отсчет, 24 отсчет, 32 отсчет, 40 отсчет, 48 отсчет, 56 отсчет

4) Пошаговое выполнение программы

         Проследим изменения регистров состояния ASTAT, MSTAT, STAT при начале и в цикле вычисления отсчета выходного спектра. Рассмотрим последовательно каждую команду цикла. Следует отметить, что рассматривать будем вычисления ДПФ для первого отсчета мнимой и реальной части спектра сигнала. При этом в буферах real и imag уже содержатся результаты всех необходимых вычислений, т.е. отсчеты мнимой и реальной части спектра.

 

CNTR=N; DO outsp UNTIL CE;  - команда организации цикла по условию CE; в регистр числа циклов СNTR записывается 0x0040=64: CE устанавливается равным 0, т.е. счетчик заполнен     

При входе в цикл содержимое SSTAT меняется с 0x55 на 0x14, что говорит о: том что программный счетчик не пуст (выставляется очередная команда) и счетчиков циклов не пуст (регистр CNTR заполнен) – PC_EMPTY=0, LOOP_EMPTY=0. Далее регистры при выполнение одного цикла остаются неизменными.

                                     

MR=0; - обнуление регистра результата MAC, в регистр MR(MR2, MR1, MR0) записываются нули MR=0x0000; используется непосредственная адресация  (загрузка регистров MAC)

MX0=DM(I1,M1); - загрузка из индексного регистра I1 с шагом M1=1 в регистр MX0 MAC по входу X мнимой составляющей спектра в соответствии с номером n. Записывается MX0=0x0000 в соответствии в первой позицией буфера imag; используется косвенная адресация из памяти данных в регистр

 

MY0=MX0; - «размножение» мнимой составляющей спектра для вычисления квадрата, содержимое MY0=0x0000; используется регистровая адресация

MR=MX0*MY0(SS); - перемножение знаковых операндов содержащихся в регистрах MX0 и MY0, результат записывается в регистр MR=0x0000

 

AX0=MR1; - в регистр ALU AX0 записывается содержимое регистра MR1, AX0=0x0000; используется регистровая адресация, операция происходит над старшими разрядами регистра MR

MX0=DM(I2,M2); - загрузка из индексного регистра I2 с шагом M2=1 в регистр MX0 MAC по входу X реальной составляющей спектра в соответствии с номером n. Записывается MX0=0x1E9B в соответствии в первой позицией буфера real; используется косвенная адресация из памяти данных в регистр

MY0=MX0; - «размножение» реальной составляющей спектра для вычисления квадрата, содержимое MY0=0x1E9B; используется регистровая адресация

MR=MX0*MY0(SS);  -  перемножение знаковых операндов содержащихся в регистрах MX0 и MY0, результат 32 разряда записывается в регистр MR=0x075163B2. При этом регистр MR заполняются битами – 32 старших разряда MR1 и MR0. Регистр MR2=0x00 – регистр расширения знака результата.

AY0=MR1; - в регистр ALU AY0 записывается содержимое регистра MR1, AY0=0x0751=1873 – старшие разряды регистра MR, а младшие 16 биты отбрасываются; используется регистровая адресация, операция происходит над старшими разрядами регистра MR

AR=AX0+AY0; - сложение квадратов мнимой и реальной частей, запись результата в регистр результата AR=0х0751

DM(I3,M3)=AR; - последняя команда цикла – запись полученного отсчета спектра в память данных DM, из регистра результатов AR запись в организованный ранее буфер I3 (буфер spectr), используется косвенная адресация из регистра в память данных. При этом на графике и в буфере spectr появляется нулевой отсчет амплитудой 1873.

Так происходит один цикл вычисления выходного отсчета спектра. Остальные выходные отсчеты вычисляются аналогично согласно информации в буферах real и imag.

Приведем содержание буферов после вычисления всех отсчетов:

В дробном формате

5) Объем и время выполнения программы

         Согласно тех. описанию ADSP-2181 при частоте внешнего кварцевого резонатора 50МГц и напряжении питания 5В время выполнения одного цикла команд составляет 25нс. Так как CYCLES=0x65DF16=2607910, то время выполнения программы равно tпр=25нс*26079=651,975 мкс. Объем программы оценим по количеству команд, содержащихся в промежутке от метки start до метки end (информационное окно Disassembly). Объем программы равен 59 командам.Таким образом, видно, что время выполнения программы возросло по сравнению с предыдущей программой. Причем время необходимое для вычисления спектра растет пропорционально квадрату числа отсчетов сигнала, т.е. N2. Поэтому используют разнообразные способы упрощения вычисления – БПФ с прореживанием по времени или частоте. При этом вычислительные затраты падают в  раз, что естественно снижает время вычисления.

 

6) Модификация программы

         Для просмотра спектров других сигналов поменяем файл инициализации входного сигнала.

         В качестве сигнала возьмем известный радиотехнический сигнала – единичный импульс. Файл инициализации test64_1.dat  в шестнадцатеричной системе:

         В результате выполнения программы получим следующие результаты работы:

Буфер real и imag:

         После вычисления суммы квадратов реальной и мнимой частей в последнем цикле получим выходной спектр:

         Видно, что выходной спектр соответствует теоретическому спектру такого сигнала. Известно, что сигнал такого вида в спектральной области описывается функцией . Согласно верхнему графику данная функция выполняется – наблюдается затухание спектра при увеличении номера спектрального отсчета (частоты гармоники).


 

А также другие работы, которые могут Вас заинтересовать

84982. Велика буква у назвах міст, сіл, вулиць, річок 141.63 KB
  Формувати у учнів навички написання з великої букви назви міст, сіл, вулиць, річок; удосконалювати вміння розрізняти загальну і власну назви (без вживання терміну), вміння писати імена, по батькові, прізвища людей та клички тварин з великої букви; розвивати зв’язне мовлення, пам’ять...
84983. Вправи на закріплення та узагальнення знань про слова, які означають назви предметів 39.54 KB
  Повторювати і поглиблювати знання учнів про слова, які є назвами предметів; удосконалювати вміння розпізнавати ці слова серед інших слів; закріплювати навички написання слів з великої букви; розвивати зв’язне мовлення, вміння правильно висловлювати свою думку, поповнювати словникову скарбницю школярів
84984. Розпізнавання слів – назв предметів за питаннями хто? що? Малювання Колобка 488.21 KB
  Формувати вміння і навички розпізнавати слова, які відповідають на питання хто? що?, розвивати зв’язне мовлення, мислення, увагу, пам’ять; збагачувати словниковий запас; вчити малювати Колобка; виховувати любов до свого рідного міста; виховувати бережливе ставлення до хліба, а також працьовитість, дисциплінованість.
84985. Погодные условия и безопасность человека 27.54 KB
  Сформировать умения по обеспечению личной безопасности во время грозы гололеда и метели. Правила безопасного поведения во время грозы. Правила безопасного поведения во время метели. Сформировать убеждение в необходимости соблюдения правил безопасного поведения во время грозы при гололедице и во время метели.
84986. Безопасность на водоемах 29.17 KB
  Безопасность на водоемах Цель урока. Дать знания учащимся о состоянии водоемов в нашем городе и правила безопасного поведения на водоемах в разное время года. Сформировать убеждение в необходимости знать и соблюдать правила личной безопасности на водоемах. Общие правила безопасности при купании в водоемах.
84987. Криминогенные ситуации и личная безопасность 27.87 KB
  Сформировать убеждение в необходимости соблюдать правила личной безопасности при общении с незнакомыми людьми выработать умение в безопасном поведении в характерных криминогенных ситуациях. Правила личной безопасности в криминогенных ситуациях. Необходимо выработать у учащихся умение отказываться от нежелательного общения для обеспечения личной безопасности. Разобрать основные правила по обеспечению личной безопасности в различных ситуациях возникающих в повседневной жизни.
84988. Обеспечение личной безопасности дома 30.08 KB
  Изучаемые вопросы Общие правила безопасного поведения школьника если он остался дома один. Обсудить с учащимися рекомендации по соблюдению правил безопасного поведения дома если они в доме одни. Не открывайте дверь никому даже если эти люди представились работниками коммунальных услуг милиции или почты. Если вас просят принести попить или позвонить от вас объясните через дверь как дойти до ближайшего магазина и телефонаавтомата.
84989. Обеспечение личной безопасности на улице 30.24 KB
  Обеспечение личной безопасности на улице Цель урока. Познакомить учащихся с общими правилами безопасного поведения в случаях возникновения криминогенных ситуаций на улице. Сформировать убеждение в необходимости совершенствовать свои знания и умения в вопросах безопасного поведения на улице с учетом складывающейся криминогенной обстановки. Изучаемые вопросы Общие рекомендации по безопасному поведению на улице.
84990. О культуре здоровья и безопасности школьника 28.04 KB
  Сформировать у учащихся общее понятие о здоровье и здоровом образе жизни. Обозначить основные составляющие здорового образа жизни; выработать убеждения в том что режим дня является определяющей составляющей здорового образа жизни. Общие понятия о здоровом образе жизни и его составляющих. Режим дня как определяющая составляющая здорового образа жизни.