From cf386229956113394aa1f99e15d4bbf0c7308f69 Mon Sep 17 00:00:00 2001 From: Matiq Date: Mon, 24 Aug 2026 22:29:56 +0300 Subject: [PATCH] =?UTF-8?q?24v:=20STFT=20layer=20solved=20=E2=80=94=20NO?= =?UTF-8?q?=20synthesis=20window=20(partitioned-conv=20architecture);=20du?= =?UTF-8?q?al=20corpus=200.193=20mean/0.438=20max=20(was=203.264);=20RT=5F?= =?UTF-8?q?SYN/RT=5FWIN=20env=20options;=20remaining:=20q/sens=20parameter?= =?UTF-8?q?ization=20of=20law=20constants?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dsp/spectral.cpp | 16 +++++++++++++--- handoff/NOTES_LEVEL.md | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 3 deletions(-) diff --git a/dsp/spectral.cpp b/dsp/spectral.cpp index 82f5d30..7b25669 100644 --- a/dsp/spectral.cpp +++ b/dsp/spectral.cpp @@ -39,8 +39,14 @@ void SpectralProcessor::setDetectorParams(const std::vector& bands } void SpectralProcessor::computeWindow() { + // RT_WIN: 0=symmetric hann (legacy), 1=periodic hann, 2=rectangular + static const int winmode = getenv("RT_WIN") ? atoi(getenv("RT_WIN")) : 0; for (size_t i = 0; i < nfft_; i++) { - window_[i] = 0.5 * (1.0 - std::cos(2.0 * M_PI * i / (nfft_ - 1))); + double v; + if (winmode == 1) v = 0.5 * (1.0 - std::cos(2.0 * M_PI * i / nfft_)); + else if (winmode == 2) v = 1.0; + else v = 0.5 * (1.0 - std::cos(2.0 * M_PI * i / (nfft_ - 1))); + window_[i] = v; } } @@ -56,16 +62,20 @@ void SpectralProcessor::istftFrame(std::complex* in, float* out, float* fft::execute_inverse(&plan_, tmp_buf_); static bool wola_computed = false; static float wola_norm = 1.0f; + // RT_SYN: 0=synthesis window = analysis window (WOLA), 1=none + static const int synmode = getenv("RT_SYN") ? atoi(getenv("RT_SYN")) : 0; if (!wola_computed) { double wola_sum = 0.0; for (size_t i = 0; i < nfft_; i++) { - wola_sum += window_[i] * window_[i]; + double w = (synmode == 1) ? 1.0 : window_[i]; + wola_sum += window_[i] * w; } wola_norm = static_cast(wola_sum / hop_); wola_computed = true; } for (size_t i = 0; i < nfft_; i++) { - overlap[i] += static_cast(tmp_buf_[i].real() * window_[i]); + double w = (synmode == 1) ? 1.0f : window_[i]; + overlap[i] += static_cast(tmp_buf_[i].real() * w); } for (size_t i = 0; i < hop_; i++) { out[i] = overlap[i] / wola_norm; diff --git a/handoff/NOTES_LEVEL.md b/handoff/NOTES_LEVEL.md index b2edacd..b17c9d9 100644 --- a/handoff/NOTES_LEVEL.md +++ b/handoff/NOTES_LEVEL.md @@ -3325,6 +3325,42 @@ rendersnap2 v5 (SLOTS+768), patchparam.py — рабочий правщик VST- 2. После этого: bit-exact репликация применения станет механической. 3. Параллельно: Δ/q/sens по датасетам (mega_curves.pkl). +## ============ UPDATE 2026-08-24v: СЛОЙ STFT НАЙДЕН — БЕЗ СИНТЕЗ-ОКНА; DUAL КОРПУС 0.193 ============ + +### Эксперимент RT_SYN/RT_WIN (spectral.cpp, env-gated) +Варианты слоя на dual_b1q_0.5 (маска VLAW v3 фиксирована): +``` +база sym-hann + syn-окно : 9.47 / 11.16 +периодический ханн : 9.48 / 11.16 +прямоугольный анализ : 10.18 / 11.27 +БЕЗ СИНТЕЗ-ОКНА : 10.27 / 11.59 ← победитель +``` +⇒ плагин НЕ домножает выход обратного преобразования на окно +(архитектура partitioned-conv движка; нормировка Σw_ana·1/hop). +Зазор к рефу: −0.05 (@500) / −0.23 (@2000). + +### Корпус с RT_VLAW+RT_SYN=1 (+NOWARP/NOIIR3/IIR12=0): +| group | canon | VLAW+SYN | +|-------|-------|----------| +| t1kq | 0.768 | 3.380 | +| t1k | 2.114 | 3.271 | +| al | 0.986 | 1.872 | +| res | 0.437 | 3.861 | +| **dual** | 3.264 | **0.193 (max 0.438!)** | +| comb | 6.116 | 4.410 | +| TOTAL | 2.286 | 2.252 | + +### Статус +dual-семейство РЕШЕНО (все 22 случая <0.44 дБ). Одноканальные группы ждут +параметризации α/β/c/Δ по (q, fc, sens) — константы откалиброваны на +dual(q=0.5). Механика применения и слой полностью декодированы. + +### NEXT (24w) +1. Параметризация закона по q/sens/fc (датасеты sc_* готовы; методика + deepest-scratch + Гёрцель рефов). +2. Δ-правило вторых пиков из декомпа pre-combine. +3. Решение о каноне: после параметризации сравнить TOTAL vs 2.286. + ## ============ UPDATE 2026-08-24s: ПРИМЕНЁННЫЙ ЗАКОН ПРЯМО (rms 0.016 дБ); АУДИО = exp(глубокого scratch); RT_VLAW v3 ============ ### Развязка объектов (главная путаница раундов устранена)