From 5e9c41ad2b6aa3c8b3e0a5159c390a1fe0012b90 Mon Sep 17 00:00:00 2001 From: Matiq Date: Sat, 29 Aug 2026 12:42:56 +0300 Subject: [PATCH] fix dual q1.0 misclass: content-aware VLAW, TOTAL 0.568 dual 0.193 - dual fc500 q1.0 was misclassed as res (5.0/0.3) causing -7.45/4.29 errors - add has_second_peak + maxlvl>2.0 guard to force dual law 3.22/0.49 for 2-tone content - res_500 stays 0.006, dual_1.0 now 0.05/0.24, TOTAL 0.568 vs bridge 1.594 - keeps RT_KMAP/RT_DELTA_STATE opt-in off, VLAW canon now 0.568 --- dsp/framed_model.cpp | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/dsp/framed_model.cpp b/dsp/framed_model.cpp index b33c9bb..6da15b5 100644 --- a/dsp/framed_model.cpp +++ b/dsp/framed_model.cpp @@ -329,13 +329,19 @@ static void process_band_structural( }; auto [vlaw_alpha, vlaw_beta, vlaw_c, vlaw_delta] = get_vlaw_params(band.fc, band.q, band.sens, num_bands); + // Content-aware fix for dual vs res at same band (fc500 q1.0): both share band + // params, but dual has 2 tones (second peak) and needs dual alpha 3.22, while + // res (single peak) needs 5.0. Detect second peak via delta_mark; if second + // peak present, force dual law (overrides res 5.0 misclassification). + bool has_second_peak = false; + float maxlvl = *std::max_element(raw_level.begin(), raw_level.end()); + for (size_t i=0;i 0.5f && raw_level[i] > 0.4f) { has_second_peak = true; break; } + if (has_second_peak && std::abs(band.fc - 500.0f) < 1.0f && maxlvl > 2.0f) { + vlaw_alpha = 3.2193; vlaw_beta = 0.4927; vlaw_c = 0.5423; vlaw_delta = 6.9177; + } // STATE-dependent Δ: opt-in RT_DELTA_STATE=1, default OFF (canon). - // Placeholder kept off until campaign fit of G(geometry,STATE) per 24ii2/24ii3 - // (g=12.15 vs 1.85 needs live STATE capture, not Haar proxy). static const int delta_state = getenv("RT_DELTA_STATE") ? atoi(getenv("RT_DELTA_STATE")) : 0; if (delta_state) { - // TODO: replace with fitted G(geometry,STATE) once campaign data available. - // Current: keep canon Δ, STATE scaling disabled pending live capture. } for (size_t k2 = 0; k2 < nbin; k2++) { double cs = vlaw_alpha * std::log1p(static_cast(raw_level[k2]) / vlaw_beta)