// Copyright 2015-2021 Mobilinkd LLC. #pragma once #include "Filter.h" #include #include namespace modemm17 { template struct BaseIirFilter : FilterBase { BaseIirFilter(const std::array& b, const std::array& a) : numerator_(b), denominator_(a) { history_.fill(0.0); } float operator()(float input) { for (size_t i = N - 1; i != 0; i--) history_[i] = history_[i - 1]; history_[0] = input; for (size_t i = 1; i != N; i++) { history_[0] -= denominator_[i] * history_[i]; } float result = 0; for (size_t i = 0; i != N; i++) { result += numerator_[i] * history_[i]; } return result; } private: const std::array& numerator_; const std::array denominator_; std::array history_{0}; }; template BaseIirFilter makeIirFilter(const std::array& b, const std::array& a) { return std::move(BaseIirFilter(b, a)); } } // modemm17