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;
310 LowPassFilter(
float frequency,
float sampleRate,
float q = 0.7071f)
312 begin(frequency, sampleRate, q);
314 void begin(
float frequency,
float sampleRate,
float q = 0.7071f) {
315 T w0 = frequency * (2.0f * 3.141592654f / sampleRate);
317 T alpha = sinW0 / ((float)q * 2.0);
319 T scale = 1.0 / (1.0 + alpha);
343 HighPassFilter(
float frequency,
float sampleRate,
float q = 0.7071)
345 begin(frequency, sampleRate, q);
347 void begin(
float frequency,
float sampleRate,
float q = 0.7071) {
348 T w0 = frequency * (2.0f * 3.141592654f / sampleRate);
350 T alpha = sinW0 / ((float)q * 2.0);
352 T scale = 1.0 / (1.0 + alpha);
409 NotchFilter(
float frequency,
float sampleRate,
float q = 1.0)
411 begin(frequency, sampleRate, q);
414 void begin(
float frequency,
float sampleRate,
float q = 1.0) {
415 T w0 = frequency * (2.0f * 3.141592654f / sampleRate);
417 T alpha = sinW0 / ((float)q * 2.0);
419 T scale = 1.0 / (1.0 + alpha);
446 begin(frequency, sampleRate, gain, slope);
449 void begin(
float frequency,
float sampleRate,
float gain,
450 float slope = 1.0f) {
451 T a = pow(10.0, gain / 40.0f);
452 T w0 = frequency * (2.0f * 3.141592654f / sampleRate);
458 sqrt((pow(a, 2.0) + 1.0) * (1.0 / (
float)slope - 1.0) + 2.0 * a);
459 T aMinus = (a - 1.0) * cosW0;
460 T aPlus = (a + 1.0) * cosW0;
461 T scale = 1.0 / ((a + 1.0) + aMinus + sinsq);
488 begin(frequency, sampleRate, gain, slope);
490 void begin(
float frequency,
float sampleRate,
float gain,
491 float slope = 1.0f) {
492 T a = pow(10.0, gain / 40.0f);
493 T w0 = frequency * (2.0f * 3.141592654f / sampleRate);
499 sqrt((pow(a, 2.0) + 1.0) * (1.0 / (
float)slope - 1.0) + 2.0 * a);
500 T aMinus = (a - 1.0) * cosW0;
501 T aPlus = (a + 1.0) * cosW0;
502 T scale = 1.0 / ((a + 1.0) - aMinus + sinsq);