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-прологов) — метрика только спектральная!
|
||||
|
||||
@@ -2224,3 +2224,50 @@ dual НЕ в пост-обработке кривой R.
|
||||
0x1802a24c0 (3КБ AVX2) и complex-op шагов с буферами 0x540548/550/598 — следующий
|
||||
статический шаг; альтернатива — трассировка промежуточных буферов живьём
|
||||
(снапшоты в момент аудио-колбека, не между кадрами).
|
||||
|
||||
## ============ UPDATE 2026-08-23g (23b): ДИЗАЙН=LOG(band), Hann-окно, PRNG-дизеринг ============
|
||||
|
||||
### Что доказано декодом (детали в BLOCKMAP 23b)
|
||||
1. Полная цепь построения FIR на полосу залочена по raw asm (52b550–52b8bb):
|
||||
scalar-shape ×2 → **DESIGN: scratch=log(bands[i])** (векторный log2, полином
|
||||
идентифицирован по константам, тело 0x1802a24c0) → copy→FIR@0x540668 →
|
||||
4 комплекс-op (A..D) на буферах 0x540548(SIMD/twiddle-workspace)/0x540598
|
||||
(YMM-маски 8×1/8×0×64) вокруг нормировки &FIR[1]÷K и bigkernel →
|
||||
**FIR[2048..4095] ×= Hann_freq[2048..4095]** (падающая половина периодического
|
||||
Hann(4096), пик ровно на стыке!) → FIR[0]=1,FIR[1]=0 → dry/wet над 2n флоатами.
|
||||
Структура log→ops→exp-класс + окно = классический frequency-sampling /
|
||||
минимально-фазовый дизайн кернела. Гипотеза механизма скайрта: геометрия
|
||||
задаётся ОКНОМ и комплекс-ops на log-спектре, а не постобработкой R.
|
||||
2. WIN_freq опознан численно (w[1024]=0.5,w[2048]=1.0) — прежняя трактовка
|
||||
«0.5→0.8» относилась к другому слоту (0x540698).
|
||||
3. freqaxis: шаг 11.71303 vs точные 11.71875 — накопительная f32-ошибка построения;
|
||||
сетка внутренняя 48k/4096 подтверждена независимо.
|
||||
4. Выход плагина недетерминирован от рендера к рендеру (md5 разные, rms равные) —
|
||||
LCG-прологи реально дизерят; честная метрика только спектральная.
|
||||
|
||||
### Динамика: почему живые кривые «статичны»
|
||||
Realtime-playback без аудио-девайса НЕ вызывает processing (все треды спят);
|
||||
кривые 22y — продукт инициализации проекта. `-renderproject` прожимает весь
|
||||
цикл за ~0.8 c (init+render+exit); перехват требует SEIZE+TRACECLONE ДО первого
|
||||
CONT главного треда. FUN_180529fe0/52d650/536300/52e260 не ловятся в рендер-окне
|
||||
⇒ маск-цепь выполняется при загрузке/param-change, рендер использует кэш.
|
||||
Следующий динамический шаг (если понадобится): bp на входе process-callback vtbl
|
||||
или трасса окна init (поймать DESIGN в момент param-change).
|
||||
|
||||
### Инструментарий этого раунда (закommичено)
|
||||
scripts/ilt_resolve.py (резолв стабов офлайн), scripts/firtrace.py (полный каталог
|
||||
буферов + GUI-флаг 0x2404bc), scripts/firstop.py (SIGSTOP-семплирование),
|
||||
fntrace*.py/fnhw.py/fnall.py (ptrace-лаборатория: INT3/DR, уроки — см. BLOCKMAP),
|
||||
hotips.py. .dis тела: conv_float_a24c0, conv_double_fa420, imp_*, th_* (19 impl).
|
||||
|
||||
### Контрольные числа dual (цель раунда, неизменны)
|
||||
cut@500=10.32 дБ const ∀q; @2000=11.82 @q=0.5; Δcut≈2.25·(−ln res).
|
||||
Модель сейчас: −0.18/@500-ок + провал скайрта.
|
||||
|
||||
### NEXT (пересмотр после декода)
|
||||
1. numpy-реплика цепи log→opsA-D→window с КАЛИБРОВКОЙ ops по измеренным H(f)
|
||||
(корпус референсов уже есть); критерий — воспроизведение Δcut(res) геометрии.
|
||||
2. Если ops A-D ≈ exp-раундтрип со сглаживанием: транскрипция за RT_FIRCONV,
|
||||
гейт corpus --vs-bridge + контрольные числа dual.
|
||||
3. ptrace-эскалация ТОЛЬКО если численная репликация не сойдётся: цель —
|
||||
брейкпоинт в момент param-change (init-окно хоста), а не рендер.
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,15 @@
|
||||
; imp_141400: VA 0x180141400-0x180141420 (32 bytes)
|
||||
|
||||
/tmp/opencode/dis/imp_141400.bin: file format binary
|
||||
|
||||
|
||||
Disassembly of section .data:
|
||||
|
||||
0000000000000000 <.data>:
|
||||
0: 48 8b 05 d1 6d 4d 02 mov 0x24d6dd1(%rip),%rax # 0x24d6dd8
|
||||
7: ff e0 jmp *%rax
|
||||
9: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1)
|
||||
10: 00
|
||||
11: 0f 1f 80 00 00 00 00 nopl 0x0(%rax)
|
||||
18: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1)
|
||||
1f: 00
|
||||
@@ -0,0 +1,15 @@
|
||||
; imp_141580: VA 0x180141580-0x1801415a0 (32 bytes)
|
||||
|
||||
/tmp/opencode/dis/imp_141580.bin: file format binary
|
||||
|
||||
|
||||
Disassembly of section .data:
|
||||
|
||||
0000000000000000 <.data>:
|
||||
0: 48 8b 05 41 6e 4d 02 mov 0x24d6e41(%rip),%rax # 0x24d6e48
|
||||
7: ff e0 jmp *%rax
|
||||
9: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1)
|
||||
10: 00
|
||||
11: 0f 1f 80 00 00 00 00 nopl 0x0(%rax)
|
||||
18: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1)
|
||||
1f: 00
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user