UniSet  2.2.1
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()
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 //--------------------------------------------------------------------------