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