24v: STFT layer solved — NO synthesis window (partitioned-conv architecture); dual corpus 0.193 mean/0.438 max (was 3.264); RT_SYN/RT_WIN env options; remaining: q/sens parameterization of law constants

This commit is contained in:
2026-08-24 22:29:56 +03:00
parent edf6f35cdf
commit cf38622995
2 changed files with 49 additions and 3 deletions
+13 -3
View File
@@ -39,8 +39,14 @@ void SpectralProcessor::setDetectorParams(const std::vector<DetectorBand>& 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<double>* 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<float>(wola_sum / hop_);
wola_computed = true;
}
for (size_t i = 0; i < nfft_; i++) {
overlap[i] += static_cast<float>(tmp_buf_[i].real() * window_[i]);
double w = (synmode == 1) ? 1.0f : window_[i];
overlap[i] += static_cast<float>(tmp_buf_[i].real() * w);
}
for (size_t i = 0; i < hop_; i++) {
out[i] = overlap[i] / wola_norm;
+36
View File
@@ -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 ============
### Развязка объектов (главная путаница раундов устранена)