36 #ifndef DSPFILTERS_BIQUAD_H
37 #define DSPFILTERS_BIQUAD_H
40 #include "MathSupplement.h"
45 struct BiquadPoleState;
57 template <
class StateType>
60 template <
typename Sample>
61 inline Sample process (
const Sample in,
const BiquadBase& b)
63 return static_cast<Sample
> (StateType::process1 (in, b, ac()));
69 complex_t response (
double normalizedFrequency)
const;
71 std::vector<PoleZeroPair> getPoleZeros ()
const;
73 double getA0 ()
const {
return m_a0; }
74 double getA1 ()
const {
return m_a1*m_a0; }
75 double getA2 ()
const {
return m_a2*m_a0; }
76 double getB0 ()
const {
return m_b0*m_a0; }
77 double getB1 ()
const {
return m_b1*m_a0; }
78 double getB2 ()
const {
return m_b2*m_a0; }
81 template <
class StateType,
typename Sample>
82 void process (
int numSamples, Sample* dest, StateType& state)
const
84 while (--numSamples >= 0)
85 *dest++ = state.process (*dest, *
this);
93 void setCoefficients (
double a0,
double a1,
double a2,
94 double b0,
double b1,
double b2);
96 void setOnePole (complex_t pole, complex_t zero);
98 void setTwoPole (complex_t pole1, complex_t zero1,
99 complex_t pole2, complex_t zero2);
101 void setPoleZeroPair (
const PoleZeroPair& pair)
103 if (pair.isSinglePole ())
104 setOnePole (pair.poles.first, pair.zeros.first);
106 setTwoPole (pair.poles.first, pair.zeros.first,
107 pair.poles.second, pair.zeros.second);
110 void setPoleZeroForm (
const BiquadPoleState& bps);
114 void applyScale (
double scale);
151 template <
class StateType,
typename Sample>
152 void smoothProcess1 (
int numSamples,
157 double t = 1. / numSamples;
158 double da1 = (m_a1 - sectionPrev.m_a1) * t;
159 double da2 = (m_a2 - sectionPrev.m_a2) * t;
160 double db0 = (m_b0 - sectionPrev.m_b0) * t;
161 double db1 = (m_b1 - sectionPrev.m_b1) * t;
162 double db2 = (m_b2 - sectionPrev.m_b2) * t;
164 while (--numSamples >= 0)
166 sectionPrev.m_a1 += da1;
167 sectionPrev.m_a2 += da2;
168 sectionPrev.m_b0 += db0;
169 sectionPrev.m_b1 += db1;
170 sectionPrev.m_b2 += db2;
172 *dest++ = state.process (*dest, sectionPrev);
179 template <
class StateType,
typename Sample>
180 void smoothProcess2 (
int numSamples,
186 double t = 1. / numSamples;
187 complex_t dp0 = (z.poles.first - zPrev.poles.first) * t;
188 complex_t dp1 = (z.poles.second - zPrev.poles.second) * t;
189 complex_t dz0 = (z.zeros.first - zPrev.zeros.first) * t;
190 complex_t dz1 = (z.zeros.second - zPrev.zeros.second) * t;
191 double dg = (z.gain - zPrev.gain) * t;
193 while (--numSamples >= 0)
195 zPrev.poles.first += dp0;
196 zPrev.poles.second += dp1;
197 zPrev.zeros.first += dz0;
198 zPrev.zeros.second += dz1;
201 *dest++ = state.process (*dest,
Biquad (zPrev));
208 void setOnePole (complex_t pole, complex_t zero)
210 BiquadBase::setOnePole (pole, zero);
213 void setTwoPole (complex_t pole1, complex_t zero1,
214 complex_t pole2, complex_t zero2)
216 BiquadBase::setTwoPole (pole1, zero1, pole2, zero2);
221 BiquadBase::setPoleZeroPair (pair);
224 void applyScale (
double scale)
226 BiquadBase::applyScale (scale);