A combination of some frequently used filters

FILTER_LIB.h

Committer:
benson516
Date:
2017-02-10
Revision:
7:10df955a92d9
Parent:
6:18dd3f9ac217

File content as of revision 7:10df955a92d9:

//
#ifndef PI
#define PI 3.1415926
#endif
//
#ifndef FILTER_LIB_H
#define FILTER_LIB_H
//
#include "IIR.h"
#include <math.h>
#include <vector>

using std::vector;

//--------------------LPF---------------------//
class LPF{ // Low-pass filter
public:
    float output;

    LPF(float samplingTime, float cutOff_freq_Hz_in); // cutOff_freq_Hz_in is in "Hz"
    float filter(float input);
    void reset(float input);

private:
    float Ts;
    float cutOff_freq_Hz; // Hz
    float alpha_Ts;
    float One_alpha_Ts;

    // Flag
    bool Flag_Init;
};

//--------------------LPF_vector---------------------//
class LPF_vector{ // Vectorized low-pass filter
public:
    vector<float> output;

    LPF_vector(size_t dimension, float samplingTime, float cutOff_freq_Hz_in); // cutOff_freq_Hz_in is in "Hz"
    vector<float> filter(const vector<float> &input);
    void reset(const vector<float> &input);

private:
    size_t n;
    float Ts;
    float cutOff_freq_Hz; // Hz
    float alpha_Ts;
    float One_alpha_Ts;

    // Flag
    bool Flag_Init;

    //
    vector<float> zeros; // Zero vector [0;0;0]
};

//--------------------LPF_nthOrderCritical---------------------//
class LPF_nthOrderCritical{ // nth-order critical-damped Low-pass filter (all the poles are at the same place)
public:
    float output;

    LPF_nthOrderCritical(float samplingTime, float cutOff_freq_Hz_in, size_t order_in); // cutOff_freq_Hz_in is in "Hz"
    float filter(float input);
    void reset(float input);

private:
    float Ts;
    size_t order;
    float cutOff_freq_Hz; // Hz

    // Layers of 1st-order LPF
    vector<LPF> filter_layers;

    // Flag
    bool Flag_Init;
};

//--------------------LPF_vector_nthOrderCritical---------------------//
class LPF_vector_nthOrderCritical{ // Vectorized nth-order critical-damped Low-pass filter (all the poles are at the same place)
public:
    vector<float> output;

    LPF_vector_nthOrderCritical(size_t dimension, float samplingTime, float cutOff_freq_Hz_in, size_t order_in); // cutOff_freq_Hz_in is in "Hz"
    vector<float> filter(const vector<float> &input);
    void reset(const vector<float> &input);

private:
    size_t n;
    float Ts;
    size_t order;

    float cutOff_freq_Hz; // Hz

    // Flag
    bool Flag_Init;

    // Layers of vectorized 1st-order LPF
    vector<LPF_vector> filter_layers;

    //
    vector<float> zeros; // Zero vector [0;0;0]
};


//--------------------HPF---------------------//
class HPF{ // High-pass filter
public:
    float output;

    HPF(float samplingTime, float cutOff_freq_Hz_in); // cutOff_freq_Hz_in is in "Hz"
    float filter(float input);
    void reset(float input);

private:
    float Ts;
    float cutOff_freq_Hz; // Hz
    // float alpha_Ts;
    // float One_alpha_Ts;

    // Flag
    bool Flag_Init;

    //
    LPF lpf;
};

//--------------------HPF_vector---------------------//
class HPF_vector{ // Vectorized high-pass filter
public:
    vector<float> output;

    HPF_vector(size_t dimension, float samplingTime, float cutOff_freq_Hz_in); // cutOff_freq_Hz_in is in "Hz"
    vector<float> filter(const vector<float> &input);
    void reset(const vector<float> &input);

private:
    size_t n;
    float Ts;
    float cutOff_freq_Hz; // Hz
    // float alpha_Ts;
    // float One_alpha_Ts;

    // Flag
    bool Flag_Init;

    //
    LPF_vector lpf_v;
};

//--------------------HPF_nthOrderCritical---------------------//
class HPF_nthOrderCritical{ // nth-order critical-damped High-pass filter (all the poles are at the same place)
public:
    float output;

    HPF_nthOrderCritical(float samplingTime, float cutOff_freq_Hz_in, size_t order_in); // cutOff_freq_Hz_in is in "Hz"
    float filter(float input);
    void reset(float input);

private:
    float Ts;
    size_t order;
    float cutOff_freq_Hz; // Hz

    // Layers of 1st-order HPF
    vector<HPF> filter_layers;

    // Flag
    bool Flag_Init;
};


//--------------------HPF_vector_nthOrderCritical---------------------//
class HPF_vector_nthOrderCritical{ // Vectorized nth-order critical-damped High-pass filter (all the poles are at the same place)
public:
    vector<float> output;

    HPF_vector_nthOrderCritical(size_t dimension, float samplingTime, float cutOff_freq_Hz_in, size_t order_in); // cutOff_freq_Hz_in is in "Hz"
    vector<float> filter(const vector<float> &input);
    void reset(const vector<float> &input);

private:
    size_t n;
    float Ts;
    size_t order;

    float cutOff_freq_Hz; // Hz

    // Flag
    bool Flag_Init;

    // Layers of vectorized 1st-order LPF
    vector<HPF_vector> filter_layers;

    //
    vector<float> zeros; // Zero vector [0;0;0]
};

//--------------------HPF_vector_1minusLPF_nthOrderCritical---------------------//
class HPF_vector_1minusLPF_nthOrderCritical{ // Vectorized nth-order critical-damped High-pass filter ( the version of (1 - nth-order LPF), all the poles are at the same place)
public:
    vector<float> output;

    HPF_vector_1minusLPF_nthOrderCritical(size_t dimension, float samplingTime, float cutOff_freq_Hz_in, size_t order_in); // cutOff_freq_Hz_in is in "Hz"
    vector<float> filter(const vector<float> &input);
    void reset(const vector<float> &input);

private:
    size_t n;
    float Ts;
    size_t order;

    float cutOff_freq_Hz; // Hz

    // Flag
    bool Flag_Init;

    // Layers of vectorized 1st-order LPF
    vector<LPF_vector> filter_layers;

    //
    vector<float> zeros; // Zero vector [0;0;0]
};


//--------------------Derivative_appr---------------------//
class Derivative_appr{ // Approximated Derivative, cut-off at 10% of sampling frequency
public:
    float output;

    Derivative_appr(float samplingTime);
    float filter(float input);
    void reset(float input);

private:
    float Ts;
    float cutOff_freq_Hz; // Hz

    // Flag
    bool Flag_Init;

    //
    IIR derivative_LPF2;
};

//--------------------Rate-saturation Filter---------------------//
class RateSaturation_Filter{ // Rate-saturation Filter
public:
    float output;
    float error;

    RateSaturation_Filter(float samplingTime, float limit_rate_in); // limit_rate is in the unit of "value/s"
    float filter(float input);
    void reset(float input);

private:
    float Ts;
    float limit_rate;
    float limit_increment;

    // Flag
    bool Flag_Init;
};

//-----------First-Order Kalman Filter--------//
class FirstOrder_KalmanFilter{ // 1st-order Kalman filter
public:

    // Parameters
    float A;
    float B;
    float C;
    //
    float R;
    float Q;

    // States
    float mu_est;
    float Sigma_est;
    // Kalman gain
    float K;

    FirstOrder_KalmanFilter(float samplingTime, float A_in, float B_in, float C_in, float R_in, float Q_in, bool is_continuousTime); // If is_continuousTime -> continuous time system
    float filter(float u, float z);
    void reset(float z);

private:
    float Ts;


    // Flag
    bool Flag_Init;
};

//-----------------Saturation---------------//
class Saturation{ // Saturation
public:

    // States
    float output;

    Saturation(float bound_up_in, float bound_low_in); // If is_continuousTime -> continuous time system
    float filter(float input);
    void reset(float input);

private:
    float Ts;

    //
    float bound_up;
    float bound_low;

    // Flag
    bool Flag_Init;
};

//-----------------Saturation_vector---------------//
class Saturation_vector{ // Saturation
public:

    // States
    vector<float> output;

    Saturation_vector(size_t dimension, float bound_up_in, float bound_low_in); // If is_continuousTime -> continuous time system
    vector<float> filter(vector<float> input);
    void reset(vector<float> input);

private:
    size_t n;

    //
    float bound_up;
    float bound_low;

    // Flag
    bool Flag_Init;
};

#endif