iir1
Loading...
Searching...
No Matches
Cascade.h
1
36#ifndef IIR1_CASCADE_H
37#define IIR1_CASCADE_H
38
39#include "Common.h"
40#include "Biquad.h"
41#include "Layout.h"
42#include "MathSupplement.h"
43
44namespace Iir {
45
49 class DllExport Cascade
50 {
51 public:
52
56 struct DllExport Storage
57 {
63 Storage (int maxStages_, Biquad* const stageArray_)
64 : maxStages (maxStages_)
65 , stageArray (stageArray_)
66 {
67 }
68
69 const int maxStages = 0;
70 Biquad* const stageArray = nullptr;
71 };
72
76 int getNumStages () const
77 {
78 return m_numStages;
79 }
80
84 const Biquad& operator[] (int index)
85 {
86 if ((index < 0) || (index >= m_numStages))
87 throw_invalid_argument("Index out of bounds.");
88 return m_stageArray[index];
89 }
90
95 complex_t response (double normalizedFrequency) const;
96
100 std::vector<PoleZeroPair> getPoleZeros () const;
101
102 protected:
103 Cascade ();
104
105 void setCascadeStorage (const Storage& storage);
106
107 void applyScale (double scale);
108
109 void setLayout (const LayoutBase& proto);
110
111 private:
112 int m_numStages = 0;
113 int m_maxStages = 0;
114 Biquad* m_stageArray = nullptr;
115 };
116
117
118
119//------------------------------------------------------------------------------
120
125 template <int MaxStages,class StateType>
126 class DllExport CascadeStages {
127 public:
131 void reset ()
132 {
133 for (auto &state: m_states)
134 state.reset();
135 }
136
137 public:
143 void setup (const double (&sosCoefficients)[MaxStages][6]) {
144 for (int i = 0; i < MaxStages; i++) {
145 m_stages[i].setCoefficients(
146 sosCoefficients[i][3],
147 sosCoefficients[i][4],
148 sosCoefficients[i][5],
149 sosCoefficients[i][0],
150 sosCoefficients[i][1],
151 sosCoefficients[i][2]);
152 }
153 }
154
155 public:
161 template <typename Sample>
162 inline Sample filter(const Sample in)
163 {
164 double out = in;
165 StateType* state = m_states;
166 for (const auto &stage: m_stages)
167 out = (state++)->filter(out, stage);
168 return static_cast<Sample> (out);
169 }
170
175 {
176 return Cascade::Storage (MaxStages, m_stages);
177 }
178
179 private:
180 Biquad m_stages[MaxStages] = {};
181 StateType m_states[MaxStages] = {};
182 };
183
184}
185
186#endif
Definition Biquad.h:53
Definition Cascade.h:126
const Cascade::Storage getCascadeStorage()
Definition Cascade.h:174
void setup(const double(&sosCoefficients)[MaxStages][6])
Definition Cascade.h:143
Sample filter(const Sample in)
Definition Cascade.h:162
void reset()
Definition Cascade.h:131
Definition Cascade.h:50
int getNumStages() const
Definition Cascade.h:76
Definition Layout.h:63
Definition Biquad.cpp:40
Definition Cascade.h:57
Storage(int maxStages_, Biquad *const stageArray_)
Definition Cascade.h:63