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