33 const std::vector<double> &numerators) {
39 y_values_.resize(denominators_.size(), 0.0);
44 x_values_.resize(numerators_.size(), 0.0);
48 const std::vector<double> &numerators) {
54 dead_zone_ = std::fabs(deadzone);
55 AINFO <<
"Setting digital filter dead zone = " << dead_zone_;
59 if (denominators_.empty() || numerators_.empty()) {
60 AERROR <<
"Empty denominators or numerators";
65 x_values_.push_front(x_insert);
67 Compute(x_values_, numerators_, 0, numerators_.size() - 1);
71 Compute(y_values_, denominators_, 1, denominators_.size() - 1);
73 double y_insert = 0.0;
74 if (std::fabs(denominators_.front()) > kDoubleEpsilon) {
75 y_insert = (xside - yside) / denominators_.front();
77 y_values_.push_front(y_insert);
79 return UpdateLast(y_insert);
83 std::fill(x_values_.begin(), x_values_.end(), 0.0);
84 std::fill(y_values_.begin(), y_values_.end(), 0.0);
87double DigitalFilter::UpdateLast(
const double input) {
88 const double diff = std::fabs(input - last_);
89 if (diff < dead_zone_) {
96double DigitalFilter::Compute(
const std::deque<double> &values,
97 const std::vector<double> &coefficients,
98 const std::size_t coeff_start,
99 const std::size_t coeff_end) {
100 ACHECK(coeff_start <= coeff_end && coeff_end < coefficients.size());
101 ACHECK((coeff_end - coeff_start + 1) == values.size());
104 auto i = coeff_start;
105 for (
const auto value : values) {
106 sum += value * coefficients[i];
113 return denominators_;
void set_coefficients(const std::vector< double > &denominators, const std::vector< double > &numerators)
set denominators and numerators
const std::vector< double > & numerators() const
get numerators
const std::deque< double > & inputs_queue() const
get inputs of the filter
const std::deque< double > & outputs_queue() const
get outputs of the filter
void set_dead_zone(const double deadzone)
set filter deadzone
void reset_values()
re-set the x_values_ and y_values_
double Filter(const double x_insert)
Processes a new measurement with the filter.
double dead_zone() const
get dead_zone
void set_numerators(const std::vector< double > &numerators)
set numerators by an input vector
const std::vector< double > & denominators() const
get denominators
void set_denominators(const std::vector< double > &denominators)
@desc: Filter by the input x_insert Input: new value of x_insert Remove x[n - 1], insert x_insert int...
Defines the DigitalFilter class.
const double kDoubleEpsilon