// Copyright (c) 2019, Vincent SAMY // All rights reserved. // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // 1. Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright notice, // this list of conditions and the following disclaimer in the documentation // and/or other materials provided with the distribution. // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE // DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR // ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES // (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; // LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND // ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // The views and conclusions contained in the software and documentation are those // of the authors and should not be interpreted as representing official policies, // either expressed or implied, of the FreeBSD Project. #include namespace difi { // Public functions template void BaseFilter::setType(FilterType type) { Expects(type == FilterType::Centered ? m_bCoeff.size() > 2 && m_bCoeff.size() % 2 == 1 : true); m_type = type; } template void BaseFilter::setCoeffs(const vectX_t& aCoeff, const vectX_t& bCoeff) { Expects(checkCoeffs(aCoeff, bCoeff)); m_aCoeff = aCoeff; m_bCoeff = bCoeff; normalizeCoeffs(); resetFilter(); m_isInitialized = true; } template void BaseFilter::getCoeffs(vectX_t& aCoeff, vectX_t& bCoeff) const noexcept { aCoeff = m_aCoeff; bCoeff = m_bCoeff; } // Protected functions template BaseFilter::BaseFilter(const vectX_t& aCoeff, const vectX_t& bCoeff, FilterType type) : m_aCoeff(aCoeff) , m_bCoeff(bCoeff) , m_type(type) , m_filteredData(aCoeff.size()) , m_rawData(bCoeff.size()) { Expects(checkCoeffs(aCoeff, bCoeff)); normalizeCoeffs(); resetFilter(); m_isInitialized = true; } template void BaseFilter::normalizeCoeffs() { T a0 = m_aCoeff(0); if (std::abs(a0 - T(1)) < std::numeric_limits::epsilon()) return; m_aCoeff /= a0; m_bCoeff /= a0; } template bool BaseFilter::checkCoeffs(const vectX_t& aCoeff, const vectX_t& bCoeff) { bool centering = (m_type == FilterType::Centered ? (bCoeff.size() % 2 == 1) : true); return aCoeff.size() > 0 && std::abs(aCoeff[0]) > std::numeric_limits::epsilon() && bCoeff.size() > 0 && centering; } } // namespace difi