mirror of
https://github.com/esphome/esphome.git
synced 2026-06-02 03:02:19 +08:00
[sensor] Use std::array in CalibratePolynomialFilter (#15264)
This commit is contained in:
@@ -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):
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user