P4: AGENTS.md — honest baseline state (log-domain LUT bridge, correct 24-bit metric)

Replaces stale exp2(am/res) chain description + wrong metrics with the actual
honest state: C=G*LUT(log10(am/res))+W*warp^A, gain=(1-C)*res^rp; dual<=0.72,
fc-scan<=0.59, corpus mean 0.77. Documents the 24-bit metric trap, negative
broadband test, and the remaining structural gaps (combine + FFT-conv, A/B/gamma).
This commit is contained in:
2026-08-20 18:31:22 +03:00
parent 9a26532c60
commit cc52461903
+21 -20
View File
@@ -52,29 +52,30 @@ err = db(ta(out,1000)/ta(ref,1000)) # err в dB, цель <0.1
## Текущее состояние (2026-08-20, P4)
**Декодировано и транскрибировано в `dsp/framed_model.cpp`** (mask-apply цепь
`FUN_180529fe0`, mono-path 0x5408b8==0):
**Реализованная модель в `dsp/framed_model.cpp`** — BRIDGE-канон (NOTES:147, honest):
```
level=am*res*level_scale -> scale(0x540870*0x54088c/0x1a0)
-> IIR1 leaky(A1/B1) -> IIR2(A2/B2) -> mask=exp2(-mask)*blend (bigkernel 0x26b820)
-> combine/acc(0x5407c8) -> warp(mask*=0x540768, *=warp) -> IIR3(A3/B3)x2
-> dry/wet(mask*(fVar30*0x540888)+(1-fVar30)) -> [FFT-conv]
am_k: smoothed amp (2|X|/wsum, att~11ms/trel~80ms)
xv = log10(am_k / res_k) res_k = |2B/A| twin (min@band centre)
C = G·LUT(xv) + W·warp(f_k)^A G/W/A = 0.9963/0.3335/0.9807 (fit)
gain_k = (1C) · res_k^rp(Q) rp(Q) = 0.0275·Q^0.2159
LUT = monotone cubic (FritschCarlson) через joint-fit узлы (al_* + B.11 anchors)
```
- **bigkernel 0x26b820 = векторизованный exp2** (log2e=1.4424, floor 708.9, N-таблицы);
семантика залочена: `mask = exp2(-level) * blend`, blend=0.8 при mix=1.0.
- **Level-tracker = би-направленный leaky-IIR** `y=A[i]*acc+B[i]*x`, B=1A
(НЕ per-bin независимый трекер).
- **Live-таблицы** в `dsp/rt_mask_tables.{hpp,cpp}`: kIIR_A1/B1..A3/B3 (2049 doubles),
kWarp (8193), kBand768, kPRNGLut. `dsp/rt_weights.{hpp,cpp}` = acc коды весов.
- **Результаты**: t1kq err 0.43 dB (scale=600); comb per-tone err ≤6.4 dB.
- **METRIC CRITICAL**: рефы 24-bit НЕЛЬЗЯ читать 16-bit кодеком (даёт phantom 53 dB);
`render_parity.load` (sw handling) + окно 3.5s — канон. dual honest ref = 10.2 dB FLAT.
- **Broadband-hypothesis ОПРОВЕРГНУТА** (NOTES:2026-08-20s): редукция per-bin (tone-бины
режутся, пустые bin ~1.0);
- **Честные результаты (24-bit метрика, окно 3.5s, trimmed)**: dual (band fc=500,
q-sweep) err ≤0.72; t1kq fc-scan (only1 800..1200) err ≤0.59; al_* lv3-12 err ≤0.43;
полный корпус mean|err| 0.77, max 2.12 (t1k_b1f loud +2.1, al lv18/24 low-level 1.8).
- Эмпирика (G/W/A/rp/LUT-узлы) ЯВНО помечена в коде и NOTES; структурные лэкеры ниже.
### Открытые bit-exact пробелы (см. NOTES_LEVEL.md)
1. PRNG-пролог (LCG+LUT → fVar30), per-frame рандомизация scale/dry-wet.
2. FFT-conv (0x535a70) сглаживание маски перед FIR.
3. Бит-экзактный exp2 (0x26b820) вместо std::exp2.
4. combine/аккумулятор 0x5407c8 точная обратная связь.
5. **SR-mismatch**: внутренний DSP SR=48000/N=4096 (спейс 11.713 Гц) против
хоста 44100/2048; twin per-bin IIR статически невидим (FUN_180535880 tail-call).
### Открытые bit-exact/структурные пробелы (см. NOTES_LEVEL.md)
1. `combine/аккумулятор 0x5407c8` (аддитивные веса 0x5406c8/6e8) + `FFT-conv 0x535a70`
(сглаживание маски) — НЕ замкнуты в цепь; структурно могут закрыть t1k_b1f/al хвосты.
2. BandConfig `ctx+0x188` A/B/γ (параметрический LUT 0x563a60) — не live-захвачен;
писатели = JUCE param plumbing (статически исчерпаны).
3. PRNG-пролог (LCG+LUT → fVar30) — залочен (fVar30=1 при live state 112), dry/wet rnd импорт.
4. Бит-экзактный exp2 (0x26b820) вместо std::exp2; SR-mismatch 48000/4096 vs 44100/2048.
## Структура ключевых файлов
- `dsp/framed_model.{cpp,hpp}` — C++ порт mask-apply цепи (ГЛАВНЫЙ активный файл).