ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Воскресенье
5 мая
1343413 Топик полностью
IBAH (23.08.2023 12:26 - 12:54, просмотров: 315) ответил General на Программная фильтрация. Чаще всего для фильтрации используется апериодическое звено - аналог RC-цепочки.
Делал такое, но для полосового фильтра первого порядка и кортексМ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);
  }
/