Разработка подпрограммы для ЦСП ADSP2189, которая реализует цифровой фильтр, заданный разностным уравнением

Страницы работы

5 страниц (Word-файл)

Содержание работы

МИНИСТЕРСТВО ОБРАЗОВАНИЯ РФ

НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

Кафедра ССОД

КУРСОВОЙ ПРОЕКТ

По дисциплине

«Микропроцессоры»

Вариант №17

Выполнил                                                                                        Преподаватель:

Факультет: АВТ                                                                              Квеглис С. В.  

Группа:       АО-11

Студент:      Тюрников Д. А.

Новосибирск 2005 г.

Задание:

            Разработать подпрограмму для ЦСП ADSP2189, которая реализует цифровой фильтр, заданный разностным уравнением

,где 

a0=1-K,    a1=2*(K-R)*cos(2pf),     a2=R2-K,   b1=2*R* cos(2pf),    b2=–R2

(разрабатываемая подпрограмма должна использовать уже готовые значения коэффициентов фильтра, а не вычислять их самостоятельно!)

Отсчеты входного сигнала x(n) хранятся в кольцевом массиве X длинной L. Отсчеты выходного сигнала y(n) хранятся в кольцевом массиве Y длинной L.  Подпрограмма должна работать в поточном режиме (при каждом вызове подпрограмма формирует один отсчет выходного массива, допускается сохранение контекста подпрограммы в специально отведенной области памяти).

Адреса обрабатываемых элементов массивов X и Y передаются в подпрограмму через переменные X_point и Y_point.

            Указать ограничения на диапазон значений обрабатываемых данных. Исследовать импульсную, переходную и амплитудно-частотную характеристики реализованной подпрограммы. Показать во временной и частотной областях результаты обработки подпрограммой сигнала , где  - отсчеты белого шума с амплитудой 1.Оценить максимальное время  исполнения подпрограммы.

; ; ; BW=0,01; f=0,25;  числа в формате 1.15.

Импульсная характеристика

Амплитудно-частотная характеристика получается путем Фурье преобразования импульсной характеристики

Переходная характеристика

Обработка сигнала :

            Для обработки сигнала на вход системы подаем заранее посчитанный массив значений сигнала .

Оценка времени работы подпрограммы:

            Для оценки времени работы подпрограммы подсчитаем, за какое количество тактов она выполняется. Для этого воспользуемся встроенной функцией VisualDSP++. Полученное число тактов 92163. Максимальная тактовая частота процессора ADSP2189 составляет 80 МГц, следовательно, один такт выполняется за время равное  секунд. Максимальное время работы подпрограммы  секунд.

Описание программы:

            Программа использует заранее подсчитанные значения коэффициентов. Коэффициенты А хранятся в массиве koef_A, коэффициенты В в массиве koef_B. Эти массивы заполняются в обратном порядке (коэффициент а0 является третьим элементом массива koef_A). Из-за специфики формата данных 1.15 в программе используются коэффициенты с масштабом ¼.

            В качестве входных данных используются 3 массива:

Mas_w – для получения импульсной и амплитудно-частотной характеристик.

Mas_h – для получения переходной характеристики.

Mas_s – для обработки сигнала .

#define n 2050                   // количество элементов в массиве

#define N 2048           //количество отсчетов

.section/data  data1;

.VAR    x_input[n] = "mas_w.dat";   //массив с исходными данными

.var      y_input[n];                             //массив результатов

.var      koefA[3]=-0.03r, 0.0r, 0.03r; //коэффициенты а2 ,а1 ,а0.

.var      koefB[2]=-0.941r, 0.0r;                     //коэффициенты в1, в0.

.section/pm interrupts;                                   // таблица векторов прерываний

_reset: JUMP start; nop; nop; nop;    // 0x0000 сброс

            RTI; nop; nop; nop;                           // 0x0004 irq2

            RTI; nop; nop; nop;               // 0x0008 irql1

            RTI; nop; nop; nop;                    // 0x000c irql0

            RTI; nop; nop; nop;                           // 0x0010 передатчик SPORT0

RTI; nop; nop; nop;                                       // 0x0014 приемник SPORT0

            RTI; nop; nop; nop;                           // 0x0018 irqe

            RTI; nop; nop; nop;                           // 0x001c BDMA

            RTI; nop; nop; nop;                           // 0x0020 передатчик SPORT1

            RTI; nop; nop; nop;                           // 0x0024 приемник SPORT1

            RTI; nop; nop; nop;                           // 0x0028 Timer

            RTI; nop; nop; nop;                           // 0x002C Power down

.section/pm program;

start:

            dis M_MODE;            //режим вычислений с фиксированной точкой

            I0=x_input;               

            L0=n;                          //кольцевой массив

            M0=1;

            ax0=I0;

            ay0=N;

            ar=ax0+ay0;

            I0=ar;                          //установка адреса на n-2 элемент в массиве x_input

            I3=y_input;                //массив результатов

            ax0=I3;

            ar=ax0;

            ay0=n;

            ar=ax0+ay0;

            L3=ar;                         //кольцевой массив

                        L1=0;

            M1=1;

koef:                                      

            CNTR=N;                              //установка количества отсчетов

            DO add_loop UNTIL CE;

            ax0=n;

            ay0=I0;

            ar=ax0+ay0;

            I3=ar;                          //установка адреса на I0+n элемент в массиве y_input

            I1=koefA;                  

            CNTR=3;                   //цикл подсчета произведения коэффициентов А на входной сигнал 

            mr=0;

            DO add_loop_A UNTIL CE;

            ar = dm(I1,M1);         //считывание коэффициента А

            my1 = dm(I0, M0);   // считывание отсчета входного сигнала

add_loop_A:   mr = mr+ar*my1(ss);           

            I1=koefB;                   //цикл подсчета произведения коэффициентов В на выходной сигнал

            CNTR=2;

            DO add_loop_B UNTIL CE;

            ar = dm(I1,M1);                     //считывание коэффициента А

            my1 = dm(I3, M0);                // считывание отсчета выходного сигнала

            mr = mr+ar*my1(ss);

            ax0=I3;ay0=0;ax1=-n;

            AR=ax0,AF=AX0-AY0;

            IF EQ AR=-ax1;

            I3=ar;                                     //установка адреса на начало массива y_input

add_loop_B:   nop; 

                        ar=mr1;

            M3=0;

            dm(I3,M3)=ar;                       //запись отсчета выходного сигнала в массив y_input

            M3=-2;          

add_loop:        ax0=dm(I0,M3);         //модифицирование адреса на 2 позиции назад.

end:    

            IDLE;          // перевод процессора в спящий режим

JUMP end;

Похожие материалы

Информация о работе