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

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

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

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

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

Кафедра ССОД

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

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

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

Вариант №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;

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

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