topic/diffentiators
Vincent Samy 2019-10-29 16:34:45 +09:00
rodzic 60c0b5c11f
commit a7b8bdb8fa
5 zmienionych plików z 19 dodań i 19 usunięć

Wyświetl plik

@ -57,7 +57,7 @@ public:
void resetFilter() noexcept { derived().resetFilter(); }; void resetFilter() noexcept { derived().resetFilter(); };
/*!< \brief Return the filter type */ /*!< \brief Return the filter type */
FilterType type() const noexcept { return (m_center == 0 ? FilterType::Forward : FilterType::Centered); } FilterType type() const noexcept { return (m_center == 0 ? FilterType::Backward : FilterType::Centered); }
/*! \brief Get digital filter coefficients. /*! \brief Get digital filter coefficients.
* *
* It will automatically resize the given vectors. * It will automatically resize the given vectors.
@ -110,7 +110,7 @@ private:
* \param bCoeff Numerator coefficients of the filter in decreasing order. * \param bCoeff Numerator coefficients of the filter in decreasing order.
* \param center * \param center
*/ */
BaseFilter(const vectX_t<T>& aCoeff, const vectX_t<T>& bCoeff, FilterType type = FilterType::Forward); BaseFilter(const vectX_t<T>& aCoeff, const vectX_t<T>& bCoeff, FilterType type = FilterType::Backward);
/*! \brief Default destructor. */ /*! \brief Default destructor. */
virtual ~BaseFilter() = default; virtual ~BaseFilter() = default;

Wyświetl plik

@ -35,7 +35,7 @@ template <typename T, typename Derived>
void BaseFilter<T, Derived>::setType(FilterType type) void BaseFilter<T, Derived>::setType(FilterType type)
{ {
Expects(type == FilterType::Centered ? m_bCoeff.size() > 2 && m_bCoeff.size() % 2 == 1 : true); Expects(type == FilterType::Centered ? m_bCoeff.size() > 2 && m_bCoeff.size() % 2 == 1 : true);
m_center = (type == FilterType::Forward ? 0 : (m_bCoeff.size() - 1) / 2); m_center = (type == FilterType::Backward ? 0 : (m_bCoeff.size() - 1) / 2);
} }
template <typename T, typename Derived> template <typename T, typename Derived>
@ -44,7 +44,7 @@ void BaseFilter<T, Derived>::setCoeffs(T2&& aCoeff, T2&& bCoeff)
{ {
static_assert(std::is_convertible_v<T2, vectX_t<T>>, "The coefficients types should be convertible to vectX_t<T>"); static_assert(std::is_convertible_v<T2, vectX_t<T>>, "The coefficients types should be convertible to vectX_t<T>");
Expects(checkCoeffs(aCoeff, bCoeff, (m_center == 0 ? FilterType::Forward : FilterType::Centered))); Expects(checkCoeffs(aCoeff, bCoeff, (m_center == 0 ? FilterType::Backward : FilterType::Centered)));
m_aCoeff = aCoeff; m_aCoeff = aCoeff;
m_bCoeff = bCoeff; m_bCoeff = bCoeff;
normalizeCoeffs(); normalizeCoeffs();
@ -69,7 +69,7 @@ BaseFilter<T, Derived>::BaseFilter(const vectX_t<T>& aCoeff, const vectX_t<T>& b
, m_rawData(bCoeff.size()) , m_rawData(bCoeff.size())
{ {
Expects(checkCoeffs(aCoeff, bCoeff, type)); Expects(checkCoeffs(aCoeff, bCoeff, type));
m_center = (type == FilterType::Forward ? 0 : (bCoeff.size() - 1) / 2); m_center = (type == FilterType::Backward ? 0 : (bCoeff.size() - 1) / 2);
normalizeCoeffs(); normalizeCoeffs();
resetFilter(); resetFilter();
m_isInitialized = true; m_isInitialized = true;

Wyświetl plik

@ -53,7 +53,7 @@ public:
protected: protected:
GenericFilter() = default; GenericFilter() = default;
GenericFilter(const vectX_t<T>& aCoeff, const vectX_t<T>& bCoeff, FilterType type = FilterType::Forward) GenericFilter(const vectX_t<T>& aCoeff, const vectX_t<T>& bCoeff, FilterType type = FilterType::Backward)
: BaseFilter(aCoeff, bCoeff, type) : BaseFilter(aCoeff, bCoeff, type)
{} {}
}; };
@ -80,7 +80,7 @@ public:
protected: protected:
TVGenericFilter() = default; TVGenericFilter() = default;
TVGenericFilter(int order, const vectX_t<T>& aCoeff, const vectX_t<T>& bCoeff, FilterType type = FilterType::Forward) TVGenericFilter(int order, const vectX_t<T>& aCoeff, const vectX_t<T>& bCoeff, FilterType type = FilterType::Backward)
: BaseFilter(aCoeff, bCoeff, type) : BaseFilter(aCoeff, bCoeff, type)
, m_order(order) , m_order(order)
{ {

Wyświetl plik

@ -72,7 +72,7 @@ template <typename T> vectN_t<T, 7> GetSLNLCoeffs() { return vectN_t<T, 7>{ T(-2
template <typename T> vectN_t<T, 9> GetSLNLCoeffs() { return vectN_t<T, 9>{ T(-86), T(142), T(193), T(126), T(0), T(-126), T(-193), T(-142), T(86) } / T(1188); } template <typename T> vectN_t<T, 9> GetSLNLCoeffs() { return vectN_t<T, 9>{ T(-86), T(142), T(193), T(126), T(0), T(-126), T(-193), T(-142), T(86) } / T(1188); }
template <typename T> vectN_t<T, 11> GetSLNLCoeffs() { return vectN_t<T, 11>{ T(-300), T(294), T(532), T(503), T(296), T(0), T(-296), T(-503), T(-532), T(-294), T(300) } / T(5148); } template <typename T> vectN_t<T, 11> GetSLNLCoeffs() { return vectN_t<T, 11>{ T(-300), T(294), T(532), T(503), T(296), T(0), T(-296), T(-503), T(-532), T(-294), T(300) } / T(5148); }
// Forward Noise-Robust differentiators; http://www.holoborodko.com/pavel/wp-content/uploads/OneSidedNoiseRobustDifferentiators.pdf // Backward Noise-Robust differentiators; http://www.holoborodko.com/pavel/wp-content/uploads/OneSidedNoiseRobustDifferentiators.pdf
template <typename T, size_t N> template <typename T, size_t N>
vectN_t<T, N> GetFNRCoeffs() vectN_t<T, N> GetFNRCoeffs()
{ {
@ -95,7 +95,7 @@ template <typename T> vectN_t<T, 9> GetFNRCoeffs() { return vectN_t<T, 9>{ T(1),
template <typename T> vectN_t<T, 10> GetFNRCoeffs() { return vectN_t<T, 10>{ T(1), T(7), T(20), T(28), T(14), T(-14), T(-28), T(-20), T(-7), T(-1) } / T(256); } template <typename T> vectN_t<T, 10> GetFNRCoeffs() { return vectN_t<T, 10>{ T(1), T(7), T(20), T(28), T(14), T(-14), T(-28), T(-20), T(-7), T(-1) } / T(256); }
template <typename T> vectN_t<T, 11> GetFNRCoeffs() { return vectN_t<T, 11>{ T(1), T(8), T(27), T(48), T(42), T(0), T(-42), T(-48), T(-27), T(-8), T(-1) } / T(512); } template <typename T> vectN_t<T, 11> GetFNRCoeffs() { return vectN_t<T, 11>{ T(1), T(8), T(27), T(48), T(42), T(0), T(-42), T(-48), T(-27), T(-8), T(-1) } / T(512); }
// Forward Hybrid Noise-Robust differentiators; http://www.holoborodko.com/pavel/wp-content/uploads/OneSidedNoiseRobustDifferentiators.pdf // Backward Hybrid Noise-Robust differentiators; http://www.holoborodko.com/pavel/wp-content/uploads/OneSidedNoiseRobustDifferentiators.pdf
template <typename T, size_t N> vectN_t<T, N> GetFHNRCoeffs(); template <typename T, size_t N> vectN_t<T, N> GetFHNRCoeffs();
template <typename T> vectN_t<T, 4> GetFHNRCoeffs() { return vectN_t<T, 4>{ T(2), T(-1), T(-2), T(1) } / T(2); } template <typename T> vectN_t<T, 4> GetFHNRCoeffs() { return vectN_t<T, 4>{ T(2), T(-1), T(-2), T(1) } / T(2); }
template <typename T> vectN_t<T, 5> GetFHNRCoeffs() { return vectN_t<T, 5>{ T(7), T(1), T(-10), T(-1), T(3) } / T(10); } template <typename T> vectN_t<T, 5> GetFHNRCoeffs() { return vectN_t<T, 5>{ T(7), T(1), T(-10), T(-1), T(3) } / T(10); }
@ -114,9 +114,9 @@ template <typename T, size_t N, template<class, class> typename Foo> vectN_t<T,
v(k) = k * v0(k); v(k) = k * v0(k);
return v(k); return v(k);
} }
// Forward Noise-Robust differentiators for irregular space data // Backward Noise-Robust differentiators for irregular space data
template <typename T, size_t N> vectN_t<T, N> GetFNRISDCoeffs() { return GetForwardISDCoeffs<T, N, GetFNRCoeffs>(); } template <typename T, size_t N> vectN_t<T, N> GetFNRISDCoeffs() { return GetForwardISDCoeffs<T, N, GetFNRCoeffs>(); }
// Forward Hybrid Noise-Robust differentiators for irregular space data // Backward Hybrid Noise-Robust differentiators for irregular space data
template <typename T, size_t N> vectN_t<T, N> GetFHNRISDCoeffs() { return GetForwardISDCoeffs<T, N, GetFHNRCoeffs>(); } template <typename T, size_t N> vectN_t<T, N> GetFHNRISDCoeffs() { return GetForwardISDCoeffs<T, N, GetFHNRCoeffs>(); }
// Centered Noise-Robust differentiators (tangency at 2nd order): http://www.holoborodko.com/pavel/numerical-methods/numerical-derivative/smooth-low-noise-differentiators/ // Centered Noise-Robust differentiators (tangency at 2nd order): http://www.holoborodko.com/pavel/numerical-methods/numerical-derivative/smooth-low-noise-differentiators/
@ -197,7 +197,7 @@ vectN_t<T, N> GetSOCNRCoeffs()
return v; return v;
} }
// Second-Order Forward Noise-Robust differentiator: http://www.holoborodko.com/pavel/downloads/NoiseRobustSecondDerivative.pdf // Second-Order Backward Noise-Robust differentiator: http://www.holoborodko.com/pavel/downloads/NoiseRobustSecondDerivative.pdf
template <typename T, size_t N> template <typename T, size_t N>
vectN_t<T, N> GetSOFNRCoeffs() { return GetSOCNRCoeffs<T, N>(); } // Coefficients are the same. vectN_t<T, N> GetSOFNRCoeffs() { return GetSOCNRCoeffs<T, N>(); } // Coefficients are the same.
@ -223,7 +223,7 @@ vectN_t<T, N> GetSOCNRISDCoeffs()
return v; return v;
} }
// Second-Order Forward Noise-Robust Irregular Space Data differentiator: http://www.holoborodko.com/pavel/downloads/NoiseRobustSecondDerivative.pdf // Second-Order Backward Noise-Robust Irregular Space Data differentiator: http://www.holoborodko.com/pavel/downloads/NoiseRobustSecondDerivative.pdf
template <typename T, size_t N> template <typename T, size_t N>
vectN_t<T, N> GetSOFNRISDCoeffs() { return GetSOCNRISDCoeffs<T, N>(); } // Same coefficients vectN_t<T, N> GetSOFNRISDCoeffs() { return GetSOCNRISDCoeffs<T, N>(); } // Same coefficients
@ -279,10 +279,10 @@ public:
} // namespace details } // namespace details
// Forward differentiators // Backward differentiators
template <typename T, size_t N> using ForwardNoiseRobustDiff = ForwardDifferentiator<T, N, 1, details::GetFNRCoeffs>; template <typename T, size_t N> using ForwardNoiseRobustDiff = ForwardDifferentiator<T, N, 1, details::GetFNRCoeffs>;
template <typename T, size_t N> using ForwardHybridNoiseRobustDiff = ForwardDifferentiator<T, N, 1, details::GetFHNRCoeffs>; template <typename T, size_t N> using ForwardHybridNoiseRobustDiff = ForwardDifferentiator<T, N, 1, details::GetFHNRCoeffs>;
// Time-Varying forward differentiators // Time-Varying backward differentiators
template <typename T, size_t N> using TVForwardNoiseRobustDiff = TVForwardDifferentiator<T, N, 1, details::GetFNRISDCoeffs>; template <typename T, size_t N> using TVForwardNoiseRobustDiff = TVForwardDifferentiator<T, N, 1, details::GetFNRISDCoeffs>;
template <typename T, size_t N> using TVForwardHybridNoiseRobustDiff = TVForwardDifferentiator<T, N, 1, details::GetFHNRISDCoeffs>; template <typename T, size_t N> using TVForwardHybridNoiseRobustDiff = TVForwardDifferentiator<T, N, 1, details::GetFHNRISDCoeffs>;
@ -297,14 +297,14 @@ template <typename T, size_t N> using TVCenteredNoiseRobust2Diff = TVCentralDiff
template <typename T, size_t N> using TVCenteredNoiseRobust4Diff = TVCentralDifferentiator<T, N, 1, details::GetCNR4ISDCoeffs>; template <typename T, size_t N> using TVCenteredNoiseRobust4Diff = TVCentralDifferentiator<T, N, 1, details::GetCNR4ISDCoeffs>;
// Second-order forward differentiators // Second-order backward differentiators
template <typename T, size_t N> using ForwardSecondOrderDiff = ForwardDifferentiator<T, N, 2, details::GetSOFNRCoeffs>; template <typename T, size_t N> using ForwardSecondOrderDiff = ForwardDifferentiator<T, N, 2, details::GetSOFNRCoeffs>;
// Second-order Time-Varying forward differentiators // Second-order Time-Varying backward differentiators
template <typename T, size_t N> using TVForwardSecondOrderDiff = TVForwardDifferentiator<T, N, 2, details::GetSOFNRISDCoeffs>; template <typename T, size_t N> using TVForwardSecondOrderDiff = TVForwardDifferentiator<T, N, 2, details::GetSOFNRISDCoeffs>;
// Second-order central differentiators // Second-order central differentiators
template <typename T, size_t N> using CenteredSecondOrderDiff = CentralDifferentiator<T, N, 2, details::GetSOCNRCoeffs>; template <typename T, size_t N> using CenteredSecondOrderDiff = CentralDifferentiator<T, N, 2, details::GetSOCNRCoeffs>;
// Second-order Time-Varying forward differentiators // Second-order Time-Varying backward differentiators
template <typename T, size_t N> using TVCenteredSecondOrderDiff = TVCentralDifferentiator<T, N, 2, details::GetSOCNRISDCoeffs>; template <typename T, size_t N> using TVCenteredSecondOrderDiff = TVCentralDifferentiator<T, N, 2, details::GetSOCNRISDCoeffs>;

Wyświetl plik

@ -44,7 +44,7 @@ template <typename T>
using vectXc_t = vectX_t<std::complex<T>>; /*!< Eigen complex column-vector */ using vectXc_t = vectX_t<std::complex<T>>; /*!< Eigen complex column-vector */
enum class FilterType { enum class FilterType {
Forward, Backward,
Centered Centered
}; };