23b: mask->FIR chain decoded — DESIGN body is vectorized LOG2 of band curve (poly fingerprinted), WIN_freq identified as periodic Hann(4096) falling half applied to FIR[n/2..n), full ILT stub->impl table resolved offline (ilt_resolve.py), live buffer catalog extended (SIMD lane masks at 0x540598, complex identity reset between callbacks, overlap buffer at 0x5406f8 non-zero), plugin output proven nondeterministic across renders (LCG dither) — spectral metrics only; ptrace lab scripts + lessons (TRACECLONE before CONT, sub-second host lifecycle under -renderproject)
This commit is contained in:
@@ -153,3 +153,77 @@ for i in 1..n-1:
|
||||
Незакоммичено: f529fe0_full.dis, BLOCKMAP_529fe0.md, thunk-резолвер,
|
||||
правки NOTES_LEVEL (22v будет добавлена при транскрипции). Следующий шаг —
|
||||
транскрипция process_frame_faithful по этой карте.
|
||||
|
||||
## ДОПОЛНЕНИЕ 23b: резолв ILT + декод FIR-цикла (52b550–52b8bb)
|
||||
|
||||
### Резолвер
|
||||
`scripts/ilt_resolve.py`: стаб = `mov eax,[rip+idx]; lea r10,[rip+tbl]; jmp [r10+rax*8]`;
|
||||
live idx=4 у всех; таблицы @0x1826xxxx. Полная таблица «стаб→impl»:
|
||||
| стаб | impl | роль (уточн.) |
|
||||
|---|---|---|
|
||||
| 0x180002210 | 0x136e0 | copy scratch→FIR? (валидатор → 39de0/3a040/3a220) |
|
||||
| 0x180002180 | 0x125e0 | complex-op A/C float (воркер 3a4a0; r9 НЕ передаётся ⇒ длина из объекта) |
|
||||
| 0x180001bb0 | 0x6a40 | complex-op A/C double |
|
||||
| 0x180001a90 | 0x5560 | complex-op B/D float — ЧИСТЫЙ FMA (fma=28, mul/add=0!) |
|
||||
| 0x1800019d0 | 0x4340 | complex-op B/D double |
|
||||
| 0x180001880 | 0x2c60 | paired-scalar op 1 (флаг-ветка) |
|
||||
| 0x180001ca0 | 0x9380 | paired-scalar op 2 |
|
||||
| 0x180001df0 | 0xb3c0 | final op float |
|
||||
| 0x180001f70 | 0xe360 | final op double |
|
||||
| 0x180140a10 | 0x141400→[1826181d8]=**0x1802a24c0** | дизайн float |
|
||||
| 0x180140a70 | 0x141580→[1826183c8]=**0x1802fa420** | дизайн double |
|
||||
| 2030/1d30 | ffe0 / 9be0 | scalar-transform |
|
||||
| 2270/22a0 | 14c40 / 15060 | scalar-transform-2 |
|
||||
| 2000/1c40 | fb60 / 8700 | axpy-класс |
|
||||
| остальное | dc40,8d60,5a20,4720,4200,3f40,5160,25e0,ee20,3c40 | как в BLOCKMAP ✓ |
|
||||
|
||||
### Дизайн-тело 0x1802a24c0 (float, вход=rcx bands[i], выход=rdx scratch@0x540628)
|
||||
Функция входа 0..0x675 (~1.6КБ), далее сиблинги. Алгоритм = **ВЕКТОРНЫЙ LOG2**
|
||||
(range reduction бит-трюком с 0.6666667, полином Хорнера на YMM-константах
|
||||
−0.5, 0.3333656, −0.2500466, 0.198225, −0.1646246, 0.1696488, −0.1517721,
|
||||
реконструкция ×ln2=0.6931472; константы @FN+0x1cdfac0..d20). Маскированный
|
||||
хвост через vmaskmovps/popcnt-таблицы (@0x181F8xxxx). ИТОГ: **scratch = log(bands[i])**.
|
||||
Диспетчер 535a70 делает swap аргументов (rcx↔rdx) перед прыжком!
|
||||
|
||||
### Структура FIR-цикла (полностью залочена)
|
||||
На полосу: 2×scalar-transform(bands[i], xmm8·[540888] при флаге 540890==0, иначе
|
||||
xmm8; затем xmm12−xmm8) [ср. decomp 184-185: A=[0x540874]−expf(K), wet=[0x540888]]
|
||||
→ DESIGN=log(bands[i])→scratch → copy(scratch→FIR@0x540668) [2210]
|
||||
→ opA(FIR,buf548,buf598) [2180/1bb0] → FIR[n]=0 (n=0x540534=4096!)
|
||||
→ 52d920(&FIR[1], xmm13, n/2−1) деление; 52db50(&FIR[2049], xmm9, n/2−1)
|
||||
→ opB [1a90/19d0] → bigkernel in-place 140b30/140aa0 (n/2+1)
|
||||
→ opC [2180/1bb0] → FIR[n]=0 → 52d990(FIR, WIN_freq+n/2, n/2) УМНОЖЕНИЕ на
|
||||
**падающую половину Hann** (WIN_freq=wperiodicHann4096: w[1024]=0.5,w[2048]=1.0!)
|
||||
→ 52db50(&FIR[2048], xmm9, n/2) → opD [1a90/19d0] → FIR[0]=1.0, FIR[1]=0
|
||||
→ флаг-ветка: парно-скалярные 1880/ca0 → dry/wet scale ×[0x540888] над **2n флоатов**
|
||||
→ final(df0/f70) с сохранённым track_i ([rsp+0x138][i]).
|
||||
|
||||
### Живые буферы (firtrace.py по s1/s2 + свежие захваты dual_b1q_0.5)
|
||||
- 0x540658 WIN_freq = периодический Hann(4096), пик 1.0 @bin2048 (НЕ рамп 0.5→0.8!)
|
||||
- 0x540758 freqaxis = линейный, шаг ≈11.713 Гц (≈48000/4096=11.71875, лёгкое
|
||||
занижение — похоже на накопительную ошибку f32 при построении суммой)
|
||||
- 0x540598 = SIMD-маски: 8×1.0 / 8×0.0 периодом 16 флоатов, ровно 1024 шт
|
||||
(YMM lane-select для комплексных кернелов)
|
||||
- 0x540550 NULL (float-путь активен, флаг 0x5408b8=0); 0x540628 scratch нулевой
|
||||
между колбеками; 0x540668 FIR = комплексная единица (1,0)×2049 бинов МЕЖДУ
|
||||
колбеками — кернел потребляется и сбрасывается внутри колбека
|
||||
- 0x5406f8 хранит аудио-масштабный сигнал (~±0.1) между колбеками — overlap/STFT
|
||||
буфер conv-движка (не «нулевой acc»!)
|
||||
- 0x540788 vs 0x5407f8 различаются (max 1.108; @171: 1.751 vs 1.409) — две РАЗНЫЕ
|
||||
кривые; ни одна не достигает нужных 3.89×@171 (11.82 дБ) ⇒ применённый фильтр
|
||||
≠ поточечная копия любой из живых кривых (подтверждение разрыва 22y)
|
||||
|
||||
### Динамика (попытки перехвата; окружение)
|
||||
- realtime-playback НЕ тикает DSP (нет аудио-девайса; треды спят в futex);
|
||||
кривые 22y = результат инициализации при загрузке проекта
|
||||
- `-renderproject`: полный цикл init+render+exit хоста занимает ~0.8 c
|
||||
(host@1.2s, workers@1.4s, wav@1.6s, exit@2.0s); обработка идёт в окне ~0.5 c
|
||||
- INT3-ptrace: SEIZE+TRACECLONE обязательны до CONT (иначе untraced thread
|
||||
ловит SIGTRAP и убивает процесс — подтверждено); DR-брейкпоинты: DR0@user+0x380,
|
||||
но POKEUSER DR7 даёт EIO. Скрипты: fntrace*.py, fnhw.py, fnall.py, firstop.py,
|
||||
firtrace.py, hotips.py (см. scripts/)
|
||||
- Вывод: FUN_180529fe0 и 52d650/536300/52e260 НЕ ловятся в рендер-окне —
|
||||
маск-цепь выполняется при ЗАГРУЗКЕ/изменении параметров, стационарный рендер
|
||||
использует закэшированный кернел; либо трассировать надо момент инициализации
|
||||
- Выход плагина НЕдетерминирован: md5 двух свободных рендеров различен при
|
||||
одинаковом rms (PRNG-дизеринг из LCG-прологов) — метрика только спектральная!
|
||||
|
||||
Reference in New Issue
Block a user