[sensor] Use std::array in CalibratePolynomialFilter (#15264)

This commit is contained in:
J. Nick Koston
2026-03-29 14:56:04 -10:00
committed by GitHub
parent 508ec295a4
commit d51b047f63
3 changed files with 16 additions and 11 deletions
+1 -1
View File
@@ -808,7 +808,7 @@ async def calibrate_polynomial_filter_to_code(config, filter_id):
# Column vector # Column vector
b = [[v] for v in y] b = [[v] for v in y]
res = [v[0] for v in _lstsq(a, b)] res = [v[0] for v in _lstsq(a, b)]
return cg.new_Pvariable(filter_id, res) return cg.new_Pvariable(filter_id, cg.TemplateArguments(len(res)), res)
def validate_clamp(config): def validate_clamp(config):
+3 -6
View File
@@ -396,14 +396,11 @@ optional<float> CalibrateLinearFilter::new_value(float value) {
return NAN; return NAN;
} }
CalibratePolynomialFilter::CalibratePolynomialFilter(std::initializer_list<float> coefficients) optional<float> calibrate_polynomial_compute(const float *coefficients, size_t count, float value) {
: coefficients_(coefficients) {}
optional<float> CalibratePolynomialFilter::new_value(float value) {
float res = 0.0f; float res = 0.0f;
float x = 1.0f; float x = 1.0f;
for (const auto &coefficient : this->coefficients_) { for (size_t i = 0; i < count; i++) {
res += x * coefficient; res += x * coefficients[i];
x *= value; x *= value;
} }
return res; return res;
+12 -4
View File
@@ -537,13 +537,21 @@ class CalibrateLinearFilter : public Filter {
FixedVector<std::array<float, 3>> linear_functions_; FixedVector<std::array<float, 3>> linear_functions_;
}; };
class CalibratePolynomialFilter : public Filter { /// Non-template helper for polynomial calibration (implementation in filter.cpp)
optional<float> calibrate_polynomial_compute(const float *coefficients, size_t count, float value);
/// N is set by code generation to match the exact number of polynomial coefficients.
template<size_t N> class CalibratePolynomialFilter : public Filter {
public: public:
explicit CalibratePolynomialFilter(std::initializer_list<float> coefficients); explicit CalibratePolynomialFilter(std::initializer_list<float> coefficients) {
optional<float> new_value(float value) override; init_array_from(this->coefficients_, coefficients);
}
optional<float> new_value(float value) override {
return calibrate_polynomial_compute(this->coefficients_.data(), N, value);
}
protected: protected:
FixedVector<float> coefficients_; std::array<float, N> coefficients_{};
}; };
class ClampFilter : public Filter { class ClampFilter : public Filter {