Делал такое, но для полосового фильтра первого порядка и кортексМ4. Как коэффициенты рассчитывал не помню... но наверно через билинейное преобразование
Поискал, чего-то нашел, задаются Freq0 и dFreq, центральная и полоса
/
//This function handles ADC1 interrupts.
void ADC1_IRQHandler(void)
{
static float x1=0;//x1
static float x2=0;//x2
static float y1=0;//y1
static float y2=0;//y2
//читаем АЦП
float x0=((signed long)(ADC1->DR))-2048;//прямой
//float x0=2048-((signed long)(ADC1->DR));//инверсный
//полосовой фильтр
float y0=x0*X0+x2*X2-y1*Y1-y2*Y2;
y2=y1; y1=y0; x2=x1; x1=x0;
//АРУ вычисление средневыпрямленного значения
AVG_ARU=(1.0F-TAU_ARU)*AVG_ARU+TAU_ARU*fabsf(y0);
//Задержка, коррекция АРУ, вывод в ЦАП
signed long DACtemp=((signed long)(y2*K_ARU))+2048;
if(DACtemp>(4095)){DACtemp=(4095);} else {if(DACtemp<(0)){DACtemp=(0);}}
SetDAC1(DACtemp);
return;
}
//преобразование аналоговой частоты в цифровую
static inline double Fa(double f){return tan(Td*ConstPi*f)/(Td*ConstPi);}
//вычисление коэффициентов фильтра
void VchslKff(void)
{
//вычисление коэффициентов в формате двойной точности
dX0=-ConstPi*Td*(Fa(Freq0+dFreq/2.0)-Fa(Freq0-dFreq/2.0));
dX1=0;
dX2=ConstPi*Td*(Fa(Freq0+dFreq/2.0)-Fa(Freq0-dFreq/2.0));
dY0=(-ConstPi*Td*(Fa(Freq0+dFreq/2.0)-Fa(Freq0-dFreq/2.0)))-1-(ConstPi*ConstPi*Td*Td*Fa(Freq0)*Fa(Freq0));
dY1=2.0-2.0*ConstPi*ConstPi*Td*Td*Fa(Freq0)*Fa(Freq0);
dY2=ConstPi*Td*(Fa(Freq0+dFreq/2.0)-Fa(Freq0-dFreq/2.0))-1-(ConstPi*ConstPi*Td*Td*Fa(Freq0)*Fa(Freq0));
//нормировка
dX2=dX2/dY0;
dX0=dX0/dY0;
dY2=dY2/dY0;
dY1=dY1/dY0;
//преобразование в одинарную точность
pX0=dX0;
pX2=dX2;
pY1=dY1;
pY2=dY2;
//загрузка коэффициентов в фильтр
//NVIC_DisableIRQ(ADC1_IRQn);
X0=pX0;
X2=pX2;
Y1=pY1;
Y2=pY2;
//NVIC_EnableIRQ(ADC1_IRQn);
}
/