66 FIR(
const T (&b)[B],
const T factor = 1.0) : lenB(B), factor(factor) {
71 void setValues(
const T (&b)[B]) {
73 coeff_b.resize(2 * lenB - 1);
74 for (uint16_t i = 0; i < 2 * lenB - 1; i++) {
75 coeff_b[i] = b[(2 * lenB - 1 - i) % lenB];
82 T *b_shift = &coeff_b[lenB - i_b - 1];
83 for (uint8_t i = 0; i < lenB; i++) {
84 b_terms += b_shift[i] * x[i];
87 if (i_b == lenB) i_b = 0;
90 if (!(std::is_same<T, float>::value || std::is_same<T, float>::value)) {
91 b_terms = b_terms / factor;
95 b_terms = b_terms / factor;
120 template <
size_t B,
size_t A>
121 IIR(
const T (&b)[B],
const T (&_a)[A], T factor = 1.0)
122 : factor(factor), lenB(B), lenA(A - 1) {
125 coeff_b.resize(2 * lenB - 1);
126 coeff_a.resize(2 * lenA - 1);
129 for (uint16_t i = 0; i < 2 * lenB - 1; i++) {
130 coeff_b[i] = b[(2 * lenB - 1 - i) % lenB] / a0;
132 for (uint16_t i = 0; i < 2 * lenA - 1; i++) {
133 coeff_a[i] = a[(2 * lenA - 2 - i) % lenA] / a0;
141 T *b_shift = &coeff_b[lenB - i_b - 1];
144 T *a_shift = &coeff_a[lenA - i_a - 1];
146 for (uint8_t i = 0; i < lenB; i++) {
147 b_terms += x[i] * b_shift[i];
149 for (uint8_t i = 0; i < lenA; i++) {
150 a_terms += y[i] * a_shift[i];
153 T filtered = b_terms - a_terms;
156 if (i_b == lenB) i_b = 0;
158 if (i_a == lenA) i_a = 0;
161 if (!(std::is_same<T, float>::value || std::is_same<T, float>::value)) {
162 filtered = filtered / factor;
166 filtered = filtered / factor;
174 const uint8_t lenB, lenA;
175 uint8_t i_b = 0, i_a = 0;
194 BiQuadDF1(
const T (&b)[3],
const T (&a)[3])
200 BiQuadDF1(
const T (&b)[3],
const T (&a)[2])
201 : b_0(b[0]), b_1(b[1]), b_2(b[2]), a_1(a[0]), a_2(a[1]) {}
202 BiQuadDF1(
const T (&b)[3],
const T (&a)[2], T gain)
208 BiQuadDF1(
const T (&b)[3],
const T (&a)[3], T gain)
209 : b_0(gain * b[0] / a[0]),
210 b_1(gain * b[1] / a[0]),
211 b_2(gain * b[2] / a[0]),
219 T b_terms = x_0 * b_0 + x_1 * b_1 + x_2 * b_2;
220 T a_terms = y_1 * a_1 + y_2 * a_2;
222 y_1 = b_terms - a_terms;
252 BiQuadDF2(
const T (&b)[3],
const T (&a)[3])
258 BiQuadDF2(
const T (&b)[3],
const T (&a)[2])
259 : b_0(b[0]), b_1(b[1]), b_2(b[2]), a_1(a[0]), a_2(a[1]) {}
260 BiQuadDF2(
const T (&b)[3],
const T (&a)[2], T gain)
266 BiQuadDF2(
const T (&b)[3],
const T (&a)[3], T gain)
267 : b_0(gain * b[0] / a[0]),
268 b_1(gain * b[1] / a[0]),
269 b_2(gain * b[2] / a[0]),
276 w_0 = value - a_1 * w_1 - a_2 * w_2;
277 T y = b_0 * w_0 + b_1 * w_1 + b_2 * w_2;
311 LowPassFilter(
float frequency,
float sampleRate,
float q = 0.7071f)
313 begin(frequency, sampleRate, q);
315 void begin(
float frequency,
float sampleRate,
float q = 0.7071f) {
316 T w0 = frequency * (2.0f * PI / sampleRate);
318 T alpha = sinW0 / ((float)q * 2.0);
320 T scale = 1.0 / (1.0 + alpha);
345 HighPassFilter(
float frequency,
float sampleRate,
float q = 0.7071)
347 begin(frequency, sampleRate, q);
349 void begin(
float frequency,
float sampleRate,
float q = 0.7071) {
350 T w0 = frequency * (2.0f * PI / sampleRate);
352 T alpha = sinW0 / ((float)q * 2.0);
354 T scale = 1.0 / (1.0 + alpha);
451 begin(frequency, sampleRate, gain, slope);
454 void begin(
float frequency,
float sampleRate,
float gain,
455 float slope = 1.0f) {
456 T a = pow(10.0, gain / 40.0f);
457 T w0 = frequency * (2.0f * PI / sampleRate);
463 sqrt((pow(a, 2.0) + 1.0) * (1.0 / (
float)slope - 1.0) + 2.0 * a);
464 T aMinus = (a - 1.0) * cosW0;
465 T aPlus = (a + 1.0) * cosW0;
466 T scale = 1.0 / ((a + 1.0) + aMinus + sinsq);
494 begin(frequency, sampleRate, gain, slope);
496 void begin(
float frequency,
float sampleRate,
float gain,
497 float slope = 1.0f) {
498 T a = pow(10.0, gain / 40.0f);
499 T w0 = frequency * (2.0f * PI / sampleRate);
505 sqrt((pow(a, 2.0) + 1.0) * (1.0 / (
float)slope - 1.0) + 2.0 * a);
506 T aMinus = (a - 1.0) * cosW0;
507 T aPlus = (a + 1.0) * cosW0;
508 T scale = 1.0 / ((a + 1.0) - aMinus + sinsq);