Apollo 10.0
自动驾驶开放平台
digital_filter.cc
浏览该文件的文档.
1/******************************************************************************
2 * Copyright 2017 The Apollo Authors. All Rights Reserved.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 *****************************************************************************/
16
18
19#include <cmath>
20
21#include "cyber/common/log.h"
22
23namespace {
24
25const double kDoubleEpsilon = 1.0e-6;
26
27} // namespace
28
29namespace apollo {
30namespace common {
31
32DigitalFilter::DigitalFilter(const std::vector<double> &denominators,
33 const std::vector<double> &numerators) {
35}
36
37void DigitalFilter::set_denominators(const std::vector<double> &denominators) {
38 denominators_ = denominators;
39 y_values_.resize(denominators_.size(), 0.0);
40}
41
42void DigitalFilter::set_numerators(const std::vector<double> &numerators) {
43 numerators_ = numerators;
44 x_values_.resize(numerators_.size(), 0.0);
45}
46
47void DigitalFilter::set_coefficients(const std::vector<double> &denominators,
48 const std::vector<double> &numerators) {
51}
52
53void DigitalFilter::set_dead_zone(const double deadzone) {
54 dead_zone_ = std::fabs(deadzone);
55 AINFO << "Setting digital filter dead zone = " << dead_zone_;
56}
57
58double DigitalFilter::Filter(const double x_insert) {
59 if (denominators_.empty() || numerators_.empty()) {
60 AERROR << "Empty denominators or numerators";
61 return 0.0;
62 }
63
64 x_values_.pop_back();
65 x_values_.push_front(x_insert);
66 const double xside =
67 Compute(x_values_, numerators_, 0, numerators_.size() - 1);
68
69 y_values_.pop_back();
70 const double yside =
71 Compute(y_values_, denominators_, 1, denominators_.size() - 1);
72
73 double y_insert = 0.0;
74 if (std::fabs(denominators_.front()) > kDoubleEpsilon) {
75 y_insert = (xside - yside) / denominators_.front();
76 }
77 y_values_.push_front(y_insert);
78
79 return UpdateLast(y_insert);
80}
81
83 std::fill(x_values_.begin(), x_values_.end(), 0.0);
84 std::fill(y_values_.begin(), y_values_.end(), 0.0);
85}
86
87double DigitalFilter::UpdateLast(const double input) {
88 const double diff = std::fabs(input - last_);
89 if (diff < dead_zone_) {
90 return last_;
91 }
92 last_ = input;
93 return input;
94}
95
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());
102
103 double sum = 0.0;
104 auto i = coeff_start;
105 for (const auto value : values) {
106 sum += value * coefficients[i];
107 ++i;
108 }
109 return sum;
110}
111
112const std::vector<double> &DigitalFilter::denominators() const {
113 return denominators_;
114}
115
116const std::vector<double> &DigitalFilter::numerators() const {
117 return numerators_;
118}
119
120double DigitalFilter::dead_zone() const { return dead_zone_; }
121
122const std::deque<double> &DigitalFilter::inputs_queue() const {
123 return x_values_;
124}
125
126const std::deque<double> &DigitalFilter::outputs_queue() const {
127 return y_values_;
128}
129
130} // namespace common
131} // namespace apollo
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.
#define ACHECK(cond)
Definition log.h:80
#define AERROR
Definition log.h:44
#define AINFO
Definition log.h:42
const double kDoubleEpsilon
class register implement
Definition arena_queue.h:37