МИНИСТЕРСТВО ОБРАЗОВАНИЯ РФ
НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
Кафедра ССОД
По дисциплине
«Микропроцессоры»
Вариант №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;
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.