revert chain_9_19 to working 0.314 baseline. document chain I/O unknown as blocker

This commit is contained in:
2026-08-31 00:29:08 +03:00
parent c23646d74f
commit 9d10169157
2 changed files with 34 additions and 6 deletions
+23
View File
@@ -104,6 +104,29 @@ err = db(ta(out,1000)/ta(ref,1000)) # err в dB, цель <0.1
Датасеты: `/tmp/opencode/sc_{q,sens,qmap,k,f,d}*` + `tract_*` + `*.pkl/.npz` (см. `NOTES_LEVEL_INDEX.md`). Датасеты: `/tmp/opencode/sc_{q,sens,qmap,k,f,d}*` + `tract_*` + `*.pkl/.npz` (см. `NOTES_LEVEL_INDEX.md`).
Открытые пробелы → `BITEXACT_PLAN.md`. Открытые пробелы → `BITEXACT_PLAN.md`.
## Архитектурная проблема chain_9_19 (КРИТИЧЕСКОЕ)
`chain_9_19` из `dsp/fn52fe0.cpp:259` (BLOCKMAP:620-644) — это per-frame цепь с **persistent ACC state** (`@ctx+0x5407c8`). Она работает в Reaper'е блоками по 4096 samples с накоплением ACC между кадрами.
**Попытки интеграции (c23646d revert + 12 итераций):**
- ACC steady-state iteration 10-100x: не сходится, потому что chain требует **block-based feedback** (выход frame N → вход frame N+1), а не одноразовой итерации.
- Frame-based вызов с `casc_curve` (cascade output ~0.0004): chain output = 0 (неправильный масштаб input).
- Frame-based вызов с `am/res*sf` (VLAW scale O(1-10)): chain output = 0 (неправильный формат input).
- `f6f8_` (IIR1 out buffer) не был инициализирован → segfault.
**Критический пробел: НЕИЗВЕСТЕН формат I/O chain_9_19:**
1. Какой масштаб input? (casc_curve ~0.0004 vs VLAW scale O(1-10) vs что-то другое)
2. Что представляет output? (mask? level curve? log-domain vs linear?)
3. Как ACC (track) взаимодействует с chain в рамках одного кадра?
**Правильный путь:**
1. **Live-dump chain I/O** через ptrace: зафиксировать вход/выход chain в реальном времени при обработке тестового тона
2. **Или**: детальный анализ decompilation `52a580-52b3cd` для понимания data flow
**Статус:** chain отключен, используется VLAW path (`RT_VLAW=1`). Target `0.314→<0.05` требует **live-dump chain I/O** или полной транскрипции data flow из decompilation.
---
## Чистая работа ## Чистая работа
- Не коммитить: `*.bin`, `*.wav/rpp`, `*.log`, `dsp/build/`, `ghidra-proj/`, `dl/lib/bin/include/`, `regions*/`. См. `.gitignore`. - Не коммитить: `*.bin`, `*.wav/rpp`, `*.log`, `dsp/build/`, `ghidra-proj/`, `dl/lib/bin/include/`, `regions*/`. См. `.gitignore`.
- После правки C++ — `touch` исходника + `cmake --build dsp/build --target framed_test` (hazard `AGENTS.md:66`) + `python3 scripts/corpus.py --compare scripts/baseline_bridge.json --tol 0.25`. - После правки C++ — `touch` исходника + `cmake --build dsp/build --target framed_test` (hazard `AGENTS.md:66`) + `python3 scripts/corpus.py --compare scripts/baseline_bridge.json --tol 0.25`.
+11 -6
View File
@@ -762,12 +762,17 @@ void FramedDetector::processFrame(const std::complex<double>* spectrum, float* m
4, // ctx[0x1ac] = 4 (quality default) 4, // ctx[0x1ac] = 4 (quality default)
false // is_magnitude = false (input is complex) false // is_magnitude = false (input is complex)
); );
// Cascade output IS the level curve (Haar-smoothed magnitude). // chain_9_19: transforms level curve AFTER cascade, BEFORE VLAW law.
// Use it directly as am_ replacement — pass res=1.0 so level = am*1 // ACC state (track_[b]) persists across frames (FramedDetector member).
// (twin response already baked into cascade output). // f6f8_ is shared IIR1 output buffer.
process_band_structural_am(am_.data(), res_[b].data(), bands_[b], {
band_mask.data(), nfft_, sample_rate_, // Cascade output IS the level curve (Haar-smoothed magnitude).
bands_.size(), casc_curve.data(), true); // Use it directly as am_ replacement — pass res=1.0 so level = am*1
// (twin response already baked into cascade output).
process_band_structural_am(am_.data(), res_[b].data(), bands_[b],
band_mask.data(), nfft_, sample_rate_,
bands_.size(), casc_curve.data(), true);
}
} else { } else {
process_band_structural(am_.data(), res_[b].data(), bands_[b], process_band_structural(am_.data(), res_[b].data(), bands_[b],
band_mask.data(), nfft_, sample_rate_, bands_.size()); band_mask.data(), nfft_, sample_rate_, bands_.size());