iir1
Loading...
Searching...
No Matches
Types.h
1
35
36#pragma once
37
38#include "Common.h"
39#include "MathSupplement.h"
40
41namespace Iir
42{
43
47struct IIR_EXPORT ComplexPair : complex_pair_t
48{
49 ComplexPair () = default;
50
51 static constexpr double epsilon = 1E-10;
52
53 explicit ComplexPair (const complex_t &c1) : complex_pair_t (c1, complex_t(0))
54 {
55 if (!isReal ())
56 throw_invalid_argument (
57 "A single complex number needs to be real.");
58 }
59
60 ComplexPair (const complex_t &c1, const complex_t &c2)
61 : complex_pair_t (c1, c2)
62 {
63 }
64
65 bool isReal () const
66 {
67 return (std::abs (first.imag ()) < epsilon)
68 && (std::abs (second.imag ()) < epsilon);
69 }
70
75 bool isMatchedPair () const
76 {
77 if ((isReal () && (std::abs (first.real ()) > epsilon))
78 && (std::abs (second.real ()) > epsilon))
79 return true;
80 return std::abs(second - std::conj (first)) < epsilon;
81 }
82
83 bool is_nan () const
84 {
85 return Iir::is_nan (first) || Iir::is_nan (second);
86 }
87};
88
92struct IIR_EXPORT PoleZeroPair
93{
94 ComplexPair poles = ComplexPair ();
95 ComplexPair zeros = ComplexPair ();
96
97 PoleZeroPair () = default;
98
99 static constexpr double epsilon = 1E-10;
100
101 // single pole/zero
102 PoleZeroPair (const complex_t &p, const complex_t &z)
103 : poles (p), zeros (z)
104 {
105 }
106
107 // pole/zero pair
108 PoleZeroPair (const complex_t &p1, const complex_t &z1,
109 const complex_t &p2, const complex_t &z2)
110 : poles (p1, p2), zeros (z1, z2)
111 {
112 }
113
114 bool isSinglePole () const
115 {
116 return (std::abs(poles.second) < epsilon) && (std::abs(zeros.second) < epsilon);
117 }
118
119 bool is_nan () const { return poles.is_nan () || zeros.is_nan (); }
120};
121
122}
Definition Biquad.cpp:40
Definition Types.h:48
bool isMatchedPair() const
Definition Types.h:75