docs: NOTES_LEVEL update — LUT level-domain discovery, sweep tooling hazard
This commit is contained in:
@@ -1182,3 +1182,42 @@ cut. => Naive additive/sens formulas CANNOT model the negative-sens band interac
|
|||||||
lives in the structural combine/acc 0x5407c8 (per-bin weights kRTAtt/kRTRel + negative
|
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
|
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).
|
chain, not the bridge. comb stays OPEN (structural combine/acc, P4/P5).
|
||||||
|
|
||||||
|
## ============ UPDATE 2026-08-21: LUT moved to LEVEL domain (structural chain) ============
|
||||||
|
### Discovery: mask-domain LUT clamps on loud input
|
||||||
|
- Mask-domain LUT (committed 9b7e9d3) computes t=(mask_dB-A)/(B-A); for loud input
|
||||||
|
(tone1k 0dBFS) post-exp2 mask_dB < A=-13.78 => t clamps to 0 => val=0 => FULL cut.
|
||||||
|
Measured t1k err -24.04 dB. Root cause: exp2(-level) output dB range is unbounded
|
||||||
|
below, LUT domain [A,B] assumes bounded input.
|
||||||
|
- FIX: apply FUN_180563a60 power-law to LEVEL (am/res*scale) BEFORE IIR/exp2:
|
||||||
|
lvl = pow(t, gamma)*MULT, t=(20*log10(lvl)-A)/(B-A) clamp [0,1].
|
||||||
|
Level dB stays inside [A,B] for both quiet (t1kq: +6.2dB) and loud (t1k: +24dB).
|
||||||
|
Result: t1k err -24.04 -> +2.45 dB.
|
||||||
|
|
||||||
|
### TOOLING HAZARD: stale-binary sweeps
|
||||||
|
- cmake --build skips recompile when source mtime unchanged within same second;
|
||||||
|
param sweeps silently re-run the SAME binary (9-point sweep -> 1 unique result).
|
||||||
|
Earlier "gamma doesn't matter" observation was this artifact, NOT DSP behavior.
|
||||||
|
- Protocol now: os.utime(src) before build + assert binary mtime fresh (sweep_fresh.py).
|
||||||
|
|
||||||
|
### Fresh 2D sweep (g x mult, verified builds), 3-case smoke (render48k 48k/4096):
|
||||||
|
g=0.344 m=3.8 optimum: t1kq=-0.788 t1k=+2.453 al12=+0.037 mean|err|=1.093
|
||||||
|
(committed version was mean 8.2). gamma>=0.9 ALL worse (+2..+5): spatial IIR
|
||||||
|
after LUT redistributes peaks; naive ratio math (need g=1.17 from raw t ratio
|
||||||
|
1.744->2.0) does NOT survive the IIR chain. Empirics rule.
|
||||||
|
- MULT=3.8 is a PLACEHOLDER (maps t^gamma back to level domain; no decomp basis yet).
|
||||||
|
A/B/gamma are decomp-extracted (BandConfig ctx+0x188 refs, NOTES:967).
|
||||||
|
|
||||||
|
### Scope clarification
|
||||||
|
- scripts/corpus.py exercises the BRIDGE path only (44.1k non-internal grid):
|
||||||
|
full corpus 1.594 mean / comb 10.15 — UNCHANGED by structural work (verified
|
||||||
|
stash-compare). comb regression is pre-existing bridge state, separate issue.
|
||||||
|
- Structural chain validated via render48k smoke (3 cases) + module checks
|
||||||
|
(fn529fe0/exp2/twin/tables/leveltrack/levelpath/fftconv all PASS).
|
||||||
|
- render48k tail artifact: last BLK=65536 block zero-pads => am decays in final
|
||||||
|
frames (~last 0.06s of y48). Cosmetic; metric window barely affected.
|
||||||
|
|
||||||
|
### Commit: 535b150 (LUT level-domain restructure).
|
||||||
|
NEXT: step 3 wire combine_acc track into mask output (currently computed,
|
||||||
|
discarded); step 4 FFT-conv 0x535a70 mask smoothing; then decode BandConfig
|
||||||
|
ctx+0x188 writers to replace MULT placeholder with decomp value.
|
||||||
|
|||||||
Reference in New Issue
Block a user