Вот //Коэффициенты фильтра
float X0;
float X2;
float Y1;
float Y2;
//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=2047-((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);
//Коррекция АРУ
y0=y0*K_ARU;
//вывод в ЦАП
signed long DACtemp=((signed long)y0)+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);}//вычисление коэффициентов фильтра Freq0-центральная частота в герцах, dFreq - полоса, Td- период дискретизации в секундах
void VchslKff(void)
{
//вычисление коэффициентов в формате двойной точности
double dX0=-ConstPi*Td*(Fa(Freq0+dFreq/2.0)-Fa(Freq0-dFreq/2.0));
double dX1=0;
double dX2=ConstPi*Td*(Fa(Freq0+dFreq/2.0)-Fa(Freq0-dFreq/2.0));
double dY0=(-ConstPi*Td*(Fa(Freq0+dFreq/2.0)-Fa(Freq0-dFreq/2.0)))-1-(ConstPi*ConstPi*Td*Td*Fa(Freq0)*Fa(Freq0));
double dY1=2.0-2.0*ConstPi*ConstPi*Td*Td*Fa(Freq0)*Fa(Freq0);
double 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;
//преобразование в одинарную точность
float pX0=dX0;
float pX2=dX2;
float pY1=dY1;
float pY2=dY2;
//загрузка коэффициентов в фильтр
NVIC_DisableIRQ(ADC1_2_IRQn);
X0=pX0;
X2=pX2;
Y1=pY1;
Y2=pY2;
NVIC_EnableIRQ(ADC1_2_IRQn);
}//