24mm10: EXP kernel full formula (table-reduced exp + double Cody-Waite sincos, no internal scale); fwd/inv normalizations pinned (s_i=s_f=1); rejected swap/nyq/window-family; q paradox formulated with 3 resolution paths

This commit is contained in:
2026-08-26 12:23:22 +03:00
parent 50d7ab0d05
commit c69257a551
+59
View File
@@ -4102,3 +4102,62 @@ scr@628 → pack(re=scr,im=0) 2049 пар
3. Детекторный каскад lvl_raw→scr (шаги 9–17) не тронут; нужны ACC@7c8 3. Детекторный каскад lvl_raw→scr (шаги 9–17) не тронут; нужны ACC@7c8
(+ WINfreq@658 для контроля окна) — обновить rendersnap2 SLOTS. (+ WINfreq@658 для контроля окна) — обновить rendersnap2 SLOTS.
## ============ 24mm10: ЯДРО EXP ДЕКОДИРОВАНО ПОЛНОСТЬЮ; МАСШТАБЫ ОПОВ ЗАФИКСИРОВАНЫ; ПАРАДОКС q ============
### EXP 1803831c0 — полная формула (скалярный путь = векторная математика)
Вход: пары (re,im) плоско; выход in-place. Это ТОЧНАЯ комплексная экспонента:
```
e^re: t = fma(re, C1, MAGIC), C1=184.665 (=128·log2e!), MAGIC=12582912
k = t−MAGIC (округление до целого); таблица T @0x1820fcd80,
запись 8 байт (hi/lo extended double), индекс (t&MASK)<<3
r_hi = re k·h, h=0.00541687 (=ln2/128, f32)
r = r_hi + k·1.65777e-06 ; Коди–Уэйт вторая компонента
p = r + 0.5·r²
e^re = T[k].lo + T[k].hi·p (+знаковые фиксы, guard 87.33654=maxarg2ln2)
e^(i·im): |im|→q=round(|im|·(1/π)) через тот же MAGIC; приведение в DOUBLE:
rπ = |im| q·π_hi − q·π_lo (двухкомпонентный π); фолд π/2;
минимакс sin/cos в double {2.60578e-06, 1.98096e-4, 3.166e-05,
0.01604}; знаки по квадранту (vmovmskps)
out = (e^re·cos(im'), e^re·sin(im')) — БЕЗ КАКОГО-ЛИБО МАСШТАБА ВНУТРИ.
```
Следствие: аргумент экспоненты в цепи = ровно то, что даёт fwd-RFFT.
### Нормировки опов (пин по дизасму воркеров)
- FWD(1a0c0): сборка X[Nyq]=A0B0 БЕЗ ×0.5 ⇒ ядро сырое (gain 1 = numpy.rfft);
план-масштаб guard `[obj+8]`: у нас [+8]=0 ⇒ ffe0 НЕ вызывается. ИТОГ s_f=1.
- INV(4ca80): голова X0/XN бабочка без 0.5, план-масштаб guard `[obj+0xc]`=1
⇒ ffe0 ×2^-12 по всему буферу ПОСЛЕ ядра. Ядро сырое (raw IDFT, gain N)
⇒ после ffe0: s_i = 1 (ровно numpy.irfft). ИТОГ s_i=1.
- Содержимое WINfreq@658 подтверждено по старым дампам (firbufs.npz):
периодический Hann(4096), w[1]=5.8827e-07, w[1024]=0.5, w[2047]=0.9999994.
### Отвергнуто (численно, на ультрачистых кадрах)
- Своп направлений (fwd,inv,fwd,inv): rms 82 дБ — исключено.
- «Найквост не экспоненцируется»: rms 60 дБ — исключено (EXP накрывает все
2049 флоатов включая слот Nyquist.re).
- Окно hann^p (p=0.5..4) при q=1: s_F∈[0.81..0.97], не достигает 0.76.
- Перестановка («unordered» layout) для кадров класса post-stage: сортировка
модулей не совпадает ни с одной стадией (relres 0.28..0.98) — кадры
полиморфны, forensics снапшотов исчерпана.
### ПАРАДОКС q (главный остаток)
Все масштабы зафиксированы ⇒ модель обязана быть точной при q=1, однако:
q=1 → rms 0.022 дБ; q=0.8 → 0.0065 дБ (медиана, 60 кадров).
Более того: наблюдаемый закон cur=trk^γ держится с rms~1e-4 на РАЗНЫХ
контентах, а наш сэндвич даёт контент-зависимый наклон s_F (0.82..1.34).
⇒ реальный тракт ведёт себя как ПОТОЧЕЧНАЯ степень (диагональный оператор
в частотном домене), наш rfft∘fold∘irfft — нет. Гипотеза: ops A–D суть
комплексные FFT размера 2048 (не real-4096!) либо содержат zreorder-слой,
и срединный линейный оператор L=rfft∘fold∘irfft в действительности близок
к диагональному в частотном базисе (например, при интерпретации буфера
как 2048 комплексных отсчётов fold-паттерн становится почти тривиальным).
### Пути закрытия (следующий раунд)
1. Статический декод ядер-близнецов (~3.1k строк AVX каждый) — определить
размер/тип преобразования и формат укладки окончательно.
2. Live: burst-захват rendersnap2 (обновлён, +ACC/WINfreq) с плотным
семплированием состояния FIR внутри рендера; сравнить стадии.
3. Windows/x64dbg-MCP (если доступен хост): брейкпоинт на 52b644..52b893,
дамп FIR после каждого из 6 шагов для одного кадра — закрывает всё.