42#include "MathSupplement.h"
49 class IIR_EXPORT Cascade
59 struct IIR_EXPORT Storage
62 Storage(
const int maxNumBiquads,
Biquad*
const biquadArray) : maxStages(maxNumBiquads), stageArray(biquadArray) {}
63 const int maxStages = 0;
64 Biquad*
const stageArray =
nullptr;
80 if ((index < 0) || (index >= m_numStages))
81 throw_invalid_argument(
"Index out of bounds.");
82 return m_stageArray[index];
89 complex_t response (
double normalizedFrequency)
const;
94 std::vector<PoleZeroPair> getPoleZeros ()
const;
96 void setCascadeStorage (
const Storage& storage);
98 void applyScale (
double scale);
105 Biquad* m_stageArray =
nullptr;
115 template <
int MaxStages,
class StateType>
116 class CascadeStages {
119 CascadeStages() =
default;
128 for (
auto &state: m_states)
138 void setup (
const double (&sosCoefficients)[MaxStages][6]) {
139 for (
int i = 0; i < MaxStages; i++) {
140 m_stages[i].setCoefficients(
141 sosCoefficients[i][3],
142 sosCoefficients[i][4],
143 sosCoefficients[i][5],
144 sosCoefficients[i][0],
145 sosCoefficients[i][1],
146 sosCoefficients[i][2]);
150 void setup (
const std::array<std::array<double,6>,MaxStages> sosCoefficients) {
151 for (
int i = 0; i < MaxStages; i++) {
153 sosCoefficients[i][3],
154 sosCoefficients[i][4],
155 sosCoefficients[i][5],
156 sosCoefficients[i][0],
157 sosCoefficients[i][1],
158 sosCoefficients[i][2]);
168 template <
typename Sample>
172 StateType* state = m_states;
173 for (
const auto &stage: m_stages)
174 out = (state++)->
filter(out, stage);
175 return static_cast<Sample
> (out);
188 Biquad m_stages[MaxStages] = {};
189 StateType m_states[MaxStages] = {};
void setCoefficients(double a0, double a1, double a2, double b0, double b1, double b2)
Definition Biquad.cpp:123
const Cascade::Storage getCascadeStorage()
Definition Cascade.h:181
void setup(const double(&sosCoefficients)[MaxStages][6])
Definition Cascade.h:138
Sample filter(const Sample in)
Definition Cascade.h:169
void reset()
Definition Cascade.h:126
int getNumStages() const
Definition Cascade.h:70