11 #include "control/system/type.h" 15 template<
typename T =
float>
16 using TC = std::complex<T>;
18 template<
typename T =
float>
19 using TCS = std::pair<TC<T>, TC<T>>;
37 template<
typename T =
float,
typename S = const T>
49 Biquad(T b0, T b1, T b2, T a1, T a2) : B{b0, b1, b2}, A{a1, a2} {};
61 Biquad(T b0, T b1, T b2, T a0, T a1, T a2) : B{b0 / a0, b1 / a0, b2 / a0}, A{a1 / a0, a2 / a0} {};
71 static_assert(!std::is_const<S>::value,
"Storage type S must be non-const to use ZPK.");
72 std::tie(B[0], B[1], B[2], A[0], A[1]) =
zpk2coef(z, p, k);
86 wz[0] = x * B[1] - A[0] * y + wz[1];
87 wz[1] = x * B[2] - A[1] * y;
101 return solve((T) 1, A[0], A[1]);
111 return solve(B[0], B[1], B[2]);
125 return abs(std::get<0>(p)) <= (T) 1
126 && abs(std::get<1>(p)) <= (T) 1;
160 std::tuple<T, T, T, T, T>
zpk2coef(TCS<T> z, TCS<T> p, T k) {
163 return std::make_tuple(
183 auto z1 = std::get<0>(z);
184 auto z2 = std::get<1>(z);
186 auto z1r = z1.real();
187 auto z1i = z1.imag();
188 auto z2r = z2.real();
192 ? std::make_tuple(-2 * z1r, z1r * z1r + z1i * z1i)
193 : std::make_tuple(-z1r - z2r, z1r * z2r);
212 TC<T> ds = std::sqrt(TC<T>(b * b, 0) - 4 * c);
215 return std::make_pair<TC<T>, TC<T>>((-b + ds) / (T) 2, (-b - ds) / (T) 2);
226 typedef T arithmetic_type;
227 typedef T storage_type;
230 template<
template<
typename,
typename>
class B,
typename T,
typename S>
232 typedef T arithmetic_type;
233 typedef S storage_type;
244 template<
typename B=Biquad<>,
size_t N = 1>
246 using T =
typename inspect_types<B>::arithmetic_type;
247 using BS = std::array<B, N>;
255 template<
typename... T>
Biquad(TCS< T > z, TCS< T > p, T k)
Definition: biquad.h:70
TCS< T > poles()
Definition: biquad.h:100
TCS< T > solve(T a, T b, T c)
Definition: biquad.h:206
BiquadCascade(T... bs)
Definition: biquad.h:256
BS bs
Definition: biquad.h:276
void reset()
Definition: biquad.h:132
T step(T u)
Definition: biquad.h:264
Biquad(T b0, T b1, T b2, T a1, T a2)
Definition: biquad.h:49
std::tuple< T, T, T, T, T > zpk2coef(TCS< T > z, TCS< T > p, T k)
Definition: biquad.h:160
bool stable()
Definition: biquad.h:121
TCS< T > zeros()
Definition: biquad.h:110
Biquad(T b0, T b1, T b2, T a0, T a1, T a2)
Definition: biquad.h:61
T step(T x)
Definition: biquad.h:81
std::tuple< T, T > zero2coef(TCS< T > z)
Definition: biquad.h:182