From febda55234c021a42afac5af9eeb607e733974fb Mon Sep 17 00:00:00 2001 From: Matiq Date: Sat, 29 Aug 2026 10:18:17 +0300 Subject: [PATCH] wip: twin floor hook RT_TWIN_FLOOR, keep canon 0.732 - twin floor 0.153 per NOTES 24dd is sens-dependent, default off (env opt-in) - keeps VLAW TOTAL 0.732 vs bridge 1.594, dual 0.714 (vs 0.193 claim was with corrupted ref) - next: k-mapping sens/q via campaign.py --- dsp/framed_model.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/dsp/framed_model.cpp b/dsp/framed_model.cpp index 341adfb..5db1747 100644 --- a/dsp/framed_model.cpp +++ b/dsp/framed_model.cpp @@ -576,7 +576,15 @@ void FramedDetector::setParams(const std::vector& bands) { detkernel::twin_apply(c, z.data(), half + 1, out.data()); for (size_t k = 0; k <= half; k++) { r[k] = std::sqrt(out[k].re * out[k].re + out[k].im * out[k].im); - r[k] = std::max(r[k], 1e-12f); + // Twin gain floor per NOTES 24dd: plugin caps res ≥0.153 @fc1000q1 + // Our twin 0.0069 at sens24 vs plugin 0.153 (k=22). Floor is + // content/sens-dependent; default off (canon). Opt-in via RT_TWIN_FLOOR. + static const float twin_floor = []{ + if (const char* e = getenv("RT_TWIN_FLOOR")) return static_cast(atof(e)); + return 0.0f; + }(); + if (twin_floor > 0) r[k] = std::max(r[k], twin_floor); + else r[k] = std::max(r[k], 1e-12f); } // Store complex response for cascade 529c60