Расчёт оклика целочисленного ЦНП-фильтра

Vlad27
Сообщения: 82
Зарегистрирован: 06 апр 2015, 10:09
Откуда: г, Нижний Новгород (rif27@bk.ru)

Расчёт оклика целочисленного ЦНП-фильтра

Сообщение Vlad27 »

Целочисленный ЦНП-фильтр при программной реализации на MCU или PLD
мы рассчитываем по следующей программе:

// программа расчёта отклика каскадного рекурсивного ЦЦФ
#define IIR16_NBIQ 2 // число звеньев фильтра

//коэффициенты B0i, B2i, B1i, A2i, A1i, log2(A0i)
const short IIR16_COEFF[6*IIR16_NBIQ+1]={
1618,-4234,-2798,-4632,2007,13,
-1069,-1677,-1940,-1736,6517,13
};
int DBuffer[2*IIR16_NBIQ+1]; // линии задержки
int EBuffer[2*IIR16_NBIQ+1];

int IIR_Filtr(int Data) {
int32 temp;
short *COEFF=(short*)IIR16_COEFF;
short *D = (short*)DBuffer;
short *E = (short*)EBuffer;
short Xc, pvalue;
int i;

pvalue = (short)Data;
for(i=0;i<IIR16_NBIQ;i++)
{
Xc = pvalue;
temp=(long)(*COEFF++)*Xc + (long)(*COEFF++)*(*D++) +
(long)(*COEFF++)*(*D--) + (long)(*COEFF++)*(*E++)+
(long)(*COEFF++)*(*E--);
*D++ = *D;
*E++ = *E;
pvalue = (short)(temp>>*COEFF++);
*D++ = Xc;
*E++ = pvalue;
}
return (int) pvalue;
}

Вариант оценки его быстродействия можно найти
в следующей работе

Vlad27
Сообщения: 82
Зарегистрирован: 06 апр 2015, 10:09
Откуда: г, Нижний Новгород (rif27@bk.ru)

Re: Расчёт оклика целочисленного ЦНП-фильтра

Сообщение Vlad27 »

Целочисленный ЦНП-фильтр при программной реализации на MCU или DSP
мы рассчитываем по следующей программе:

// программа расчёта отклика каскадного рекурсивного ЦЦФ
#define IIR16_NBIQ 2 // число звеньев фильтра

//коэффициенты B0i, B2i, B1i, A2i, A1i, log2(A0i)
const short IIR16_COEFF[6*IIR16_NBIQ+1]={
1618,-4234,-2798,-4632,2007,13,
-1069,-1677,-1940,-1736,6517,13
};
int DBuffer[2*IIR16_NBIQ+1]; // линии задержки
int EBuffer[2*IIR16_NBIQ+1];

int IIR_Filtr(int Data) {
int32 temp;
short *COEFF=(short*)IIR16_COEFF;
short *D = (short*)DBuffer;
short *E = (short*)EBuffer;
short Xc, pvalue;
int i;

pvalue = (short)Data;
for(i=0;i<IIR16_NBIQ;i++)
{
Xc = pvalue;
temp=(long)(*COEFF++)*Xc + (long)(*COEFF++)*(*D++) +
(long)(*COEFF++)*(*D--) + (long)(*COEFF++)*(*E++)+
(long)(*COEFF++)*(*E--);
*D++ = *D;
*E++ = *E;
pvalue = (short)(temp>>*COEFF++);
*D++ = Xc;
*E++ = pvalue;
}
return (int) pvalue;
}

Для КИХ-фильтра одну из линий задержки надо убрать.
А вариант оценки его быстродействия можно найти в следующей работе

1.Бугров В.Н., Пройдаков В.И., Артемьев В.В. Поисковые технологии проектирования целочисленных цифровых фильтров. Часть 1. М., Компоненты и технологии, № 6, 2014, с. 40-44.

Ответить