[an error occurred while processing this directive]
[an error occurred while processing this directive]
|
В примерах для ADSP-21xx приведён следующий пример расчёта КИХ фильтра с 32-х разрядными коэффициентами и отсчётами:
.MODULE dfir_sub;
{
Double-Precision Transversal Filter Subroutine
Calling Parameters
I0 --> Oldest input data value in delay line
L0 = 2 * Filter length (N)
I4 --> 2nd location (LSW of 1st value)
of filter coefficient table
L4 = 2 * Filter length (N)
M0,M4 = 1
M1,M5 = 2
M2,M6 = 3
AX0 = Filter length - 2 (N-2)
CNTR = Filter length - 2 (N-2)
Return Values
MR1,MR0 = sum of products
(conditionally saturated to 32 bits)
I0 --> Oldest input data value in delay line
I4 --> 2nd location (LSW of 1st value)
of filter coefficient table
Altered Registers
MX0,MY0,MR
Computation Time
3 * (N - 2) + 16 + 9
All coefficients and data values are assumed to be in 1.15 format.
}
.ENTRY dfir;
dfir: MR=0, MX0=DM(I0,M1), MY0=PM(I4,M5);
DO hlloop UNTIL CE;
hlloop: MR=MR+MX0*MY0(SU), MX0=DM(I0,M1), MY0=PM(I4,M5);
MR=MR+MX0*MY0(SU), MX0=DM(I0,M2), MY0=PM(I4,M4);
MR=MR+MX0*MY0(SU), MX0=DM(I0,M1), MY0=PM(I4,M5);
CNTR=AX0;
DO lhloop UNTIL CE;
lhloop: MR=MR+MX0*MY0(US), MX0=DM(I0,M1), MY0=PM(I4,M5);
MR=MR+MX0*MY0(US), MX0=DM(I0,M0), MY0=PM(I4,M5);
MR=MR+MX0*MY0(US), MX0=DM(I0,M1), MY0=PM(I4,M5);
MR0=MR1; {downshift 16 places}
MR1=MR2;
CNTR=AX0;
DO hhloop UNTIL CE;
hhloop: MR=MR+MX0*MY0(SS), MX0=DM(I0,M1), MY0=PM(I4,M5);
MR=MR+MX0*MY0(SS), MX0=DM(I0,M1), MY0=PM(I4,M6);
MR=MR+MX0*MY0(SS);
IF MV SAT MR;
RTS;
.ENDMOD;
Вопрос: Почему отсутствует цикл:
DO llloop UNTIL CE;
llloop: MR=MR+MX0*MY0(UU), MX0=DM(I0,Mx), MY0=PM(I4,Mx);
т.е. перемножение с накоплением младших слов 32-х разрядных множителей.
E-mail: info@telesys.ru