1#ifndef CONSTFILT_ANALOG_FILTER_HPP
2#define CONSTFILT_ANALOG_FILTER_HPP
4#include "discretize.hpp"
6#include "stability.hpp"
32template <
typename T, consteig::Size N,
typename Method = Tustin,
33 bool CheckStab =
true>
34class AnalogFilter :
public Filter<T, N + 1u, N + 1u>
36 static_assert(N >= 1u,
"Filter order must be at least 1");
39 constexpr AnalogFilter(
const T (&b_c)[N + 1u],
const T (&a_c)[N + 1u],
41 : AnalogFilter(checked_discretize(b_c, a_c, sample_rate_hz))
45 constexpr AnalogFilter(TransferFunction<T, N + 1u, N + 1u> continuous_tf,
47 : AnalogFilter(checked_discretize(continuous_tf.b, continuous_tf.a,
53 constexpr explicit AnalogFilter(
54 TransferFunction<T, N + 1u, N + 1u> digital_tf)
55 : Filter<T, N + 1u, N + 1u>(digital_tf.b, digital_tf.a)
59 static constexpr TransferFunction<T, N + 1u, N + 1u> checked_discretize(
60 const T (&b_c)[N + 1u],
const T (&a_c)[N + 1u], T sample_rate_hz)
89 return analog_to_digital<T, N>(
90 b_c, a_c,
static_cast<T
>(1) / sample_rate_hz, Method{});