This library contains a collection of filter classes. They have been developed for use in a Self Balancing Robot and have been used to:
- Filter gyro and accelerometer output for use in the Attitude and Heading Reference System (AHRS).
- Filter motor encoder values for use in the motor controller.
- Filter derivative terms in a PID controller.
- Filter motor power input values to smooth the motor speed.
The filters are somewhat statically (build-time) polymorphic, and somewhat dynamically (run-time) polymorphic.
This is deliberate.
The filters have functions that have names and signatures in common, but the only virtual function is filterVirtual
.
The filter function may called directly by calling filter
, or indirectly (via the vtable) using filterVirtual
.
This means the the filters are somewhat interchangeable at build time, depending on which functions are used.
classDiagram
class FilterNull {
init(float k)
reset()
setToPassthrough()
setCutoffFrequency(float cutoffFrequency, float dT)
setCutoffFrequencyAndReset(float cutoffFrequency, float dT)
filter(float input) float
filter(float input, float dT) float
}
classDiagram
class FilterMovingAverage~N~ {
reset()
filter(float input) float
filter(float input, float dT) float
}
classDiagram
class ButterWorthFilter {
setParameters(const ButterWorthFilter& other)
reset()
setToPassthrough()
filter(float input) float
}
classDiagram
class IIR_filter {
init(float alpha)
setAlpha(float alpha)
reset()
setToPassthrough()
setCutoffFrequency(float cutoffFrequency, float dT)
setCutoffFrequencyAndReset(float cutoffFrequency, float dT)
filter(float input) float
filter(float input, float dT) float
}
classDiagram
class PowerTransferFilter1 {
init(float k)
reset()
setToPassthrough()
setCutoffFrequency(float cutoffFrequency, float dT)
setCutoffFrequencyAndReset(float cutoffFrequency, float dT)
filter(float input) float
gainFromDelay(float delay, float dT) float $
gain(float cutoffFrequency, float dT) float $
}
class PowerTransferFilter2 {
init(float k)
reset()
setToPassthrough()
setCutoffFrequency(float cutoffFrequency, float dT)
setCutoffFrequencyAndReset(float cutoffFrequency, float dT)
filter(float input) float
gainFromDelay(float delay, float dT) float $
gain(float cutoffFrequency, float dT) float $
}
class PowerTransferFilter3 {
init(float k)
reset()
setToPassthrough()
setCutoffFrequency(float cutoffFrequency, float dT)
setCutoffFrequencyAndReset(float cutoffFrequency, float dT)
filter(float input) float
gainFromDelay(float delay, float dT) float $
gain(float cutoffFrequency, float dT) float $
}
classDiagram
class IIR_filter {
setWeight(float weight)
setParameters(float a1, float a2, float b0, float b1, float b2, float weight)
setParameters(float a1, float a2, float b0, float b1, float b2)
setParameters(const BiquadFilter& other)
reset()
setToPassthrough()
filter(float input) float
filterWeighted(float input) float
initNotch(float frequency, float loopTimeSeconds, float Q)
calculateOmega(float frequency) float
setLowPassFrequency(float frequency, float weight)
setNotchFrequency(float frequency, float weight)
setNotchFrequency(float sinOmega, float two_cosOmega, float weight)
calculateQ(float centerFrequency, float lowerCutoffFrequency) float $
setQ(float centerFrequency, float lowerCutoffFrequency)
setQ(float Q)
getQ() float
setLoopTime(float loopTimeSeconds)
}