roadmap: detector decrypted in soothe_mem.bin, SNR 19.8dB; integrate twiddle loader

- fft.cpp: build_twiddle via soothe::twiddle_load (Cody-Waite sin/cos); drop dup init_plan
- fft_stage.cpp: cplx_mul/stage_complex/stage_double kernels -> phase fixed (corr +0.995)
- detect.cpp: level-dependent regional floor (no bell-boost), mask 10^(-1.041*depth*floor/20)
- burst500 metrics: ref -26.07 / ours -26.13 dBFS, corr 0.99475, SNR 19.80 dB, diff -0.065 dB
- KEY: FUN_180535880/536f90 bodies are decrypted real SSE in soothe_mem.bin; dispatch
  table 0x182616008[0]=idx=4 -> 0x180009860 -> FUN_180040d40; region 0x18004xxxx = full
  detector algorithm, absent from prior fun_map/decomp (Ghidra ran on encrypted file)
This commit is contained in:
2026-08-17 20:02:32 +03:00
parent 847725f5fc
commit b1b4f2bdf7
4 changed files with 77 additions and 52 deletions
+28
View File
@@ -240,3 +240,31 @@
2. **Bit-reverse permutation** — FUN_18003b6c0 с XOR-маской DAT_181c5e4e0
3. **C++ транскрипция** — переписать fft.cpp с точным порядком FP-операций из декомпиляции
4. **Верификация** — подать тон/синусоиду в тот же путь, что и Reaper-рендер
### B.4 — Метрики на burst500 (2026-08-17) — BIG JUMP
- **Интеграция**: `build_twiddle` в fft.cpp теперь через `soothe::twiddle_load` (sincos_single,
Cody-Waite, 7-term poly); удалён дубль `init_plan` (конфликт с fft_plan.cpp), добавлен `<vector>`.
- **Stage-ядра** (fft_stage.cpp переписан: cplx_mul / stage_complex / stage_double = scalar mul
FUN_180008500) — починили **фазу**: corr 0.479 → **+0.995**, SNR 5.2 → **+19.8 dB** (shift 0),
амплитуда diff ±0.06 dB (ref 26.07, ours 26.13 dBFS).
- **Детектор (смена модели)**: убрана bell-boost (была НЕВЕРНА); маска soothe = **чисто
уровнезависимый floor**. Тон 258 Гц (громче) режется сильнее (−6.2 дБ), 500 Гц (3.5 дБ),
выше 1 кГц ≈ 0 — региональный уровень (RMS по окну 16 бинов, калибровка −26.1 дБFS),
`mask = 10^(1.041·depth·floor(level)/20)`.
- Итог: ref 26.07 / ours 26.13 dBFS, corr 0.99475, SNR 19.80 dB, diff 0.065 dB.
### B.5 — Детектор ДЕШИФРОВАН в soothe_mem.bin (2026-08-17) — KEY
- **Тело FUN_180535880/180536f90 в дампе = реальный дешифрованный SSE-код** (movsd/cvtpd2ps,
загрузка параметров из param_3, цикл по буферу), а НЕ PACE-стаб.
- Вызов **dispatch-shim 0x180001d00**: `mov [0x1826159a0],%rax; jmp *0x182616008[rax*8]`;
сейчас idx=4 → `0x180009860` (тонкая обёртка `e8 rel32`) → реальная **FUN_180040d40**.
- **Dispatch-таблица 0x182616008**: 223 разрешённых записи; реальные цели в `.text`
`0x18000a160..0x180074740` (13+5+8+6 функций по страницам), высокие `0x1817b900/181a69090/...`
= направляющие, не алгоритм.
- **КРИТИЧНО**: этих функций НЕТ в fun_map.txt/decomp_funs.txt (прежний Ghidra-анализ
был на зашифрованном `.vst3` и не развязал dispatch). .vst3 на диске (PE32+ 39.1M,
12 секций, base 0x180000000) СОВПАДАЕТ с дампом по байтам в `.text` (проверено
для 0x40d40/0x535880) фи(x) → декомпиляция дампа = декомпиляция реального кода.
- План: разметить таблицу → извлечь байты функций 0x18004xxxx (+0x18000a160..0x180074740)
→ objdump 0x180000000-adjust → транскрипция в dsp/detect.cpp → верификация SNR 19.8 дБ.
- Непустые ранее известные ядра (0x180040cc0..0x180041700) = 8 функций = полный алгоритм детектора.