ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
20 апреля
1103575 Топик полностью
IBAH (27.05.2021 18:51, просмотров: 280) ответил Visitor на Ага, для 8 ми битников это на С в 2 строки укладывается в интах и со сдвигам вместо деления. Интересу ради, в маткаде его АЧХ построил, там экспоненциальный спад с ростом частоты, отсюда и название. Если интересно модель могу выложить.
Это как зубная щетка - у каждого своя 
*
#ifndef __FILTER_H
#define __FILTER_H

//структура данных фильтра экспоненциального сглаживания
typedef struct 
  {
  signed long in;//предыдущие входное значение
  signed long out_alfa;//выходное значение умноженное на альфа
  unsigned char alfa;//постоянная времени 
  } Filter_t;

//фильтр экспоненциального сглаживания ФНЧ
static inline signed long FilterESLP(Filter_t* f, signed long in)
  {
  f->out_alfa=(f->out_alfa) - ((f->out_alfa)>>(f->alfa)) + in;
  return (f->out_alfa) >> (f->alfa);
  }
/*
количество отсчетов для установления фильтр экспоненциального сглаживания
alfa - постоянная времени

alfa  по уров. 0.5   по уров. 0.707  по уров. 0.9  по уров. 0.99  по уров. 1
00    T_0.5= 000000  T_0.707=000000  T_0.9=000000  T_0.99=000000  T_1.0=000000
01    T_0.5= 000001  T_0.707=000001  T_0.9=000003  T_0.99=000006  T_1.0=000010
02    T_0.5= 000002  T_0.707=000004  T_0.9=000008  T_0.99=000016  T_1.0=000026
03    T_0.5= 000005  T_0.707=000009  T_0.9=000017  T_0.99=000034  T_1.0=000056
04    T_0.5= 000010  T_0.707=000019  T_0.9=000035  T_0.99=000072  T_1.0=000116
05    T_0.5= 000021  T_0.707=000038  T_0.9=000072  T_0.99=000146  T_1.0=000235
06    T_0.5= 000044  T_0.707=000078  T_0.9=000146  T_0.99=000295  T_1.0=000475
07    T_0.5= 000088  T_0.707=000156  T_0.9=000294  T_0.99=000593  T_1.0=000954
08    T_0.5= 000177  T_0.707=000314  T_0.9=000589  T_0.99=001189  T_1.0=001912
09    T_0.5= 000355  T_0.707=000629  T_0.9=001180  T_0.99=002381  T_1.0=003828
10    T_0.5= 000710  T_0.707=001258  T_0.9=002362  T_0.99=004765  T_1.0=007661
11    T_0.5= 001422  T_0.707=002517  T_0.9=004725  T_0.99=009534  T_1.0=015326
12    T_0.5= 002844  T_0.707=005036  T_0.9=009452  T_0.99=019070  T_1.0=030657
13    T_0.5= 005690  T_0.707=010073  T_0.9=018906  T_0.99=038143  T_1.0=061317
14    T_0.5= 011380  T_0.707=020148  T_0.9=037814  T_0.99=076289  T_1.0=122638
15    T_0.5= 022761  T_0.707=040297  T_0.9=075630  T_0.99=152582  T_1.0=245280
16    T_0.5= 045524  T_0.707=080594  T_0.9=151262  T_0.99=305166  T_1.0=490564
*/
//фильтр экспоненциального сглаживания ФВЧ
static inline signed long FilterESHP(Filter_t* f, signed long in)
  {
  f->out_alfa=(f->out_alfa) - ((f->out_alfa)>>(f->alfa)) + in;
  return in - ((f->out_alfa) >> (f->alfa));
  }

//фильтр низкий частот
static inline signed long FilterLP(Filter_t* f, signed long in)
  {
  f->out_alfa = (f->out_alfa) - ((f->out_alfa)>>(f->alfa)) + (in) + (f->in);
  f->in = in;
  return (f->out_alfa) >> ((f->alfa)+1);  
  }
/*
количество отсчетов для установления фильтра низких частот
alfa - постоянная времени

alfa  по уров. 0.5 по уров. 0.707 по уров. 0.9 по уров. 0.99 по уров. 1
00    T_0.5=000001 T_0.707=000001 T_0.9=000001 T_0.99=000001 T_1.0=000001
01    T_0.5=000001 T_0.707=000002 T_0.9=000003 T_0.99=000007 T_1.0=000012
02    T_0.5=000002 T_0.707=000004 T_0.9=000008 T_0.99=000016 T_1.0=000029
03    T_0.5=000005 T_0.707=000009 T_0.9=000017 T_0.99=000035 T_1.0=000061
04    T_0.5=000011 T_0.707=000019 T_0.9=000036 T_0.99=000073 T_1.0=000127
05    T_0.5=000022 T_0.707=000039 T_0.9=000073 T_0.99=000148 T_1.0=000258
06    T_0.5=000044 T_0.707=000078 T_0.9=000147 T_0.99=000297 T_1.0=000519
07    T_0.5=000089 T_0.707=000157 T_0.9=000295 T_0.99=000597 T_1.0=001043
08    T_0.5=000178 T_0.707=000314 T_0.9=000590 T_0.99=001197 T_1.0=002090
09    T_0.5=000355 T_0.707=000629 T_0.9=001182 T_0.99=002395 T_1.0=004183
10    T_0.5=000711 T_0.707=001259 T_0.9=002365 T_0.99=004793 T_1.0=008371
11    T_0.5=001423 T_0.707=002519 T_0.9=004730 T_0.99=009589 T_1.0=016745
12    T_0.5=002846 T_0.707=005039 T_0.9=009462 T_0.99=019180 T_1.0=033495
13    T_0.5=005692 T_0.707=010079 T_0.9=018925 T_0.99=038363 T_1.0=066993
14    T_0.5=011385 T_0.707=020158 T_0.9=037852 T_0.99=076728 T_1.0=133990
15    T_0.5=022770 T_0.707=040317 T_0.9=075705 T_0.99=153459 T_1.0=267985
16    T_0.5=045541 T_0.707=080635 T_0.9=151411 T_0.99=306920 T_1.0=535974
*/
//фильтр верхних частот
static inline signed long FilterHP(Filter_t* f, signed long in)
  {
  f->out_alfa = (f->out_alfa) - ((f->out_alfa)>>(f->alfa)) + (in) + (f->in);
  f->in = in;
  return in - ((f->out_alfa) >> ((f->alfa)+1));  
  }


//установка фильтра 
static inline void InitFilter(Filter_t* f, signed long in, unsigned char alfa)
  {
  f->in = in; 
  f->alfa = alfa;
  f->out_alfa = (in)<<(alfa);
  }

#endif




**