Skip to content

Commit 2e5139e

Browse files
author
Martin Klang
committed
State variable filter
1 parent 4f36401 commit 2e5139e

1 file changed

Lines changed: 173 additions & 0 deletions

File tree

LibSource/StateVariableFilter.h

Lines changed: 173 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,173 @@
1+
#ifndef __StateVariableFilter_h__
2+
#define __StateVariableFilter_h__
3+
4+
/**
5+
* State Variable Filter based on Andy Simper's code:
6+
* @ref http://www.cytomic.com/files/dsp/SvfLinearTrapOptimised2.pdf
7+
*/
8+
9+
class StateVariableFilter {
10+
public:
11+
12+
void process(FloatArray input, FloatArray output){
13+
size_t nFrames = input.getSize();
14+
for(size_t s = 0; s < nFrames; s++){
15+
const float v0 = input[s];
16+
mV3 = v0 - mIc2eq;
17+
mV1 = m_a1 * mIc1eq + m_a2*mV3;
18+
mV2 = mIc2eq + m_a2 * mIc1eq + m_a3 * mV3;
19+
mIc1eq = 2. * mV1 - mIc1eq;
20+
mIc2eq = 2. * mV2 - mIc2eq;
21+
output[s] = m_m0 * v0 + m_m1 * mV1 + m_m2 * mV2;
22+
}
23+
}
24+
25+
void reset() {
26+
mV1 = 0.;
27+
mV2 = 0.;
28+
mV3 = 0.;
29+
mIc1eq = 0.;
30+
mIc2eq = 0.;
31+
}
32+
33+
void setLowPass(float freq, float q, float sampleRate){
34+
setLowPass(freq/sampleRate, q);
35+
}
36+
37+
void setLowPass(float fnorm, float q){
38+
const float w = tanf(M_PI * fnorm);
39+
const float g = w;
40+
const float k = 1. / q;
41+
m_a1 = 1./(1. + g * (g + k));
42+
m_a2 = g * m_a1;
43+
m_a3 = g * m_a2;
44+
m_m0 = 0;
45+
m_m1 = 0;
46+
m_m2 = 1.;
47+
}
48+
49+
void setHighPass(float freq, float q, float sampleRate){
50+
setHighPass(freq/sampleRate, q);
51+
}
52+
void setHighPass(float fnorm, float q){
53+
const float w = tanf(M_PI * fnorm);
54+
const float g = w;
55+
const float k = 1. / q;
56+
m_a1 = 1./(1. + g * (g + k));
57+
m_a2 = g * m_a1;
58+
m_a3 = g * m_a2;
59+
m_m0 = 1.;
60+
m_m1 = -k;
61+
m_m2 = -1.;
62+
}
63+
64+
void setBandPass(float freq, float q, float sampleRate){
65+
setBandPass(freq/sampleRate, q);
66+
}
67+
void setBandPass(float fnorm, float q){
68+
const float w = tanf(M_PI * fnorm);
69+
const float g = w;
70+
const float k = 1. / q;
71+
m_a1 = 1./(1. + g * (g + k));
72+
m_a2 = g * m_a1;
73+
m_a3 = g * m_a2;
74+
m_m0 = 0.;
75+
m_m1 = 1.;
76+
m_m2 = 0.;
77+
}
78+
79+
void setNotch(float freq, float q, float sampleRate){
80+
setNotch(freq/sampleRate, q);
81+
}
82+
void setNotch(float fnorm, float q){
83+
const float w = tanf(M_PI * fnorm);
84+
const float g = w;
85+
const float k = 1. / q;
86+
m_a1 = 1./(1. + g * (g + k));
87+
m_a2 = g * m_a1;
88+
m_a3 = g * m_a2;
89+
m_m0 = 1.;
90+
m_m1 = -k;
91+
m_m2 = 0.;
92+
}
93+
94+
void setPeak(float freq, float q, float sampleRate){
95+
setPeak(freq/sampleRate, q);
96+
}
97+
void setPeak(float fnorm, float q){
98+
const float w = tanf(M_PI * fnorm);
99+
const float g = w;
100+
const float k = 1. / q;
101+
m_a1 = 1./(1. + g * (g + k));
102+
m_a2 = g * m_a1;
103+
m_a3 = g * m_a2;
104+
m_m0 = 1.;
105+
m_m1 = -k;
106+
m_m2 = -2.;
107+
}
108+
109+
void setBell(float freq, float q, float gain, float sampleRate){
110+
setBell(freq/sampleRate, q, gain);
111+
}
112+
void setBell(float fnorm, float q, float gain){
113+
const float w = tanf(M_PI * fnorm);
114+
const float A = exp10f(gain/40.);
115+
const float g = w;
116+
const float k = 1 / q;
117+
m_a1 = 1./(1. + g * (g + k));
118+
m_a2 = g * m_a1;
119+
m_a3 = g * m_a2;
120+
m_m0 = 1.;
121+
m_m1 = k * (A * A - 1.);
122+
m_m2 = 0.;
123+
}
124+
125+
void setLowShelf(float freq, float q, float gain, float sampleRate){
126+
setLowShelf(freq/sampleRate, q, gain);
127+
}
128+
void setLowShelf(float fnorm, float q, float gain){
129+
const float w = tanf(M_PI * fnorm);
130+
const float A = exp10f(gain/40.);
131+
const float g = w / sqrtf(A);
132+
const float k = 1. / q;
133+
m_a1 = 1./(1. + g * (g + k));
134+
m_a2 = g * m_a1;
135+
m_a3 = g * m_a2;
136+
m_m0 = 1.;
137+
m_m1 = k * (A - 1.);
138+
m_m2 = (A * A - 1.);
139+
}
140+
141+
void setHighShelf(float freq, float q, float gain, float sampleRate){
142+
setHighShelf(freq/sampleRate, q, gain);
143+
}
144+
void setHighShelf(float fnorm, float q, float gain){
145+
const float w = tanf(M_PI * fnorm);
146+
const float A = exp10f(gain/40.);
147+
const float g = w / sqrtf(A);
148+
const float k = 1. / q;
149+
m_a1 = 1./(1. + g * (g + k));
150+
m_a2 = g * m_a1;
151+
m_a3 = g * m_a2;
152+
m_m0 = A*A;
153+
m_m1 = k*(1. - A)*A;
154+
m_m2 = (1. - A*A);
155+
}
156+
157+
private:
158+
// state
159+
float mV1 = 0.;
160+
float mV2 = 0.;
161+
float mV3 = 0.;
162+
float mIc1eq = 0.;
163+
float mIc2eq = 0.;
164+
// coefficients
165+
float m_a1 = 0.;
166+
float m_a2 = 0.;
167+
float m_a3 = 0.;
168+
float m_m0 = 0.;
169+
float m_m1 = 0.;
170+
float m_m2 = 0.;
171+
};
172+
173+
#endif // __StateVariableFilter_h__

0 commit comments

Comments
 (0)