ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Понедельник
27 апреля
1583894 Топик полностью
IBAH (Сегодня, 11:31, просмотров: 55) ответил IBAH на Как раз зависимость от добротности это нормально. Все проблемы растут пропорционально, кажись, квадрату добротности. Чтобы снизить требования к чувствительности коэффициентов надо работать над топологией. А как синтезировал фильтр? Когда-то писал полосовик во флоате, с расчетом коэффициентов налету. Синтезировал методом билинейного отображения. Если
Вот 
//Коэффициенты фильтра

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); }//