71 FIR(
const T (&b)[
B],
const T factor = 1.0) : lenB(
B), factor(factor) {
78 coeff_b.resize(2 * lenB - 1);
79 for (uint16_t i = 0; i < 2 * lenB - 1; i++) {
80 coeff_b[i] = b[(2 * lenB - 1 - i) % lenB];
86 for (uint16_t i = 0; i < lenB; i++) x[i] = 0;
92 T* b_shift = &coeff_b[lenB - i_b - 1];
93 for (uint16_t i = 0; i < lenB; i++) {
94 b_terms += b_shift[i] * x[i];
97 if (i_b == lenB) i_b = 0;
100 if (!(std::is_same<T, float>::value || std::is_same<T, double>::value)) {
101 b_terms = b_terms / factor;
105 b_terms = b_terms / factor;
132 template <
size_t B,
size_t A>
133 IIR(
const T (&b)[
B],
const T (&_a)[
A], T factor = 1.0)
134 : factor(factor), lenB(
B), lenA(
A - 1) {
137 coeff_b.resize(2 * lenB - 1);
138 coeff_a.resize(2 * lenA - 1);
141 for (uint16_t i = 0; i < 2 * lenB - 1; i++) {
142 coeff_b[i] = b[(2 * lenB - 1 - i) % lenB] / a0;
144 for (uint16_t i = 0; i < 2 * lenA - 1; i++) {
145 coeff_a[i] = a[(2 * lenA - 2 - i) % lenA] / a0;
152 for (uint16_t i = 0; i < lenB; i++) x[i] = 0;
153 for (uint16_t i = 0; i < lenA; i++) y[i] = 0;
159 T* b_shift = &coeff_b[lenB - i_b - 1];
162 T* a_shift = &coeff_a[lenA - i_a - 1];
164 for (uint16_t i = 0; i < lenB; i++) {
165 b_terms += x[i] * b_shift[i];
167 for (uint16_t i = 0; i < lenA; i++) {
168 a_terms += y[i] * a_shift[i];
171 T filtered = b_terms - a_terms;
174 if (i_b == lenB) i_b = 0;
176 if (i_a == lenA) i_a = 0;
179 if (!(std::is_same<T, float>::value || std::is_same<T, double>::value)) {
180 filtered = filtered / factor;
184 filtered = filtered / factor;
192 const uint16_t lenB, lenA;
193 uint16_t i_b = 0, i_a = 0;
219 : b_0(b[0]), b_1(b[1]), b_2(b[2]), a_1(a[0]), a_2(a[1]) {}
227 : b_0(gain * b[0] / a[0]),
228 b_1(gain * b[1] / a[0]),
229 b_2(gain * b[2] / a[0]),
233 void reset()
override { x_0 = x_1 = y_1 = y_2 = 0; }
239 T b_terms = x_0 * b_0 + x_1 * b_1 + x_2 * b_2;
240 T a_terms = y_1 * a_1 + y_2 * a_2;
242 y_1 = b_terms - a_terms;
288 :
b_0(gain * b[0] / a[0]),
289 b_1(gain * b[1] / a[0]),
290 b_2(gain * b[2] / a[0]),
337 begin(frequency, sampleRate, q);
339 void begin(
float frequency,
float sampleRate,
float q = 0.7071f) {
340 T w0 = frequency * (2.0f *
PI / sampleRate);
342 T alpha = sinW0 / ((float)q * 2.0);
344 T scale = 1.0 / (1.0 + alpha);
372 begin(frequency, sampleRate, q);
374 void begin(
float frequency,
float sampleRate,
float q = 0.7071f) {
375 T w0 = frequency * (2.0f *
PI / sampleRate);
377 T alpha = sinW0 / ((float)q * 2.0);
379 T scale = 1.0 / (1.0 + alpha);
408 begin(frequency, sampleRate, q);
410 void begin(
float frequency,
float sampleRate,
float q = 1.0) {
411 T w0 = frequency * (2.0f *
PI / sampleRate);
413 T alpha = sinW0 / ((T)q * 2.0);
415 T scale = 1.0 / (1.0 + alpha);
445 begin(frequency, sampleRate, q);
448 void begin(
float frequency,
float sampleRate,
float q = 1.0) {
449 T w0 = frequency * (2.0f *
PI / sampleRate);
451 T alpha = sinW0 / ((float)q * 2.0);
453 T scale = 1.0 / (1.0 + alpha);
484 begin(frequency, sampleRate, gain, slope);
487 void begin(
float frequency,
float sampleRate,
float gain,
488 float slope = 1.0f) {
489 T a = pow(10.0, gain / 40.0f);
490 T w0 = frequency * (2.0f *
PI / sampleRate);
496 sqrt((pow(a, 2.0) + 1.0) * (1.0 / (
float)slope - 1.0) + 2.0 * a);
497 T aMinus = (a - 1.0) * cosW0;
498 T aPlus = (a + 1.0) * cosW0;
499 T scale = 1.0 / ((a + 1.0) + aMinus + sinsq);
531 begin(frequency, sampleRate, gain, slope);
533 void begin(
float frequency,
float sampleRate,
float gain,
534 float slope = 1.0f) {
535 T a = pow(10.0, gain / 40.0f);
536 T w0 = frequency * (2.0f *
PI / sampleRate);
542 sqrt((pow(a, 2.0) + 1.0) * (1.0 / (
float)slope - 1.0) + 2.0 * a);
543 T aMinus = (a - 1.0) * cosW0;
544 T aPlus = (a + 1.0) * cosW0;
545 T scale = 1.0 / ((a + 1.0) - aMinus + sinsq);
567template <
typename T,
size_t N>
570 SOSFilter(
const T (&b)[N][3],
const T (&a)[N][3],
const T (&gain)[N]) {
571 for (
size_t i = 0; i < N; i++)
575 for (
size_t i = 0; i < N; i++) {
583 SOSFilter(
const T (&b)[N][3],
const T (&a)[N][2],
const T (&gain)[N]) {
584 for (
size_t i = 0; i < N; i++)
588 for (
size_t i = 0; i < N; i++) filters[i] = new BiQuadDF2<T>(b[i], a[i]);
591 for (
size_t i = 0; i < N; i++) filters[i] = new BiQuadDF2<T>(b[i], a[i]);
596 for (
size_t i = 0; i < N; i++)
delete filters[i];
599 for (
Filter<T>*& filter : filters) filter->reset();
602 for (
Filter<T>*& filter : filters) value = filter->process(value);
609 void copy(T (&dest)[M],
const T* src) {
610 for (
size_t i = 0; i < M; i++) dest[i] = src[i];
622template <
typename T,
size_t N>
626 for (
size_t i = 0; i < N; i++) {
627 this->filters[i] = filters[i];
633 if (filter !=
nullptr) filter->reset();
639 if (filter !=
nullptr) {
640 value = filter->process(value);
#define PI
Definition AudioEffectsSuite.h:27