iir1
Toggle main menu visibility
Loading...
Searching...
No Matches
iir
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
43
namespace
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
180
const
Cascade::Storage
getCascadeStorage
()
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
}
Iir::Biquad
Definition
Biquad.h:51
Iir::Biquad::setCoefficients
void setCoefficients(double a0, double a1, double a2, double b0, double b1, double b2)
Definition
Biquad.cpp:123
Iir::CascadeStages::getCascadeStorage
const Cascade::Storage getCascadeStorage()
Definition
Cascade.h:180
Iir::CascadeStages::setup
void setup(const double(&sosCoefficients)[MaxStages][6])
Definition
Cascade.h:137
Iir::CascadeStages::filter
Sample filter(const Sample in)
Definition
Cascade.h:168
Iir::CascadeStages::reset
void reset()
Definition
Cascade.h:125
Iir::Cascade::getNumStages
int getNumStages() const
Definition
Cascade.h:69
Iir::LayoutBase
Definition
Layout.h:62
Iir
Definition
Biquad.cpp:40
Iir::Cascade::Storage
Definition
Cascade.h:59
Generated on
for iir1 by
1.17.0