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