UniSet  2.0.0
DigitalFilter.h
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 //--------------------------------------------------------------------------