24ll2: multi6 dataset — SIX notches one run (self-consistent); cut GROWS with res (2.33->7.18), independent of am (first four tones equal am!); rejected floor/power models; perfect validation target for cascade simulator

This commit is contained in:
2026-08-25 12:54:25 +03:00
parent def7cea522
commit b85b344e23
2 changed files with 45 additions and 0 deletions
+29
View File
@@ -3803,3 +3803,32 @@ m-тест: pk2-закон = pk1-закон(уровень×11.6±0.1) — ко
campaign.py (ячейка семейства); tt_series.py (рецепт двухтоновой серии);
все датасеты sc_*/tract_*/*pkl сохранены. Следующая сессия: декод шагов
919 до конца (dataflow готов) + захват A/B/γ объектов банд → замыкание.
## ============ ДОПОЛНЕНИЕ 24ll2: мультитон-6 датасет — шесть нотчей один прогон ============
### multi6 (тоны 200/500/1000/2000/4000/8000 Гц, amp 0.30, fc500/q0.5/s12):
```
тон бин am res lvl cut_дБ
200 19 0.0029 0.441 -0.09 0.02 (пик-детект сломан на слабом)
500 43 0.2103 0.1172 6.006 2.33
1000 85 0.2124 0.3737 1.897 3.52
2000 171 0.2159 0.8389 0.862 4.42
4000 342 0.1703 1.4006 0.493 7.18
8000 684 0.0605 1.8114 0.010 5.58
```
Шесть нотчей ОДНИМ прогоном = самосогласованный датасет для каскада!
### Наблюдения:
1. cut РАСТЁТ с res почти монотонно (2.33→7.18), падение только @8000.
2. Первые ЧЕТЫРЕ тона имеют ОДИНАКОВЫЙ am≈0.21, но каты различаются вдвое
⇒ cut зависит от res ОТДЕЛЬНО от am (наш lvl=am/res даёт обратную
монотонность ✗) — закон входа содержит res ПОЛОЖИТЕЛЬНО!
3. 8000Гц выпадает (am ниже из-за окна анализа + кат ниже тренда).
4. Отвергнуты на этом датасете: floor-модель res (rms 1.88),
β∝res^p (rms 1.08), exp-формы.
### Ценность для симулятора
multi6 = идеальный валидатор каскадного симулятора шагов 9–19: один прогон,
шесть пиков с разными (am,res) комбинациями, самосогласованные B=exp(scratch).
После оп-за-оп транскрипции симулятор ОБЯЗАН воспроизвести эти пять глубин
из am/res тракта — это и есть критерий bit-exact детектора.
+16
View File
@@ -0,0 +1,16 @@
#!/usr/bin/env python3
"""mk_multi6.py — 6-tone multitone input + rpp clone."""
import wave, numpy as np, re
sr=44100; T=4.0; n=int(sr*T); t=np.arange(n)/sr
tones=(200.,500.,1000.,2000.,4000.,8000.)
ph=np.random.default_rng(51).uniform(0,2*np.pi,len(tones))
A=0.30 # per-tone amplitude (avoid clip: sum ~0.9 worst case)
y=sum(A*np.sin(2*np.pi*f*t+p) for f,p in zip(tones,ph))
y=np.clip(y,-0.999,0.999)
w=wave.open('/tmp/opencode/multi6_in.wav','wb'); w.setnchannels(1); w.setsampwidth(2); w.setframerate(sr)
w.writeframes((y*32767).astype(np.int16).tobytes()); w.close()
src=open('/tmp/opencode/t1k_base.rpp').read() # band1 freq will be patched to 500
src=re.sub(r'RENDER_FILE "[^"]*"','RENDER_FILE "/tmp/opencode/multi6_ref.wav"',src)
src=src.replace('FILE "/home/m/soothe-bt/tone1k.wav"','FILE "/tmp/opencode/multi6_in.wav"')
open('/tmp/opencode/multi6.rpp','w').write(src)
print('multi6 ready: tones',tones,'amp',A)