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