1 #ifndef __StateVariableFilter_h__
2 #define __StateVariableFilter_h__
7 #define SVF_COMPUTE_BOUNDED
21 #ifdef SVF_COMPUTE_BOUNDED
26 const float k = 1.0f / q;
27 a1 = 1.0f/(1.0f + g * (g + k));
36 const float k =
kvalue(fc, q);
61 const float k =
kvalue(fc, q);
68 const float k =
kvalue(fc, q);
74 void setBell(
float fc,
float q,
float gain){
75 const float k =
kvalue(fc, q);
76 const float A = exp10f(gain/40.);
78 m1 = k * (A * A - 1.);
83 const float k =
kvalue(fc, q);
84 const float A = exp10f(gain/40.);
91 const float k =
kvalue(fc, q);
92 const float A = exp10f(gain/40.);
94 m1 = k * (1.0f - A) * A;
99 const float k =
kvalue(fc, q);
107 #ifndef SVF_COMPUTE_BOUNDED
123 #ifdef SVF_COMPUTE_BOUNDED
124 float v3 = v0 - ic2eq;
125 float v1 =
a1 * ic1eq +
a2*v3;
126 float v2 = ic2eq +
a2 * ic1eq +
a3 * v3;
128 float v1 =
a1 * ic1eq +
a2 * (v0 - ic2eq);
129 float v2 = ic2eq + g * v1;
131 ic1eq = 2. * v1 - ic1eq;
132 ic2eq = 2. * v2 - ic2eq;
133 return m0 * v0 +
m1 * v1 +
m2 * v2;
137 size_t nFrames = input.
getSize();
138 float v0, v1, v2, v3;
139 for(
size_t s = 0; s < nFrames; s++){
141 #ifdef SVF_COMPUTE_BOUNDED
143 v1 =
a1 * ic1eq +
a2*v3;
144 v2 = ic2eq +
a2 * ic1eq +
a3 * v3;
146 v1 =
a1 * ic1eq +
a2 * (v0 - ic2eq);
149 ic1eq = 2. * v1 - ic1eq;
150 ic2eq = 2. * v2 - ic2eq;
151 output[s] =
m0 * v0 +
m1 * v1 +
m2 * v2;
156 for(
size_t i = 0; i < in.
getSize(); i++){
163 for(
size_t i = 0; i < in.
getSize(); i++){
170 for(
size_t i = 0; i < in.
getSize(); i++){
181 float v0, v1, v2, v3;
183 for(
size_t s = 0; s < nFrames; s++){
185 #ifdef SVF_COMPUTE_BOUNDED
187 v1 =
a1 * ic1eq +
a2*v3;
188 v2 = ic2eq +
a2 * ic1eq +
a3 * v3;
190 v1 =
a1 * ic1eq +
a2 * (v0 - ic2eq);
193 ic1eq = 2. * v1 - ic1eq;
194 ic2eq = 2. * v2 - ic2eq;
197 high[s] = v0 -
m0*v1 - v2;
207 float v0, v1, v2, v3;
208 for(
size_t s = 0; s < nFrames; s++){
211 #ifdef SVF_COMPUTE_BOUNDED
213 v1 =
a1 * ic1eq +
a2*v3;
214 v2 = ic2eq +
a2 * ic1eq +
a3 * v3;
216 v1 =
a1 * ic1eq +
a2 * (v0 - ic2eq);
219 ic1eq = 2. * v1 - ic1eq;
220 ic2eq = 2. * v2 - ic2eq;
223 high[s] = v0 -
m0*v1 - v2;
266 for(
size_t ch=0; ch<len; ++ch){
270 float v0, v1, v2, v3;
271 float ic1eq = state[0];
272 float ic2eq = state[1];
273 for(
size_t s = 0; s < nFrames; s++){
275 #ifdef SVF_COMPUTE_BOUNDED
277 v1 =
a1 * ic1eq +
a2*v3;
278 v2 = ic2eq +
a2 * ic1eq +
a3 * v3;
280 v1 =
a1 * ic1eq +
a2 * (v0 - ic2eq);
283 ic1eq = 2. * v1 - ic1eq;
284 ic2eq = 2. * v2 - ic2eq;
285 out[s] =
m0 * v0 +
m1 * v1 +
m2 * v2;
State Variable Filter based on Andy Simper's code and analysis: http://www.cytomic....
void setCutoff(float fc, float q)
void setPeak(float fc, float q)
AbstractStateVariableFilter(float sr)
void setBell(float fc, float q, float gain)
void setHighPass(float fc, float q)
void setLowShelf(float fc, float q, float gain)
void setBandPass(float fc, float q)
float kvalue(float fc, float q)
void setLowPass(float fc, float q)
void setNotch(float fc, float q)
void setAllPass(float fc, float q)
void setHighShelf(float fc, float q, float gain)
virtual int getChannels()=0
virtual FloatArray getSamples(int channel)=0
This class contains useful methods for manipulating arrays of floats.
static void destroy(MultiStateVariableFilter *svf)
MultiStateVariableFilter(float sr, size_t channels, float *state)
static MultiStateVariableFilter * create(float sr, size_t channels)
static constexpr size_t STATE_VARIABLES_PER_CHANNEL
void process(AudioBuffer &input, AudioBuffer &output)
MultiStateVariableFilter(float sr)
Base class for signal processors such as Filters.
void processLowBandHighPass(FloatArray in, FloatArray fc, float q, FloatArray low, FloatArray band, FloatArray high)
void processBandPass(FloatArray in, FloatArray fc, float q, FloatArray out)
static StateVariableFilter * create(float sr)
StateVariableFilter(float sr)
void processHighPass(FloatArray in, FloatArray fc, float q, FloatArray out)
void processLowPass(FloatArray in, FloatArray fc, float q, FloatArray out)
static void destroy(StateVariableFilter *svf)
void processLowBandHighPass(FloatArray in, float fc, float q, FloatArray low, FloatArray band, FloatArray high)
Simultaneously process lowpass, bandpass and highpass filtered output.
void process(FloatArray input, FloatArray output)
static StereoStateVariableFilter * create(float sr)
StereoStateVariableFilter(float sr, float *state)
static void destroy(StereoStateVariableFilter *svf)