iir1
Loading...
Searching...
No Matches
Cascade.h
1
35
36#pragma once
37
38#include "Common.h"
39#include "Biquad.h"
40#include "Layout.h"
41#include "MathSupplement.h"
42
43namespace Iir {
44
48 class IIR_EXPORT Cascade
49 {
50 public:
51
52 Cascade () = default;
53
58 struct IIR_EXPORT Storage
59 {
60 Storage() = delete;
61 Storage(const int maxNumBiquads, Biquad* const biquadArray) : maxStages(maxNumBiquads), stageArray(biquadArray) {}
62 const int maxStages = 0;
63 Biquad* const stageArray = nullptr;
64 };
65
69 int getNumStages () const
70 {
71 return m_numStages;
72 }
73
77 const Biquad& operator[] (int index)
78 {
79 if ((index < 0) || (index >= m_numStages))
80 throw_invalid_argument("Index out of bounds.");
81 return m_stageArray[index];
82 }
83
88 complex_t response (double normalizedFrequency) const;
89
93 std::vector<PoleZeroPair> getPoleZeros () const;
94
95 void setCascadeStorage (const Storage& storage);
96
97 void applyScale (double scale);
98
99 void setLayout (const LayoutBase& proto);
100
101 private:
102 int m_numStages = 0;
103 int m_maxStages = 0;
104 Biquad* m_stageArray = nullptr;
105 };
106
107
108//------------------------------------------------------------------------------
109
114 template <int MaxStages,class StateType>
115 class CascadeStages {
116
117 public:
118 CascadeStages() = default;
119
120
121 public:
125 void reset ()
126 {
127 for (auto &state: m_states)
128 state.reset();
129 }
130
131 public:
137 void setup (const double (&sosCoefficients)[MaxStages][6]) {
138 for (int i = 0; i < MaxStages; i++) {
139 m_stages[i].setCoefficients(
140 sosCoefficients[i][3],
141 sosCoefficients[i][4],
142 sosCoefficients[i][5],
143 sosCoefficients[i][0],
144 sosCoefficients[i][1],
145 sosCoefficients[i][2]);
146 }
147 }
148
149 void setup (const std::array<std::array<double,6>,MaxStages> sosCoefficients) {
150 for (int i = 0; i < MaxStages; i++) {
151 m_stages[i].setCoefficients(
152 sosCoefficients[i][3],
153 sosCoefficients[i][4],
154 sosCoefficients[i][5],
155 sosCoefficients[i][0],
156 sosCoefficients[i][1],
157 sosCoefficients[i][2]);
158 }
159 }
160
161 public:
167 template <typename Sample>
168 inline Sample filter(const Sample in)
169 {
170 double out = in;
171 StateType* state = m_states;
172 for (const auto &stage: m_stages)
173 out = (state++)->filter(out, stage);
174 return static_cast<Sample> (out);
175 }
176
181 {
182 const Cascade::Storage s(MaxStages, m_stages);
183 return s;
184 }
185
186 private:
187 Biquad m_stages[MaxStages] = {};
188 StateType m_states[MaxStages] = {};
189 };
190
191}
Definition Biquad.h:51
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:180
void setup(const double(&sosCoefficients)[MaxStages][6])
Definition Cascade.h:137
Sample filter(const Sample in)
Definition Cascade.h:168
void reset()
Definition Cascade.h:125
int getNumStages() const
Definition Cascade.h:69
Definition Layout.h:62
Definition Biquad.cpp:40
Definition Cascade.h:59