fix: framed_test parse every comma band (was first-arg only); comb tests were single-band

This commit is contained in:
2026-08-21 00:52:44 +03:00
parent b333f6828f
commit e990c21e94
2 changed files with 26 additions and 6 deletions
+4 -3
View File
@@ -65,12 +65,13 @@ int main(int argc, char** argv) {
if (!load_wav(argv[1], x, sr)) { fprintf(stderr, "cannot load %s\n", argv[1]); return 1; } if (!load_wav(argv[1], x, sr)) { fprintf(stderr, "cannot load %s\n", argv[1]); return 1; }
std::vector<DetectorBand> bands; std::vector<DetectorBand> bands;
if (argc >= 4 && strchr(argv[3], ',')) { if (argc >= 4 && strchr(argv[3], ',')) {
// comma form: "fc,q,sens[,scale]" // comma form: one or more "fc,q,sens[,scale]" args, each parsed separately
for (int i = 3; i < argc; i++) {
float fc, q, sens, scl = 1.0f; float fc, q, sens, scl = 1.0f;
// parse first 3 if (sscanf(argv[i], "%f,%f,%f,%f", &fc, &q, &sens, &scl) < 3) continue;
int n = sscanf(argv[3], "%f,%f,%f,%f", &fc, &q, &sens, &scl);
DetectorBand b; b.fc = fc; b.q = q; b.sens = sens; b.level_scale = scl; DetectorBand b; b.fc = fc; b.q = q; b.sens = sens; b.level_scale = scl;
bands.push_back(b); bands.push_back(b);
}
} else { } else {
for (int i = 3; i + 2 < argc; i += 3) { for (int i = 3; i + 2 < argc; i += 3) {
DetectorBand b; DetectorBand b;
+19
View File
@@ -1163,3 +1163,22 @@ were NOT the reference config. Even with corrected fc/q/sens the model still ove
- per-band mode 0/3 (peak vs shelf/tilt band types, M10) not dispatched. - per-band mode 0/3 (peak vs shelf/tilt band types, M10) not dispatched.
No code change; investigation only. These require the structural combine/acc + per-band type No code change; investigation only. These require the structural combine/acc + per-band type
before 4-band comb can close. before 4-band comb can close.
## ============ UPDATE 2026-08-21: multi-band parser fix + combine/sens experiments ============
### infra FIX: framed_test comma form only parsed argv[3] -> multiband comb tests actually
ran a SINGLE band (first comma-arg ignored the rest). Now parses every comma-arg from
argv[3..]. With correct 4-band params and faithful min(), honest comb = mean 10.15 (over-cut
-7..-15 dB). Single-band corpus unchanged (t1kq 0.226, dual 0.726) => parser fix is safe.
### combine/sens experiments (reverted, doc only)
Tried closing comb via additive dB-sum (red=sum_i red_i) and signed sens-weight
S=sign(sens)*min(1,|sens|/12) applied to C. Neither reproduces comb_ref neutrality (~0 dB):
min() comb mean 10.15 (baseline)
additive comb mean 15.68 (worse: all bands cut, no compensation)
additive+S comb mean 15.68 (neg-sens band2 at fc=1778 doesn't counter band1 @1000)
Real soothe2 comb is neutral DESPITE band1 (fc=1000 sens+12) active. band2 sens=-12 at
fc=1778 has res~1.9 on the 500..3000 tones, so its naive compensation is tiny vs band1's
cut. => Naive additive/sens formulas CANNOT model the negative-sens band interaction; it
lives in the structural combine/acc 0x5407c8 (per-bin weights kRTAtt/kRTRel + negative
sens entering the level path with opposite sign), which requires the real exp2-domain
chain, not the bridge. comb stays OPEN (structural combine/acc, P4/P5).