|
UniSet
2.0.0
|
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(){ return buf.size(); } 00057 00058 inline double middle(){ return M; } 00059 inline double sko(){ return S; } 00060 00061 friend std::ostream& operator<<(std::ostream& os, const DigitalFilter& d); 00062 friend std::ostream& operator<<(std::ostream& os, const DigitalFilter* d); 00063 00064 private: 00065 00066 // Первая ступень фильтра 00067 double firstLevel(); 00068 // Вторая ступень фильтра, математическая реализация RC фильтра 00069 double secondLevel( double val ); 00070 00071 double Ti; // Постоянная времени для апериодического звена в милисекундах 00072 double val; // Текущее значение второй ступени фильтра 00073 double M; // Среднее арифметическое 00074 double S; // Среднеквадратичное отклонение 00075 PassiveTimer tmr; 00076 00077 typedef std::deque<int> FIFOBuffer; 00078 FIFOBuffer buf; 00079 unsigned int maxsize; 00080 00081 typedef std::vector<int> MedianVector; 00082 MedianVector mvec; 00083 bool mvec_sorted; // флаг, что mvec остортирован (заполнен) 00084 00085 typedef std::vector<double> Coeff; 00086 Coeff w; // Вектор коэффициентов для filterIIR 00087 00088 double lsparam; // Параметр для filterIIR 00089 double ls; // Последнее значение, возвращённое filterIIR 00090 00091 int thr; // Порог для изменений, обрабатываемых рекурсивным фильтром 00092 int prev; // Последнее значение, возвращённое рекурсивным фильтром 00093 00094 // Коэффициенты для рекурсивного фильтра 00095 double coeff_prev; 00096 double coeff_new; 00097 }; 00098 //-------------------------------------------------------------------------- 00099 #endif // DigitalFilter_H_ 00100 //--------------------------------------------------------------------------
1.7.6.1