WPILibC++  unspecified
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Pages
LinearDigitalFilter.h
1 /*----------------------------------------------------------------------------*/
2 /* Copyright (c) FIRST 2015-2017. All Rights Reserved. */
3 /* Open Source Software - may be modified and shared by FRC teams. The code */
4 /* must be accompanied by the FIRST BSD license file in the root directory of */
5 /* the project. */
6 /*----------------------------------------------------------------------------*/
7 
8 #pragma once
9 
10 #include <initializer_list>
11 #include <memory>
12 #include <vector>
13 
14 #include "CircularBuffer.h"
15 #include "Filter.h"
16 
17 namespace frc {
18 
69 class LinearDigitalFilter : public Filter {
70  public:
71  LinearDigitalFilter(std::shared_ptr<PIDSource> source,
72  std::initializer_list<double> ffGains,
73  std::initializer_list<double> fbGains);
74  LinearDigitalFilter(std::shared_ptr<PIDSource> source,
75  std::initializer_list<double> ffGains,
76  const std::vector<double>& fbGains);
77  LinearDigitalFilter(std::shared_ptr<PIDSource> source,
78  const std::vector<double>& ffGains,
79  std::initializer_list<double> fbGains);
80  LinearDigitalFilter(std::shared_ptr<PIDSource> source,
81  const std::vector<double>& ffGains,
82  const std::vector<double>& fbGains);
83 
84  // Static methods to create commonly used filters
85  static LinearDigitalFilter SinglePoleIIR(std::shared_ptr<PIDSource> source,
86  double timeConstant, double period);
87  static LinearDigitalFilter HighPass(std::shared_ptr<PIDSource> source,
88  double timeConstant, double period);
89  static LinearDigitalFilter MovingAverage(std::shared_ptr<PIDSource> source,
90  int taps);
91 
92  // Filter interface
93  double Get() const override;
94  void Reset() override;
95 
96  // PIDSource interface
97  double PIDGet() override;
98 
99  private:
100  CircularBuffer<double> m_inputs;
101  CircularBuffer<double> m_outputs;
102  std::vector<double> m_inputGains;
103  std::vector<double> m_outputGains;
104 };
105 
106 } // namespace frc
static LinearDigitalFilter HighPass(std::shared_ptr< PIDSource > source, double timeConstant, double period)
Creates a first-order high-pass filter of the form: y[n] = gain * x[n] + (-gain) * x[n-1] + gain * y...
Definition: LinearDigitalFilter.cpp:107
double PIDGet() override
Calculates the next value of the filter.
Definition: LinearDigitalFilter.cpp:155
LinearDigitalFilter(std::shared_ptr< PIDSource > source, std::initializer_list< double > ffGains, std::initializer_list< double > fbGains)
Create a linear FIR or IIR filter.
Definition: LinearDigitalFilter.cpp:22
static LinearDigitalFilter MovingAverage(std::shared_ptr< PIDSource > source, int taps)
Creates a K-tap FIR moving average filter of the form: y[n] = 1/k * (x[k] + x[k-1] + … + x[0]) ...
Definition: LinearDigitalFilter.cpp:123
void Reset() override
Reset the filter state.
Definition: LinearDigitalFilter.cpp:145
double Get() const override
Returns the current filter estimate without also inserting new data as PIDGet() would do...
Definition: LinearDigitalFilter.cpp:131
static LinearDigitalFilter SinglePoleIIR(std::shared_ptr< PIDSource > source, double timeConstant, double period)
Creates a one-pole IIR low-pass filter of the form: y[n] = (1 - gain) * x[n] + gain * y[n-1] where ...
Definition: LinearDigitalFilter.cpp:90
This class implements a linear, digital filter.
Definition: LinearDigitalFilter.h:69
Interface for filters.
Definition: Filter.h:19