22p: joint-fit grid — floor essential (without: corpus x2), optimum scale=0.90 TOTAL 5.215, comb beats canon first time; canon stays HEAD
This commit is contained in:
@@ -1861,3 +1861,41 @@ RT_ENV=live (детекторный энвелоп из kRTAtt/kRTRel: атак
|
|||||||
источник scale (int@1a0=4096, f32@870=1.0 живые!).
|
источник scale (int@1a0=4096, f32@870=1.0 живые!).
|
||||||
3. Транзиентный калибратор: короткий тон некорректен из-за латенси/WOLA коротких
|
3. Транзиентный калибратор: короткий тон некорректен из-за латенси/WOLA коротких
|
||||||
рендеров — заменить на длинный файл со СТУПЕНЬЮ уровня внутри.
|
рендеров — заменить на длинный файл со СТУПЕНЬЮ уровня внутри.
|
||||||
|
|
||||||
|
## ============ UPDATE 2026-08-22p: JOINT-FIT ГРИД — оптимум scale 0.90, пол обязателен ============
|
||||||
|
|
||||||
|
Сетка (scripts/gridfit22p.py): pool×scale×floor по корпусу (62 случая).
|
||||||
|
|
||||||
|
### Результаты
|
||||||
|
| scale | floor | TOTAL | t1kq | t1k | al | res | dual | comb |
|
||||||
|
|-------|-------|-------|------|-----|----|----|------|------|
|
||||||
|
| 0.90 | 1 | **5.215** | 1.961 | 5.801 | 5.328 | 2.663 | 7.774 | **2.707** |
|
||||||
|
| 0.95 | 1 | 5.242 | 2.255 | 5.980 | 5.541 | 2.432 | 7.699 | 2.811 |
|
||||||
|
| 1.00 | 1 | 5.261 | 2.547 | 6.155 | 5.704 | 2.201 | 7.621 | 2.915 |
|
||||||
|
| 1.05 | 1 | 5.298 | 2.892 | 6.279 | 5.842 | 2.008 | 7.588 | 3.019 |
|
||||||
|
| 1.144 | 1 | 5.386 | 3.621 | 6.456 | 6.123 | 1.713 | 7.542 | 3.213 |
|
||||||
|
| 0.95 | 0 | 11.021 | — | **22.5** | 10.4 | — | 14.4 | — |
|
||||||
|
| 1.00 | 0 | 11.396 | — | **23.4** | 11.1 | — | 14.8 | — |
|
||||||
|
|
||||||
|
### Выводы
|
||||||
|
1. **FLOOR ОБЯЗАТЕЛЕН**: без него громкие случаи уходят в тишину (t1k 60→22 дБ ошибок,
|
||||||
|
dual ×2). Кап детекторного уровня — реальный механизм плагина, подтверждён корпусом.
|
||||||
|
2. Оптимум scale≈0.90 (тренд вышел на плато 5.2-5.3); pool=0 лучше (пул перерезает
|
||||||
|
центр полосы на широкополосном материале).
|
||||||
|
3. **comb впервые лучше канона** (2.707 vs 6.116) — мультиполосный случай выигрывает от
|
||||||
|
новой архитектуры.
|
||||||
|
4. Канон 2.286 всё ещё лучше по TOTAL: однополосные тихие случаи (t1kq/al) в новой
|
||||||
|
архитектуре перерезаются (scale-закон глобальный, а нужен уровнезависимый).
|
||||||
|
dual ~7.7 не двигается ни одним параметром — его причина не в уровне/форме кривой.
|
||||||
|
|
||||||
|
### Статус
|
||||||
|
Канон остаётся HEAD (гейт «не хуже bridge» не пройден: 5.2 > 1.594). Новая архитектура
|
||||||
|
живёт за env-флагами: RT_LUT_OFF=1 RT_IIR12=0 RT_NOWARP=1 RT_NOBLEND=1 RT_NOIIR3=1
|
||||||
|
RT_POOL=0 RT_SCALE_M=0.90 RT_FLOOR=1 RT_ENV=live → TOTAL 5.215.
|
||||||
|
|
||||||
|
### NEXT сессии
|
||||||
|
1. dual@500: константная ошибка при всех q/уровнях — исследовать отдельно (возможно
|
||||||
|
межполосный combine-консюмер или второй тон 2000Hz взаимодействует).
|
||||||
|
2. Уровнезависимость закона: scale-множитель должен зависеть от уровня сигнала
|
||||||
|
(компрессия в детекторе?) — ступенчатый калибратор внутри файла.
|
||||||
|
3. comb-выигрыш закрепить: понять, почему мультиполосность выигрывает (перенос в канон?).
|
||||||
|
|||||||
@@ -0,0 +1,49 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""gridfit22p.py — sweep new-arch env params over corpus, report TOTALs."""
|
||||||
|
import subprocess, re, sys, itertools, json
|
||||||
|
|
||||||
|
BASE = {
|
||||||
|
"RT_LUT_OFF": "1", "RT_IIR12": "0", "RT_NOWARP": "1",
|
||||||
|
"RT_NOBLEND": "1", "RT_NOIIR3": "1", "RT_ENV": "live",
|
||||||
|
}
|
||||||
|
|
||||||
|
def run(pool, scale, floor):
|
||||||
|
env = {**BASE, "RT_POOL": str(pool), "RT_SCALE_M": str(scale), "RT_FLOOR": str(floor)}
|
||||||
|
import os
|
||||||
|
e = {**os.environ, **env}
|
||||||
|
r = subprocess.run(["python3", "scripts/corpus_structural.py"],
|
||||||
|
capture_output=True, text=True, env=e, cwd="/home/m/re-tools")
|
||||||
|
m = re.search(r"TOTAL\s+62\s+([\d.]+)\s+([\d.]+)", r.stdout)
|
||||||
|
groups = dict(re.findall(r"(t1kq|t1k|al|res|dual|comb)\s+\d+\s+([\d.]+)", r.stdout))
|
||||||
|
if not m:
|
||||||
|
return None, None, groups
|
||||||
|
return float(m.group(1)), float(m.group(2)), groups
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
grid = []
|
||||||
|
scales = [1.05, 1.10, 1.144]
|
||||||
|
pools = [0] if len(sys.argv) < 2 else None
|
||||||
|
results = []
|
||||||
|
for pool, scale, floor in itertools.product([0], scales, [1]):
|
||||||
|
tot, mx, g = run(pool, scale, floor)
|
||||||
|
if tot is None:
|
||||||
|
print(f"pool={pool} scale={scale} floor={floor}: FAILED"); continue
|
||||||
|
print(f"pool={pool} scale={scale:.3f} floor={floor}: TOTAL={tot:.3f} max={mx:.2f} {g}")
|
||||||
|
results.append((tot, pool, scale, floor, g))
|
||||||
|
results.sort()
|
||||||
|
best = results[0]
|
||||||
|
print("\nBEST: TOTAL=%.3f pool=%d scale=%.3f floor=%d" % (best[0], best[1], best[2], best[3]))
|
||||||
|
# second stage around best scale with pool variants
|
||||||
|
_, bp, bs, bf, _ = best
|
||||||
|
for pool in [3, 5]:
|
||||||
|
for ds in [-0.04, 0.0, 0.04]:
|
||||||
|
sc = round(bs + ds, 3)
|
||||||
|
tot, mx, g = run(pool, sc, bf)
|
||||||
|
if tot is None: continue
|
||||||
|
print(f"[stage2] pool={pool} scale={sc:.3f}: TOTAL={tot:.3f} {g}")
|
||||||
|
results.append((tot, pool, sc, bf, g))
|
||||||
|
results.sort()
|
||||||
|
b = results[0]
|
||||||
|
json.dump({"total": b[0], "pool": b[1], "scale": b[2], "floor": b[3], "groups": b[4]},
|
||||||
|
open("/tmp/opencode/gridfit_best.json", "w"), indent=1)
|
||||||
|
print("\nFINAL BEST: TOTAL=%.3f pool=%d scale=%.3f floor=%d" % (b[0], b[1], b[2], b[3]))
|
||||||
Reference in New Issue
Block a user