diff --git a/roadmap.md b/roadmap.md index 0e7b3ff..1ce0178 100644 --- a/roadmap.md +++ b/roadmap.md @@ -12,16 +12,22 @@ ## Текущий статус (2026-08-19) -- **Статический декомп DSP-ядра — закрыт (~90%)**: twin-резонатор, генератор case8, +- **Статический декомп DSP-ядра — закрыт (~95%)**: twin-резонатор, генератор case8, level-path (0x530d30/0x529fe0), LUT-кривая (FUN_180563440), IIR-трекеры (FUN_180563ce0), - FFT-conv (0x535a70) декодированы; `.dis` в `handoff/nls_dasm/`. Остаток — runtime-значения - (окно 0x540658, sens-источник, IIR update-loop). + FFT-conv (0x535a70), main render-loop (FUN_18052e260) декодированы; `.dis` в `handoff/nls_dasm/`. + Остаток — runtime-значения (коэффициенты IIR level-tracker 0x4c0528/0x3c0510/0x2c04f8, + скаляры 0x540870/874/87c/888/88c из RPP, цель P1.5 live-capture). - **Численная модель = frame-рендер `framed_render.py`** (STFT N=2048, hop=512, sqrt-Hann, twin-env tatt=11ms/trel=80ms): `C(f)=G·LUT(xv)+W·warp(f)^A`, `gain=(1−C)·res^(rp0·Q^drp)`. - **Честная тримнутая метрика** (длина выхода = длина входа): Q-dep rp → **mean=0.175 dB** (q0.1/q10 идеальны, боттлнек q1@2000=−0.71); joint free-knot LUT (B.15) → **dual mean≈0.027 dB**. -- **Цель bit-exact (Phase C) — в работе**: twin-транскрипция в `dsp/` готова, порт - res_power/Q-dep-rp/LUT — TODO. +- **Цель bit-exact (Phase C) — в работе**: twin-транскрипция в `dsp/` готова и проходит + float-parity (1.27e-5); **живые таблицы встроены** (P1.1, tables_check ALL OK); + **FFT-conv расшифрован** (P1.2: f_52d990 = memcpy, N=4096) и **интегрирован** (P1.3 fftconv.cpp); + **маска-канон подтверждена** (P1.4, FUN_180529fe0) и **level-tracker UPDATE реализован** (P2, + leveltrack.cpp). Остаток кода: twin-mask factory (FUN_18056e3e0), mask-accumulator 0x5407c8, + render-loop 52e260, бит-экзактная base-CRT FFT, стерео M8, multiband combine 5316e0, + + live-коэффициенты (P1.5). res_power/Q-dep-rp порт в C++ — ещё TODO. - **ВАЖНО про метрику**: ранние записи "mean=0.160/0.144" считались на выходе НЕтримнутой длины (`nfr*HOP+N`) и были артефактом; честный базлайн для scalar `rp=0.0169` = **0.280**. Все числа в этом файле — на ТРИМНУТОЙ метрике. @@ -58,7 +64,20 @@ gain = max(1 - C, eps) * res_k**rp # rp = rp0 * Q**drp (res_power) - **Фаза B (численная модель)** — пройдена до B.15: от B.10 (rmse 0.109 dB) до full frame-рендера Q-dep rp (0.175) и joint free-knot LUT (dual 0.027). Канон — `framed_render.py`. - **Фаза C (C++ bit-exact)** — in progress: `dsp/twin.*` готов и проходит float-parity (1.27e-5); - остальное построено, но res_power/Q-dep-rp/LUT/verify_bit_exact — TODO. + `dsp/{tables_data, fftconv, leveltrack}.cpp` + `dsp_ctx.hpp` готовы (P1-P2 структурно); + `verify_bit_exact.py` даёт базлайн (все DIFF — ожидаемо до подключения живой маски). + Оставшийся код по фазам: + + | Фаза | Компонент | Статус | + |---|---|---| + | P1.5 | live-коэффициенты level-tracker A[] + скаляры RPP | TODO (нужен live-capture / дизасм FUN_18052d650) | + | P2.5 | twin-mask factory FUN_18056e3e0 (полн.) + mask-accum 0x5407c8 | TODO (структурный фрагмент есть) | + | P3 | бит-экзактная base-CRT FFT (диспетчер 0x535a70) | TODO (главный риск) | + | P4 | render-loop 52e260 + res_power/Q-dep-rp порт + связка mask→FFT-conv | TODO (структура известна) | + | P5 | стерео M8 (link/balance/LR-vs-MS) + multiband combine 5316e0 + writer | TODO (в скоупе, не начат) | + + Оценка объёма оставшегося кода: ~60% (против ~40% готовых) — крупнейшие куски P3 (FFT bit-exact) + и P5 (стерео M8); структурно всё размаплено, остаток — точные вычисления и живые константы. ## Ключевые находки (итог)