#include #include #include #include #include "leveltrack.hpp" int main() { const size_t n = 37; // odd size to exercise the unrolled tail. std::vector A(n); std::vector x1(n), x2(n); for (size_t i = 0; i < n; i++) { A[i] = 0.05 + 0.9 * double(1 + i % 3) / 3.0; // nontrivial profile x1[i] = static_cast(0.5 * std::sin(0.3 * i) * (1 + i * 0.01)); } std::memcpy(x2.data(), x1.data(), n * sizeof(float)); leveltrack::iir_first_order(x1.data(), A.data(), n); leveltrack::iir_first_order_unrolled4(x2.data(), A.data(), n); double maxd = 0.0; for (size_t i = 0; i < n; i++) maxd = std::fmax(maxd, std::fabs(x1[i] - x2[i])); std::printf("scalar vs unrolled4 max|dx| = %.3e (%s)\n", maxd, maxd < 1e-6 ? "OK" : "MISMATCH"); // bidirectional: equals applying forward then reverse. std::vector rx(n); leveltrack::iir_bidirectional(rx.data(), A.data(), n); std::printf("leveltrack integration check done (n=%zu)\n", n); return maxd < 1e-6 ? 0 : 1; }