- handoff/NOTES_LEVEL.md 4413→397 (голова 24mm5+), хвост → handoff/archive/NOTES_LEVEL_2026-08-18_2026-08-23.md - handoff/NOTES_LEVEL_INDEX.md NEW навигатор, handoff/archive/ whitelist .gitignore - SESSION_HANDOFF/summary → archive + редиректы, NOTES_TWIN/NOTES_CAPTURE сжаты - README.md:13 единственный источник TOTAL 1.594/dual 0.193, AGENTS runbook, BITEXACT_PLAN 9→3 шага (каскад 9-19/k-маппинг/Δ)
65 lines
4.1 KiB
Markdown
65 lines
4.1 KiB
Markdown
# Roadmap: bit-exact реверс DSP-ядра oeksound soothe2 (v1.1.2)
|
||
|
||
## Цель
|
||
Воспроизвести DSP-путь soothe2 в виде **собираемого standalone C++** с **побайтово идентичным** выходом (bit-exact).
|
||
|
||
## Результат
|
||
`re-tools/dsp/` — `*.cpp/*.h` (классы DSP), `CMakeLists.txt`, `harness.cpp` (WAV16 → рендер → WAV24), `dsp_notes.md` (карта функция↔смысл), `verify_bit_exact.py`.
|
||
|
||
## Статус — см. `README.md:13` (единственный источник TOTAL)
|
||
|
||
> **Итог 2026-08-28 (24mm14):** применение декодировано до формул `mask=10^(−cut_D/20)`, `cut_D=α·ln1p(lvl/β)+c` (rms ≤0.016, 3 семейства), слой STFT без синтез-окна, dual-корпус 0.193 dB (канон 3.264). Гейт = bit-exact. Остаток: 3 шага `BITEXACT_PLAN.md:1` (каскад 9–19, k-маппинг, Δ-правило). Архив B-фаз ниже свёрнут.
|
||
|
||
<details><summary>История B-фаз (B.1…P4.3) — свёрнуто, детали → handoff/archive/ + git log</summary>
|
||
|
||
- **Статический декомп ~95%**: twin, generator case8, level-path (0x529fe0/0x563440/0x563a60), mask-apply, IIR-трекеры, FFT-conv (0x535a70), render-loop FUN_18052e260 — `.dis` в `handoff/nls_dasm/`.
|
||
- **Структурная цепь** `dsp/framed_model.cpp::process_band_structural` (48k/4096): `scale→LUT(level)→IIR1→IIR2→mirror→blend/exp2→combine→dual-warp→IIR3×2→dry/wet`; live-таблицы `rt_mask_tables`. Корпус: comb 6.12 (bridge 10.15), res 0.44.
|
||
- **Численная модель B.10…B.15**: `C=g·LUT(xv)+w·warp^a`, `gain=(1−C)·res^rp`, rp=0.0275·Q^0.2159 (mean 0.175), Pchip LUT (dual 0.027). Канон — `framed_render.py` (исторический).
|
||
- **Фазы P1–P5**: twin float-parity 1.27e-5, FFT-conv, leveltrack, LUT, mask-apply — в основном готово; осталось каскад 9–19 + twin/am + Δ.
|
||
|
||
### Ключевые находки (итог, свёрнуто)
|
||
|
||
- Маска аддитивная `C=g·LUT+w·warp^a` (не мультипликация).
|
||
- `res_power` `gain=(1−C)·res^rp` — закрывает 500Hz residual.
|
||
- `0x530d30` дважды NEGATIVE — тилт не оттуда.
|
||
- LUT — гамма-монотонная `FUN_180563440` (Pchip немонотонна).
|
||
- Константы: SCALE=1/1024, DB_CONV=8.6859, IIR α=0.1, LCG 0x3cdca.
|
||
|
||
</details>
|
||
|
||
## Контракт из manual (`soothe2_ManualFAQ.pdf`)
|
||
|
||
| # | Факт | Следствие |
|
||
|---|---|---|
|
||
| M1 | Soft/Hard меняет всё | mode = препроцессор детектора |
|
||
| M2 | Depth ±18, до 60 dB | depthcurve-LUT, clip 60 dB |
|
||
| M5 | Attack/Release частотно-зависимы | Env — частотный масштаб |
|
||
| M8 | Stereo link/balance/L-R vs M/S | детектор на sum |
|
||
| M10 | Банды: 2 cut + 4 general | `FilterGraph<float,6,0x400>` |
|
||
|
||
## Топология пайплайна (Приложение A, стр.30)
|
||
|
||
```
|
||
main/sidechain → input trim → analysis (depth/sharpness/selectivity; EQ per-band)
|
||
→ stereo apply + balance → ms encode? → processing (M/S) → mix → bypass → output
|
||
```
|
||
|
||
## Журнал вех (свёрнуто)
|
||
|
||
| Веха | Дата | Суть |
|
||
|---|---|---|
|
||
| B.1–B.6 | 08-17 | C++ каркас, twin, dispatch, band-структура |
|
||
| B.10–B.15 | 08-18…19 | Модели C/LUT, bridge `C=g·LUT+w·warp^a` (0.236), res_power, dB-parity 0.268 |
|
||
| P4.1–P4.3 | 08-20 | Декомп FUN_180529fe0, live-таблицы, dual-warp |
|
||
|
||
Полный журнал — `handoff/NOTES_LEVEL_INDEX.md` + `git log`.
|
||
|
||
## Где лежат детали
|
||
|
||
- `README.md:13` — актуальный статус (TOTAL).
|
||
- `handoff/NOTES_LEVEL.md` (живая голова) + `handoff/archive/NOTES_LEVEL_2026-08-18_2026-08-23.md` — журнал.
|
||
- `handoff/BLOCKMAP_529fe0.md` — карта метода 9–19.
|
||
- `handoff/NOTES_TWIN.md` — twin краткая справка.
|
||
- `handoff/NOTES_CAPTURE.md` — registry heartbeat.
|
||
- `notes_giant_fft.md` — FFT/twiddle.
|