Files

42 lines
1.1 KiB
C++

#include "leveltrack.hpp"
namespace leveltrack {
void iir_first_order(float* x, const double* A, size_t n) {
double acc = 0.0;
for (size_t i = 0; i < n; i++) {
double y = static_cast<double>(x[i]) * A[i] + acc;
acc = y;
x[i] = static_cast<float>(y);
}
}
void iir_bidirectional(float* x, const double* A, size_t n) {
iir_first_order(x, A, n);
// reverse pass over reversed indices back into x (keep array order).
double acc = 0.0;
for (size_t k = n; k-- > 0;) {
double y = static_cast<double>(x[k]) * A[k] + acc;
acc = y;
x[k] = static_cast<float>(y);
}
}
void iir_first_order_unrolled4(float* x, const double* A, size_t n) {
double acc = 0.0;
size_t i = 0;
for (; i + 4 <= n;) {
for (int u = 0; u < 4; u++, i++) {
double y = static_cast<double>(x[i]) * A[i] + acc;
acc = y;
x[i] = static_cast<float>(y);
}
}
for (; i < n; i++) {
double y = static_cast<double>(x[i]) * A[i] + acc;
acc = y;
x[i] = static_cast<float>(y);
}
}
} // namespace leveltrack