iir1
Loading...
Searching...
No Matches
Biquad.h
1
35
36#ifndef IIR1_BIQUAD_H
37#define IIR1_BIQUAD_H
38
39#include "Common.h"
40#include "MathSupplement.h"
41#include "Types.h"
42
43namespace Iir {
44
45 struct IIR_EXPORT BiquadPoleState;
46
47/*
48 * Holds coefficients for a second order Infinite Impulse Response
49 * digital filter. This is the building block for all IIR filters.
50 *
51 */
52 class IIR_EXPORT Biquad {
53 public:
54
55 Biquad() = default;
56
61 complex_t response (double normalizedFrequency) const;
62
66 std::vector<PoleZeroPair> getPoleZeros () const;
67
71 double getA0 () const { return m_a0; }
72
76 double getA1 () const { return m_a1*m_a0; }
77
81 double getA2 () const { return m_a2*m_a0; }
82
86 double getB0 () const { return m_b0*m_a0; }
87
91 double getB1 () const { return m_b1*m_a0; }
92
96 double getB2 () const { return m_b2*m_a0; }
97
104 template <class StateType>
105 inline double filter(double s, StateType& state) const
106 {
107 return state.filter(s, *this);
108 }
109
110 public:
120 void setCoefficients (double a0, double a1, double a2,
121 double b0, double b1, double b2);
122
126 void setOnePole (complex_t pole, complex_t zero);
127
131 void setTwoPole (complex_t pole1, complex_t zero1,
132 complex_t pole2, complex_t zero2);
133
137 void setPoleZeroPair (const PoleZeroPair& pair)
138 {
139 if (pair.isSinglePole ())
140 setOnePole (pair.poles.first, pair.zeros.first);
141 else
142 setTwoPole (pair.poles.first, pair.zeros.first,
143 pair.poles.second, pair.zeros.second);
144 }
145
146 void setPoleZeroForm (const BiquadPoleState& bps);
147
151 void setIdentity ();
152
157 void applyScale (double scale);
158
159 public:
160 double m_a0 = 1.0;
161 double m_a1 = 0.0;
162 double m_a2 = 0.0;
163 double m_b1 = 0.0;
164 double m_b2 = 0.0;
165 double m_b0 = 1.0;
166 };
167
168//------------------------------------------------------------------------------
169
170
175 struct IIR_EXPORT BiquadPoleState : PoleZeroPair
176 {
177 BiquadPoleState () = default;
178
179 explicit BiquadPoleState (const Biquad& s);
180
181 double gain = 1.0;
182 };
183
184}
185
186#endif
Definition Biquad.h:52
double getA2() const
Definition Biquad.h:81
void setOnePole(complex_t pole, complex_t zero)
Definition Biquad.cpp:141
double getA1() const
Definition Biquad.h:76
double filter(double s, StateType &state) const
Definition Biquad.h:105
std::vector< PoleZeroPair > getPoleZeros() const
Definition Biquad.cpp:115
void setPoleZeroPair(const PoleZeroPair &pair)
Definition Biquad.h:137
void setTwoPole(complex_t pole1, complex_t zero1, complex_t pole2, complex_t zero2)
Definition Biquad.cpp:156
double getA0() const
Definition Biquad.h:71
double getB0() const
Definition Biquad.h:86
double getB2() const
Definition Biquad.h:96
complex_t response(double normalizedFrequency) const
Definition Biquad.cpp:88
double getB1() const
Definition Biquad.h:91
Definition Biquad.cpp:40
Definition Biquad.h:176
Definition Types.h:93