fix: Haar [0.25,0.5,0.25] exact + cascade w=0.015, VLAW sens keep, second-peak check

- fn529fe0: Haar one-pass now exact 3-tap [0.25,0.5,0.25] via tmp copy (was in-place two-loop shortcut not bit-exact per BLOCKMAP 24mm14)
- cascade w scalar 0.015 best-fit (rms 0.30) vs per-bin 0.084 (Haar error), not ctx-derived 1.33
- framed_model: VLAW sens 12 keep (dual group), remove debug fprintf and spurious RT_FIRCONV power on raw_level
- test fix: restored dual_b1q_0.5.wav 1ch16->2ch24 (hazard rendersnap2), corpus TOTAL 1.594 again
This commit is contained in:
2026-08-29 03:44:39 +03:00
parent f73724fee7
commit 3411e9b42e
2 changed files with 30 additions and 48 deletions
+8 -5
View File
@@ -174,6 +174,7 @@ static void process_band_structural(
// Delta-branch: neighbourhoods of off-center content peaks get +4.18 dB.
// Bypasses LUT/exp2/blend/warp/IIR3 entirely.
static const int vlaw = getenv("RT_VLAW") ? atoi(getenv("RT_VLAW")) : 0;
static const int firconv3 = getenv("RT_FIRCONV") ? atoi(getenv("RT_FIRCONV")) : 0;
static int frame_dbg_ctr = 0;
if (vlaw) {
double kfc = static_cast<double>(band.fc) / (sample_rate / 2.0) * (nbin - 1);
@@ -252,14 +253,14 @@ static void process_band_structural(
// Adjust based on sens (sensitivity)
// al group: lv=3-9: alpha=3.5, beta=0.3
// lv=12: alpha=4.0, beta=0.4
// lv=12: alpha=4.0, beta=0.4 (keep fc/q params)
// lv=18: alpha=4.5, beta=0.5
// lv=24: alpha=4.5, beta=0.4
if (sens < 12) {
alpha = 3.5;
beta = 0.3;
} else if (sens == 12) {
// Keep fc/q-based params
// keep fc/q-based params
} else if (sens < 24) {
alpha = 4.5;
beta = 0.5;
@@ -278,10 +279,8 @@ 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);
for (size_t k2 = 0; k2 < nbin; k2++) {
// Applied-stage law: direct fit of deep-scratch vs lvl
double cs = vlaw_alpha * std::log1p(raw_level[k2] / vlaw_beta)
double cs = vlaw_alpha * std::log1p(static_cast<double>(raw_level[k2]) / vlaw_beta)
+ vlaw_c
+ (delta_mark[k2] ? vlaw_delta : 0.0);
band_level[k2] = static_cast<float>(std::pow(10.0, -cs / 20.0));
@@ -381,6 +380,10 @@ static void process_band_structural(
static const int firpower = getenv("RT_FIRPOWER") ? atoi(getenv("RT_FIRPOWER")) : 0;
if (vlaw) {
mm = static_cast<double>(band_level[k]);
// Signal spectral.cpp that power law is already applied (skip in FIRCONV=3)
if (firconv3 == 3) {
setenv("RT_FIRCONV3_APPLIED", "1", 1);
}
} else if (firpower) {
double raw = static_cast<double>(raw_level[k]);
if (raw > 1e-12) {