From 60bf3a2394615fb7234525b7619d93770ccd9e6e Mon Sep 17 00:00:00 2001 From: Matiq Date: Tue, 18 Aug 2026 18:34:52 +0300 Subject: [PATCH] Phase5/step3 partial: FFT-conv loop mapped; freq-axis const offline; 0x540658 static-invisible --- handoff/NOTES_LEVEL.md | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/handoff/NOTES_LEVEL.md b/handoff/NOTES_LEVEL.md index ec8b642..8fdd474 100644 --- a/handoff/NOTES_LEVEL.md +++ b/handoff/NOTES_LEVEL.md @@ -160,6 +160,39 @@ Остаток 0.7 dB (Q=0.1) = LUT-колено 0.574 -> нужен FFT-уровень (0x535a70 + окно 0x540658 + freq-axis 0x540698), см. SESSION_HANDOFF §5-6. +## ============ UPDATE 2026-08-18c: FFT-CONV LOOP FULLY MAPPED (Phase 5 step 3 partial) ============ +Per-band FFT-conv loop disasm: /tmp/opencode/f_52b570.dis (0x52b550-0x52b8b5 == consumers :1195-1271). + +### What 0x535a70 / helpers ARE (they're dispatchers, real kernels in base-CRT): +- 0x535a70 = FFT fwd dispatcher -> 0x140a10 (scalar) / 0x140a70 (vector). NOT hand-transcribable, unnecessary. +- 0x540548/0x540550/0x540598 = FFT-PLAN table ptrs (plan 0x540530; +0x18/+0x20/+0x68), NOT windows. + Plan built by FUN_18052dc30(param_1+0x540530, [0x64]=FFT size, 0x540868). 0x540534 = plan+0x4 = N/2 usage. +- Per-band ops (dispatch variants collapsed): iVar20=N/2; r14=FIR(0x540668); + 1) 0x535a70(fftctx 0x540628, mask, N/2+1) forward FFT of mask + 2) 0x2210(0x540628, 0, r14, N/2+1) inv FFT into FIR + 3) fwd FFT (0x2180/0x1bb0) ; zero @[N] ; 0x52d920(r14+4, xmm13, N/2-1)=fill LOW half; + 0x52db50(r14+4+N/2, xmm9, N/2-1)=fill HIGH half; inv FFT (0x1a90/0x19d0) + 4) 0x140b30/0x140aa0(r14,r14,N/2+1) in-place complex op + 5) fwd FFT ; zero @[N] ; 0x52d990(r14, 0x540658+N/2, N/2) = FIR *= WINDOW 0x540658; + 0x52db50(r14+N/2, xmm9, N/2) = fill HIGH half; inv FFT + 6) FIR[0]=1.0f, FIR[1]=0; if 0x540890!=0: complex ops (0x1880/0x1ca0) + FIR *= 0x540888 over 2*N; + copy FIR->out (0x1df0/0x1f70). + +### Key unknowns (static analysis exhausted): +- **0x540658 window content**: ONLY 1 direct ref in whole dump (the read at 0x52b771). Not allocated in + consumers_out (:119-135 alloc 668/698/6a8/6b8/6c8/6d8/6e8/6f8/708/718/798), NOT set by 52dc30 (plan tables + only at +0x18/0x20/0x48/0x58/0x68). Written only indirectly -> needs runtime capture OR plan-internal + region. If 0x540658 is freq-shaped, it is the source of warp^3.14 (~π) & LUT-knee 0.574. +- xmm13/xmm9 fills = config constants from FUN_180529fe0 prologue (offline), unknown values. +- FFT size N = 2*0x540534; 0x1a0 = pow(2,floor(log2(SR/44100)))*412 (SR 44.1k -> 412); 0x540868=0x1a0*iVar9*8. + +### Conclusions: +- freq-axis NOT the boost source (offline const). FFT tables NOT windows. The whole freq-shaping funnels + through 0x540658 window in step 5 + the offline fill constants. To resolve: runtime capture of 0x540658 + (needs the plugin under a debugger) OR empirically back out its response from the model residual. +- Recommend: since bridge already at 0.236 and FFT window content is static-invisible, next high-value move = + full pipeline render (step 5) rather than more static FFT mining. + ## ============ UPDATE 2026-08-18b: FREQ-AXIS 0x540698 BUILDER (decomp :21735-21757) ============ - Allocation+fill of freq-axis 0x540698 lives in the SAME function as the 0x540668 FIR window alloc (decomp_funs.txt :21735-21757, the builder calls FUN_18052e190(param_1+0x540698, count=0x54086c)).