LinearDigitalFilter¶

class
wpilib.
LinearDigitalFilter
(source, ffGains, fbGains)[source]¶ Bases:
wpilib.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) gainsa0...aQ
are the “feedback” (IIR) gains
Note
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 smoothes 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
pidGet()
should be called by the user on a known, regular period. You can set up a Notifier to do this (look at thePIDController
class), or do it “inline” with code in a periodic function.Note
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!There are static methods you can use to build common filters:
Constructor. Create a linear FIR or IIR filter
Parameters:  source (
PIDSource
, callable) – The PIDSource object that is used to get values  ffGains (list, tuple) – The “feed forward” or FIR gains
 fbGains (list, tuple) – The “feed back” or IIR gains

get
()[source]¶ Returns the current filter estimate without also inserting new data as
pidGet()
would do.Returns: The current filter estimate

static
highPass
(source, timeConstant, period)[source]¶ 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 secondsThis filter is stable for time constants greater than zero
Parameters:  source (
PIDSource
, callable) – The PIDSource object that is used to get values  timeConstant (float) – The discretetime time constant in seconds
 period (float) – The period in seconds between samples taken by the user
Returns:  source (

static
movingAverage
(source, taps)[source]¶ 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 (
PIDSource
, callable) – The PIDSource object that is used to get values  taps – The number of samples to average over. Higher = smoother but slower
Raises: ValueError
if number of taps is less than 1Returns:  source (

static
singlePoleIIR
(source, timeConstant, period)[source]¶ 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 secondsThis filter is stable for time constants greater than zero
Parameters:  source (
PIDSource
, callable) – The PIDSource object that is used to get values  timeConstant (float) – The discretetime time constant in seconds
 period (float) – The period in seconds between samples taken by the user
Returns:  source (