P2: level-tracker UPDATE-loop located (inline bidirectional IIR in FUN_180529fe0), structural module leveltrack (iir_first_order/bidirectional/unrolled4); scalar==unrolled verified; remaining = live A[] coeffs

This commit is contained in:
2026-08-19 23:53:01 +03:00
parent cff28a605c
commit 433a0026e6
5 changed files with 116 additions and 1 deletions
+31
View File
@@ -0,0 +1,31 @@
#include <cstdio>
#include <cmath>
#include <vector>
#include <cstring>
#include "leveltrack.hpp"
int main() {
const size_t n = 37; // odd size to exercise the unrolled tail.
std::vector<double> A(n);
std::vector<float> 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<float>(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<float> 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;
}