40 lines
1.6 KiB
C++
40 lines
1.6 KiB
C++
#include <cstdio>
|
|
#include <cmath>
|
|
#include <vector>
|
|
#include <cstring>
|
|
#include "leveltrack.hpp"
|
|
#include "leveltrack_data.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);
|
|
|
|
// P1.5 live-capture data sanity (render_long.rpp: attack=0 release=0).
|
|
std::printf("live ltk: SR=%.0f nbins=%zu A_ATTACK[1]=%.4f A_ATTACK[319]=%.4f "
|
|
"A_RELEASE[1]=%.6f scalar870=%.2f scalar884=%.2f scalar888=%.2f\n",
|
|
(double)ltk::CTX_INTERNAL_SR, ltk::LEVEL_NBINS,
|
|
ltk::A_ATTACK[1], ltk::A_ATTACK[319],
|
|
ltk::A_RELEASE[1], (double)ltk::SCALAR0X40870,
|
|
(double)ltk::SCALAR0X40884, (double)ltk::SCALAR0X40888);
|
|
return maxd < 1e-6 ? 0 : 1;
|
|
} |