|
UniSet
2.2.1
|
00001 //-------------------------------------------------------------------------- 00002 // Реализация различных цифровых фильтров 00003 //-------------------------------------------------------------------------- 00004 #ifndef DigitalFilter_H_ 00005 #define DigitalFilter_H_ 00006 //-------------------------------------------------------------------------- 00007 #include <deque> 00008 #include <vector> 00009 #include <ostream> 00010 #include "PassiveTimer.h" 00011 //-------------------------------------------------------------------------- 00012 class DigitalFilter 00013 { 00014 public: 00015 DigitalFilter ( unsigned int bufsize = 5, double T = 0, double lsq = 0.2, 00016 int iir_thr = 10000, double iir_coeff_prev = 0.5, 00017 double iir_coeff_new = 0.5 ); 00018 ~DigitalFilter (); 00019 00020 // T <=0 - отключить вторую ступень фильтра 00021 void setSettings( unsigned int bufsize, double T, double lsq, 00022 int iir_thr, double iir_coeff_prev, double iir_coeff_new ); 00023 00024 // Усреднение с учётом СКОС 00025 // На вход подается новое значение 00026 // возвращается фильтрованное с учётом 00027 // предыдущих значений... 00028 int filter1( int newValue ); 00029 00030 // RC-фильтр 00031 int filterRC( int newVal ); 00032 00033 // медианный фильтр 00034 int median( int newval ); 00035 00036 // адаптивный фильтр по схеме наименьших квадратов 00037 int leastsqr( int newval ); 00038 00039 // рекурсивный фильтр 00040 int filterIIR( int newval ); 00041 00042 // получить текущее фильтрованное значение 00043 int current1(); 00044 int currentRC(); 00045 int currentMedian(); 00046 int currentLS(); 00047 int currentIIR(); 00048 00049 // просто добавить очередное значение 00050 void add( int newValue ); 00051 00052 void init( int val ); 00053 00054 // void init( list<int>& data ); 00055 00056 inline int size() 00057 { 00058 return buf.size(); 00059 } 00060 00061 inline double middle() 00062 { 00063 return M; 00064 } 00065 inline double sko() 00066 { 00067 return S; 00068 } 00069 00070 friend std::ostream& operator<<(std::ostream& os, const DigitalFilter& d); 00071 friend std::ostream& operator<<(std::ostream& os, const DigitalFilter* d); 00072 00073 private: 00074 00075 // Первая ступень фильтра 00076 double firstLevel(); 00077 // Вторая ступень фильтра, математическая реализация RC фильтра 00078 double secondLevel( double val ); 00079 00080 double Ti; // Постоянная времени для апериодического звена в милисекундах 00081 double val; // Текущее значение второй ступени фильтра 00082 double M; // Среднее арифметическое 00083 double S; // Среднеквадратичное отклонение 00084 PassiveTimer tmr; 00085 00086 typedef std::deque<int> FIFOBuffer; 00087 FIFOBuffer buf; 00088 unsigned int maxsize; 00089 00090 typedef std::vector<int> MedianVector; 00091 MedianVector mvec; 00092 bool mvec_sorted; // флаг, что mvec остортирован (заполнен) 00093 00094 typedef std::vector<double> Coeff; 00095 Coeff w; // Вектор коэффициентов для filterIIR 00096 00097 double lsparam; // Параметр для filterIIR 00098 double ls; // Последнее значение, возвращённое filterIIR 00099 00100 int thr; // Порог для изменений, обрабатываемых рекурсивным фильтром 00101 int prev; // Последнее значение, возвращённое рекурсивным фильтром 00102 00103 // Коэффициенты для рекурсивного фильтра 00104 double coeff_prev; 00105 double coeff_new; 00106 }; 00107 //-------------------------------------------------------------------------- 00108 #endif // DigitalFilter_H_ 00109 //--------------------------------------------------------------------------
1.7.6.1