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
This commit is contained in:
2026-08-29 10:18:17 +03:00
parent 3411e9b42e
commit febda55234
+9 -1
View File
@@ -576,7 +576,15 @@ void FramedDetector::setParams(const std::vector<DetectorBand>& bands) {
detkernel::twin_apply(c, z.data(), half + 1, out.data()); detkernel::twin_apply(c, z.data(), half + 1, out.data());
for (size_t k = 0; k <= half; k++) { 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::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<float>(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 // Store complex response for cascade 529c60