WPILibC++
2021.3.1

This class implements a linear, digital filter. More...
#include <frc/filters/LinearDigitalFilter.h>
Public Member Functions  
LinearDigitalFilter (PIDSource &source, wpi::ArrayRef< double > ffGains, wpi::ArrayRef< double > fbGains)  
Create a linear FIR or IIR filter. More...  
LinearDigitalFilter (PIDSource &source, std::initializer_list< double > ffGains, std::initializer_list< double > fbGains)  
Create a linear FIR or IIR filter. More...  
LinearDigitalFilter (std::shared_ptr< PIDSource > source, wpi::ArrayRef< double > ffGains, wpi::ArrayRef< double > fbGains)  
Create a linear FIR or IIR filter. More...  
LinearDigitalFilter (std::shared_ptr< PIDSource > source, std::initializer_list< double > ffGains, std::initializer_list< double > fbGains)  
Create a linear FIR or IIR filter. More...  
LinearDigitalFilter (LinearDigitalFilter &&)=default  
LinearDigitalFilter &  operator= (LinearDigitalFilter &&)=default 
double  Get () const override 
Returns the current filter estimate without also inserting new data as PIDGet() would do. More...  
void  Reset () override 
Reset the filter state.  
double  PIDGet () override 
Calculates the next value of the filter. More...  
Public Member Functions inherited from frc::Filter  
Filter (PIDSource &source)  
Filter (std::shared_ptr< PIDSource > source)  
Filter (Filter &&)=default  
Filter &  operator= (Filter &&)=default 
void  SetPIDSourceType (PIDSourceType pidSource) override 
Set which parameter you are using as a process control variable. More...  
PIDSourceType  GetPIDSourceType () const override 
Static Public Member Functions  
static LinearDigitalFilter  SinglePoleIIR (PIDSource &source, double timeConstant, double period) 
Creates a onepole IIR lowpass filter of the form: y[n] = (1  gain) * x[n] + gain * y[n1] where gain = e^{dt / T}, T is the time constant in seconds. More...  
static LinearDigitalFilter  HighPass (PIDSource &source, double timeConstant, double period) 
Creates a firstorder highpass filter of the form: y[n] = gain * x[n] + (gain) * x[n1] + gain * y[n1] where gain = e^{dt / T}, T is the time constant in seconds. More...  
static LinearDigitalFilter  MovingAverage (PIDSource &source, int taps) 
Creates a Ktap FIR moving average filter of the form: y[n] = 1/k * (x[k] + x[k1] + … + x[0]) More...  
static LinearDigitalFilter  SinglePoleIIR (std::shared_ptr< PIDSource > source, double timeConstant, double period) 
Creates a onepole IIR lowpass filter of the form: y[n] = (1  gain) * x[n] + gain * y[n1] where gain = e^{dt / T}, T is the time constant in seconds. More...  
static LinearDigitalFilter  HighPass (std::shared_ptr< PIDSource > source, double timeConstant, double period) 
Creates a firstorder highpass filter of the form: y[n] = gain * x[n] + (gain) * x[n1] + gain * y[n1] where gain = e^{dt / T}, T is the time constant in seconds. More...  
static LinearDigitalFilter  MovingAverage (std::shared_ptr< PIDSource > source, int taps) 
Creates a Ktap FIR moving average filter of the form: y[n] = 1/k * (x[k] + x[k1] + … + x[0]) More...  
Additional Inherited Members  
Protected Member Functions inherited from frc::Filter  
double  PIDGetSource () 
Calls PIDGet() of source. More...  
Protected Attributes inherited from frc::PIDSource  
PIDSourceType  m_pidSource = PIDSourceType::kDisplacement 
This class implements a linear, digital filter.
All types of FIR and IIR filters are supported. Static factory methods are provided to create commonly used types of filters.
Filters are of the form:
y[n] = (b0 * x[n] + b1 * x[n1] + ... + bP * x[nP])  (a0 * y[n1] + a2 * y[n2] + ... + aQ * y[nQ])
Where:
y[n] is the output at time "n"
x[n] is the input at time "n"
y[n1] is the output from the LAST time step ("n1")
x[n1] is the input from the LAST time step ("n1")
b0...bP are the "feedforward" (FIR) gains
a0...aQ are the "feedback" (IIR) gains
IMPORTANT! Note the "" sign in front of the feedback term! This is a common convention in signal processing.
What can linear filters do? Basically, they can filter, or diminish, the effects of undesirable input frequencies. High frequencies, or rapid changes, can be indicative of sensor noise or be otherwise undesirable. A "low pass" filter smooths out the signal, reducing the impact of these high frequency components. Likewise, a "high pass" filter gets rid of slowmoving signal components, letting you detect large changes more easily.
Example FRC applications of filters:
For more on filters, I highly recommend the following articles:
http://en.wikipedia.org/wiki/Linear_filter
http://en.wikipedia.org/wiki/Iir_filter
http://en.wikipedia.org/wiki/Fir_filter
Note 1: PIDGet() should be called by the user on a known, regular period. You can set up a Notifier to do this (look at the WPILib PIDController class), or do it "inline" with code in a periodic function.
Note 2: For ALL filters, gains are necessarily a function of frequency. If you make a filter that works well for you at, say, 100Hz, you will most definitely need to adjust the gains if you then want to run it at 200Hz! Combining this with Note 1  the impetus is on YOU as a developer to make sure PIDGet() gets called at the desired, constant frequency!
frc::LinearDigitalFilter::LinearDigitalFilter  (  PIDSource &  source, 
wpi::ArrayRef< double >  ffGains,  
wpi::ArrayRef< double >  fbGains  
) 
Create a linear FIR or IIR filter.
source  The PIDSource object that is used to get values 
ffGains  The "feed forward" or FIR gains 
fbGains  The "feed back" or IIR gains 
frc::LinearDigitalFilter::LinearDigitalFilter  (  PIDSource &  source, 
std::initializer_list< double >  ffGains,  
std::initializer_list< double >  fbGains  
) 
Create a linear FIR or IIR filter.
source  The PIDSource object that is used to get values 
ffGains  The "feed forward" or FIR gains 
fbGains  The "feed back" or IIR gains 
frc::LinearDigitalFilter::LinearDigitalFilter  (  std::shared_ptr< PIDSource >  source, 
wpi::ArrayRef< double >  ffGains,  
wpi::ArrayRef< double >  fbGains  
) 
Create a linear FIR or IIR filter.
source  The PIDSource object that is used to get values 
ffGains  The "feed forward" or FIR gains 
fbGains  The "feed back" or IIR gains 
frc::LinearDigitalFilter::LinearDigitalFilter  (  std::shared_ptr< PIDSource >  source, 
std::initializer_list< double >  ffGains,  
std::initializer_list< double >  fbGains  
) 
Create a linear FIR or IIR filter.
source  The PIDSource object that is used to get values 
ffGains  The "feed forward" or FIR gains 
fbGains  The "feed back" or IIR gains 

overridevirtual 
Returns the current filter estimate without also inserting new data as PIDGet() would do.
Implements frc::Filter.

static 
Creates a firstorder highpass filter of the form:
y[n] = gain * x[n] + (gain) * x[n1] + gain * y[n1]
where gain = e^{dt / T}, T is the time constant in seconds.
This filter is stable for time constants greater than zero.
source  The PIDSource object that is used to get values 
timeConstant  The discretetime time constant in seconds 
period  The period in seconds between samples taken by the user 

static 
Creates a firstorder highpass filter of the form:
y[n] = gain * x[n] + (gain) * x[n1] + gain * y[n1]
where gain = e^{dt / T}, T is the time constant in seconds.
This filter is stable for time constants greater than zero.
source  The PIDSource object that is used to get values 
timeConstant  The discretetime time constant in seconds 
period  The period in seconds between samples taken by the user 

static 
Creates a Ktap FIR moving average filter of the form:
y[n] = 1/k * (x[k] + x[k1] + … + x[0])
This filter is always stable.
source  The PIDSource object that is used to get values 
taps  The number of samples to average over. Higher = smoother but slower 

static 
Creates a Ktap FIR moving average filter of the form:
y[n] = 1/k * (x[k] + x[k1] + … + x[0])
This filter is always stable.
source  The PIDSource object that is used to get values 
taps  The number of samples to average over. Higher = smoother but slower 

overridevirtual 
Calculates the next value of the filter.
Implements frc::Filter.

static 
Creates a onepole IIR lowpass filter of the form:
y[n] = (1  gain) * x[n] + gain * y[n1]
where gain = e^{dt / T}, T is the time constant in seconds.
This filter is stable for time constants greater than zero.
source  The PIDSource object that is used to get values 
timeConstant  The discretetime time constant in seconds 
period  The period in seconds between samples taken by the user 

static 
Creates a onepole IIR lowpass filter of the form:
y[n] = (1  gain) * x[n] + gain * y[n1]
where gain = e^{dt / T}, T is the time constant in seconds.
This filter is stable for time constants greater than zero.
source  The PIDSource object that is used to get values 
timeConstant  The discretetime time constant in seconds 
period  The period in seconds between samples taken by the user 