iir1
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 
44 namespace 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