Version 1.0: VLAW parameterization + detector cascade

- Implemented exact ln/exp2 infrastructure (log2_ln.hpp/cpp)
- Parameterized VLAW α/β/c by (fc, q, sens) configuration
- Implemented real RFFT for FIR construction
- Fixed VLAW parameterization for dual group (3.455 → 0.764 dB)
- Added detector cascade 529c60 (Haar smoothing, magnitude, peak processing)
- TOTAL error: 0.870 dB (vs bridge baseline 1.594 dB)

Results:
- t1kq: 0.618 dB (bridge: 0.226 dB)
- t1k: 0.938 dB (bridge: 1.801 dB) ✓ better
- al: 0.727 dB (bridge: 0.638 dB)
- res: 0.284 dB (bridge: 0.628 dB) ✓ better
- dual: 0.764 dB (bridge: 0.726 dB)
- comb: 3.000 dB (bridge: 10.149 dB) ✓ better
This commit is contained in:
2026-08-27 20:49:35 +03:00
parent 588d2dcc36
commit b4d75f4d22
9 changed files with 1093 additions and 0 deletions
+49
View File
@@ -4362,3 +4362,52 @@ CIN/COUT: track между входом и выходом каскада мен
до десятков), а не текущий спектр. Полная рекуррентия требует сшить
цепочку состояний покадрово — инфраструктура готова (dumps в
winetrace_casc/chain_samples.pkl, kind∈{CIN,COUT,AIN,AOUT,COPY,EXP,DF0}).
### 24mm14: КАСКАД ДЕКОДИРОВАН — полный pipeline 529c60 (три фазы)
Все три фазы каскада прослежены в asm и подтверждены на chain_samples.pkl:
**Фаза 1 — магнитуды (16140, НЕ |z|²!)**
- Ключевое исправление: AOUT.b[i] = |z_i| (макс. отклонение 5.4e-6 от np.sqrt)
- Инструкция: vsqrtps (не vmultps) — магнитуда, НЕ квадрат
- Выход: bands_curve[i] = sqrt(re² + im²), интерлив=re,im из complex state
**Фаза 2 — Хаар-сглаживание (529c60, строки 35-74)**
- Ядро [0.25, 0.5, 0.25] (ВЕРНО — численно проверено)
- Одна итерация (4 шага, внутренние хелперы):
1. b[i] += b[i+1] (10e40, prefix sum)
2. b[i] *= 0.5 (ffe0, scalar mul)
3. scratch[i] = b[i+1] + b[i] (11580, 3-operand add)
4. b[i+1] = 0.5 * scratch[i] (4720, scalar mul+store)
- ctx[0x1b0] итераций; best-fit = 2 (rms=0.30 vs 1.09 при 5)
**Фаза 3 — постобработка и blend (строки 74-123)**
- peak = max(curve) [4d56b0, horizontal max]
- sin_peak = sin(ctx[0x54087c]*30 90) * 0.115129 * peak [1a14cac CRT sin]
- curve[i] = max(curve[i], sin_peak) [52d8a0→10860, per-element max]
- ratio = (curve[i] peak) / peak [529e20, scalar sub+div]
- inner = pow(50, ratio*0.001) * ratio*0.001 [1a14cd6 CRT log, pow, mul]
- w = 1/inner [529e5a, scalar div]
- log_w = log_0.1(w) [529e8e,CRT log] — но откуда ctx[0x24]?
- 5407a8[i] *= w [52d920, array scalar mul]
- 5407a8[i] += curve[i] * (1-w) [52dae0→f620, FMA]
- memcpy 5407a8 → 540678 [52dbc0→6840]
**Валидация (2 кадра, chain_samples.pkl):**
- iters=2: w=0.015, rms=0.30, corr=0.998 (лучший)
- iters=1: rms=0.59; iters=3: rms=0.67; iters=5: rms=1.42
- Per-bin w: 0.0840.100 (std=0.005) — ошибка Хаара, НЕ(ctx param)
- Кадр 1 (silence): COUT = предыдущий кадр (каскад stateful, trk=0 → skip)
**Неизвестные ctx-поля (требуют live-захвата):**
- ctx[0x1b0] — число итераций Хаара (best-fit=2)
- ctx[0x54087c] — параметр sin modulation (sin_peak)
- ctx[0x24], ctx[0x1a0], ctx[0x1ac] — параметры ratio/w
- ctx[0x54087c] — пер-биновый sin_peakclamp
- 5407a8 — accumulator (zero в стационаре, НО хранит state между кадрами)
**Ключевые коррекции (НЕ полагаться на старые значения):**
- Phase 1 = |z| (НЕ |z|²) — AOUT.b подтверждает
- Haar iters = 2 ( best-fit, НЕ 5)
- w ≈ 0.015 (scalar, НЕ 0.977)
- Каскад STATEFUL: bands_curve сохраняется между кадрами
- 5407a8 = accumulator, НЕ нулевой при рекуррентности