diff --git a/handoff/NOTES_LEVEL.md b/handoff/NOTES_LEVEL.md index 9e789ca..25b3840 100644 --- a/handoff/NOTES_LEVEL.md +++ b/handoff/NOTES_LEVEL.md @@ -3696,3 +3696,29 @@ tone1k.wav amp@1k=0.9666 vs k0_in 0.4248 (×2.28 громче) ⇒ его кат ``` Для полного покрытия нужно: правило α(контент) из декомпа шагов 9–19 (механизм смешения) + 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 коэф. уже известны!) diff --git a/scripts/mk_far.py b/scripts/mk_far.py new file mode 100644 index 0000000..808e22d --- /dev/null +++ b/scripts/mk_far.py @@ -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')