2.3 Разработка программы на языке ассемблера процессора adsp-2181
.section/dm
vars;
.var/circ
coef_b[5] = -5202, -208, -312, -208, -5202; // Коэффициенты
b
.var/circ
coef_a[5] = 4096, -12437, 14900, -8250, 1772; // Коэффициенты
a
.var/circ
simples[5]
= 0, 0, 0, 0, 0; // Переменные simples
и feedback
остаются неизменными
.var/circ
feedback[5] = 0, 0, 0, 0, 0;
.section/pm
program;
jump
main; rti; rti; rti;
rti;
rti; rti; rti;
rti;
rti; rti; rti;
rti;
rti; rti; rti;
rti;
rti; rti; rti;
rti;
rti; rti; rti;
rti;
rti; rti; rti;
rti;
rti; rti; rti;
rti;
rti; rti; rti;
rti;
rti; rti; rti;
jump
iir; rti; rti; rti;
rti;
rti; rti; rti;
main:
ena
m_mode;
mr
= 0;
I0
= simples;
L0
= length(simples);
I1
= coef_b; // Загружаем
коэффициенты
b
L1
= length(coef_b);
I2
= feedback;
L2
= length(feedback);
I3
= coef_a; // Загружаем коэффициенты a
L3
= length(coef_a);
M1
= 1;
M0
= 0;
ar
= 4;
dm(0x3ffb)
= ar;
ar
= 999;
dm(0x3ffc)
= ar;
dm(0x3ffd)
= ar;
ifc
= 0x00ff; nop;
ena
timer;
imask
= b#0000000001; nop;
end:
jump end;
iir:
mr
= 0;
CNTR
= 4;
do
c1 until CE;
mx0
= dm(I0, M1);
my0
= dm(I1, M1);
c1:
mr = mr + mx0 * my0 (ss);
mx0
= dm(I0, M0);
my0
= dm(I1, M1);
mr
= mr + mx0 * my0 (ss);
ax0
= IO(0);
dm(I0,
M0) = ax0;
CNTR
= 4;
do
c2 until CE;
mx0
= dm(I2, M1);
my0
= dm(I3, M1);
c2:
mr = mr + mx0 * my0 (ss);
mx0
= dm(I2, M0);
my0
= dm(I3, M1);
mr
= mr + mx0 * my0 (ss);
mr
= mr (rnd);
if
mv sat mr;
dm(I2,
M0) = mr1;
IO(1)
= mr1;
rti;
2.4 Результаты работы программы
Проверим
правильность работы фильтра, для этого
сформируем и подадим на вход сигнал
длительностью 1 секунд, имеющий постоянную
амплитуду и линейное нарастание частоты
от 0 до 4 кГц. Данный сигнал показан на
рисунке 9. На рисунке 10 приведен сигнал
на выходе фильтра.
Рисунок
10. ЛЧМ сигнал
на выходе фильтра