From 0dfff22efb10dfa55ea5eb5013480612238e6ce5 Mon Sep 17 00:00:00 2001 From: Matiq Date: Tue, 25 Aug 2026 11:22:45 +0300 Subject: [PATCH] =?UTF-8?q?24ll:=20alpha(content)=20LOCALIZED=20=E2=80=94?= =?UTF-8?q?=20far=20second=20tone=20(@4000,=20both=200dB=20and=20-12dB)=20?= =?UTF-8?q?does=20NOT=20affect=20alpha=20(1.075-1.110=20vs=201.153);=20mix?= =?UTF-8?q?ing=20is=20template-local=20via=20res-weighted=20freq-IIRs;=20d?= =?UTF-8?q?istance-kernel=20series=20is=20the=20next=20campaign=20cell?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- handoff/NOTES_LEVEL.md | 26 ++++++++++++++++++++++++++ scripts/mk_far.py | 18 ++++++++++++++++++ 2 files changed, 44 insertions(+) create mode 100644 scripts/mk_far.py 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')