Class LinearDigitalFilter
 java.lang.Object

 edu.wpi.first.wpilibj.filters.Filter

 edu.wpi.first.wpilibj.filters.LinearDigitalFilter

 All Implemented Interfaces:
PIDSource
public class LinearDigitalFilter extends Filter
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:  Getting rid of noise from an analog sensor input (note: the roboRIO's FPGA can do this faster in hardware)  Smoothing out joystick input to prevent the wheels from slipping or the robot from tipping  Smoothing motor commands so that unnecessary strain isn't put on electrical or mechanical components  If you use clever gains, you can make a PID controller out of this class!
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!


Constructor Summary
Constructors Constructor Description LinearDigitalFilter(PIDSource source, double[] ffGains, double[] fbGains)
Create a linear FIR or IIR filter.

Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description double
get()
Returns the current filter estimate without also inserting new data as pidGet() would do.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.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] + ...double
pidGet()
Calculates the next value of the filter.void
reset()
Reset the filter state.static LinearDigitalFilter
singlePoleIIR(PIDSource source, double timeConstant, double period)
Creates a onepole IIR lowpass filter of the form: y[n] = (1gain)*x[n] + gain*y[n1] where gain = e^(dt / T), T is the time constant in seconds.
Methods inherited from class edu.wpi.first.wpilibj.filters.Filter
getPIDSourceType, pidGetSource, setPIDSourceType




Constructor Detail

LinearDigitalFilter
public LinearDigitalFilter(PIDSource source, double[] ffGains, double[] fbGains)
Create a linear FIR or IIR filter. Parameters:
source
 The PIDSource object that is used to get valuesffGains
 The "feed forward" or FIR gainsfbGains
 The "feed back" or IIR gains


Method Detail

singlePoleIIR
public static LinearDigitalFilter singlePoleIIR(PIDSource source, double timeConstant, double period)
Creates a onepole IIR lowpass filter of the form: y[n] = (1gain)*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.
 Parameters:
source
 The PIDSource object that is used to get valuestimeConstant
 The discretetime time constant in secondsperiod
 The period in seconds between samples taken by the user

highPass
public 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.This filter is stable for time constants greater than zero.
 Parameters:
source
 The PIDSource object that is used to get valuestimeConstant
 The discretetime time constant in secondsperiod
 The period in seconds between samples taken by the user

movingAverage
public 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]).This filter is always stable.
 Parameters:
source
 The PIDSource object that is used to get valuestaps
 The number of samples to average over. Higher = smoother but slower Throws:
IllegalArgumentException
 if number of taps is less than 1

get
public double get()
Description copied from class:Filter
Returns the current filter estimate without also inserting new data as pidGet() would do.

reset
public void reset()
Description copied from class:Filter
Reset the filter state.

