24ll: alpha(content) LOCALIZED — far second tone (@4000, both 0dB and -12dB) does NOT affect alpha (1.075-1.110 vs 1.153); mixing is template-local via res-weighted freq-IIRs; distance-kernel series is the next campaign cell

This commit is contained in:
2026-08-25 11:22:45 +03:00
parent 4f79f83c11
commit 0dfff22efb
2 changed files with 44 additions and 0 deletions
+26
View File
@@ -3696,3 +3696,29 @@ tone1k.wav amp@1k=0.9666 vs k0_in 0.4248 (×2.28 громче) ⇒ его кат
``` ```
Для полного покрытия нужно: правило α(контент) из декомпа шагов 9–19 Для полного покрытия нужно: правило α(контент) из декомпа шагов 9–19
(механизм смешения) + fc-поправка. После этого — bit-exact везде. (механизм смешения) + fc-поправка. После этого — bit-exact везде.
## ============ UPDATE 24ll: МЕХАНИЗМ α(контент) ЛОКАЛИЗОВАН — смешение шаблонно-локальное ============
### Эксперимент «далёкий тон» (fc500/q0.5/s12, второй тон@4000 Гц):
```
конфиг lvl scratchCut α_eff (инверсия single-закона)
один тон@500 8.555 3.90 1.153 (калибровка)
+тон@4000 (0 дБ) 8.555 3.77 1.110 ← НЕ влияет!
+тон@4000 (12 дБ) 2.149 2.31 1.075 ← НЕ влияет!
dual (+тон@2000, близко) 8.550 9.93 3.09 ← удвоение только здесь
```
**α зависит ТОЛЬКО от контента в пределах шаблона полосы**.
Далёкий контент не влияет ни на каком уровне. Смешение =
шаблонно-локальное (через res-взвешенные частотные IIR шагов 9–19,
согласуется с коэф. 533340: g=fc/i спадает с дистанцией).
### Следствие для транскрипции
α_eff(конфиг) = α₀·(1 + Σ_i w(d_i)·lvl_i/lvl_peak) где d_i — расстояния
до чужих пиков в единицах шаблона, w — убывающее ядро (параметризуется
серией двухтонов с переменной дистанцией — следующая ячейка кампании).
β/c ожидаются константами.
### Кампания (обновлённая сетка):
✓ q не влияет; ✓ sens через lvl; ✓ далёкий контент не влияет
□ двухтональная дистанционная серия (w-ядро): d∈{1500,750,400,200}Гц
□ декод ядра из шагов 9–19 (IIR1/2 коэф. уже известны!)
+18
View File
@@ -0,0 +1,18 @@
#!/usr/bin/env python3
import wave, numpy as np
sr=44100; T=4.0; n=int(sr*T); t=np.arange(n)/sr
ph=np.random.default_rng(21).uniform(0,2*np.pi,7)
for att,nm,f2 in ((0,'far0',4000.),(12,'far12',4000.)):
A=0.4248*10**(-att/20)
y=A*np.sin(2*np.pi*500*t+ph[0])+A*np.sin(2*np.pi*f2*t+ph[1])
for i,f in enumerate((300.,700.,1400.,2800.)):
y+=A*10**(-30/20)*np.sin(2*np.pi*f*t+ph[i+2])
y=np.clip(y,-0.999,0.999)
w=wave.open('/tmp/opencode/%s_in.wav'%nm,'wb'); w.setnchannels(1); w.setsampwidth(2); w.setframerate(sr)
w.writeframes((y*32767).astype(np.int16).tobytes()); w.close()
import re
src=open('/tmp/opencode/f0.rpp').read()
src=re.sub(r'RENDER_FILE "[^"]*"','RENDER_FILE "/tmp/opencode/%s_ref.wav"'%nm,src)
src=src.replace('FILE "/tmp/opencode/f0_in.wav"','FILE "/tmp/opencode/%s_in.wav"'%nm)
open('/tmp/opencode/%s.rpp'%nm,'w').write(src)
print('far-pair inputs+rpps ready')