#pragma once #include "type_checks.h" #include "typedefs.h" #include #include namespace fratio { template class GenericFilter { static_assert(std::is_floating_point::value && !std::is_const::value, "Only accept non-complex floating point types."); public: static std::string filterStatus(FilterStatus status); public: // Careful: Only an assert check for the filter status T stepFilter(const T& data); vectX_t filter(const vectX_t& data); bool getFilterResults(Eigen::Ref> results, const vectX_t& data); void resetFilter(); template void setCoeffs(T2&& aCoeff, T2&& bCoeff); void getCoeffs(vectX_t& aCoeff, vectX_t& bCoeff) const; FilterStatus status() const noexcept { return m_status; } Eigen::Index aOrder() const noexcept { return m_aCoeff.size(); } Eigen::Index bOrder() const noexcept { return m_bCoeff.size(); } protected: GenericFilter() = default; GenericFilter(const vectX_t& aCoeff, const vectX_t& bCoeff); virtual ~GenericFilter() = default; void normalizeCoeffs(); bool checkCoeffs(const vectX_t& aCoeff, const vectX_t& bCoeff); protected: FilterStatus m_status; private: vectX_t m_aCoeff; vectX_t m_bCoeff; vectX_t m_filteredData; vectX_t m_rawData; }; } // namespace fratio #include "GenericFilter.tpp"