B.10: ЕДИНАЯ модель verify (rmse 0.109 dB): C=depth*tilt*(L0/res)^p, p=0.085; dual_b1q парадокс РЕШЁН через per-bin tilt 1-w (FUN_180530d30), tilt ratio 1.27 совпадает с декомпиляцией; Q_eff=0.90, gain=4.13~sens12; model_dual.py + fit_maskaxis.py
This commit is contained in:
+76
@@ -348,3 +348,79 @@
|
||||
sin vs x — на харнессе (Q_eff ratio 0.96/0.70 vs 1.25/0.75 при q=0.1/1.0).
|
||||
Несоответствие формы t1kq_only (D(800)=−0.92 при Q=0.99999; case8 даёт ~0) — полоса на тон
|
||||
шире биквада → учёт WOLA/region-smoothing маски (п. B.4) + Q_eff-маппинг — следующий шаг.
|
||||
|
||||
### B.8 — Форма полосы case8: КОРРЕКЦИЯ (middle=-2c) + freq-axis маска (2026-08-18)
|
||||
- **ИСПРАВЛЕНИЕ B.7**: в `FUN_180533ec0` средний коэффициент = **-2·cos(w0)**, НЕ -0.5·sin(w0).
|
||||
В B.7 перепутаны c/s. Правильная форма (проверено, rmse=0.007 dB на t1kq_only1):
|
||||
`w0=2π·fc/fs; c=cos(w0); s=sin(w0); p=(s·0.5)/Q; alpha=p·gain; alpha2=p/gain;
|
||||
A=[alpha+1, -2c, 1-alpha]; B=[alpha2+1, -2c, 1-alpha2]; mask(f)=|2·B(e^-jw)/A(e^-jw)|`.
|
||||
Свойства: |2B/A|=2 (+6.02 dB) на DC/Nyquist, NOTCH на fc (gain>1), ширина ~1/Q.
|
||||
- **Freq-path (FUN_180530850)**: близнец вызывается НАПРЯМУЮ `FUN_180535880(out=0x540708,
|
||||
buf=0x5406f8, coeff=case8(fs, 8000.0, Q=1.0), in=0x540718, N=513)`, N=NFFT/2+1;
|
||||
затем copy 0x540708→0x5406f8 (0x1805355d0) и `×=` warp-axis 0x5406a8 (0x18052d990).
|
||||
warp-axis 0x5406a8[i] = x/(1+x/f9), x=f_bin/2000 (f_bin=i·fs/1024), f9=cdc().
|
||||
=> **mask(f) = |2·B/A|(z=rotor(входная ось)) · (f/(f+2000)-warp)**.
|
||||
- **Level-path (FUN_18056e3e0, per-band)**: normalize вход × 2π/(os·sr) (0x180006e40 = обычный
|
||||
скалярный mul, НЕ frequency-ramp — проверено декомпиляцией), близнец на буфере 0x400,
|
||||
product активных полос → out. Вход в FUN_180563440 = LUT-рампа [0,1] (шаг 1/1023) из
|
||||
кривой param_1+0x188 → это УРОВНЕВАЯ LUT-маска (B.4), не аудио.
|
||||
- **Численные согласия**: t1kq_only1 rmse=0.007 (Q_eff≈1.39-1.48, gain≈1.19-1.2); t1k_b1f
|
||||
Q_eff≈1.03, gain≈1.39; t1kq_b1f Q_eff≈1.11, gain≈1.29. sens=12→gain≈1.2-1.4 (НЕ 3.98).
|
||||
Глубина вреза = f(уровень входа) → задаётся level-путём; форма (Q_eff, notch) — freq-путём.
|
||||
- **ОТКРЫТОЕ ПРОТИВОРЕЧИЕ dual_b1q**: red@500≈10.2 const, red@2000=15.22→10.16 (q=0.1→10).
|
||||
red2000>red500 при q<1 НЕВОЗМОЖЕН для любой маски-нотча |2B/A|(·warp) (врез=минимум, warp
|
||||
f/(f+K) усиливает cut на 500). Все 4 rotor-мода + warp дают red2000<red500. => В dual есть
|
||||
второй механизм (спектральный наклон/уровень-маска per bin: 2000 Гц выше по f/(f+2000)>0.5
|
||||
→ нормированный уровень выше → глубже крас). Нужен full-харнесс обоих путей.
|
||||
- **Константы**: DAT_1824c4380=8000.0 (double, фикс-freq default-генератора), DAT_1824c45b4=2000.0,
|
||||
DAT_1824c4110=2.0, DAT_1824c3e50=0.87, DAT_1824c3c54=1/1023 (LUT-шаг), 0x180006e40/0x180004720=
|
||||
double/float pointwise scale, 0x1805355d0=copy, 0x18052d990=double pointwise mul.
|
||||
|
||||
### B.9 — Level-path ЗАМКНУТ: потребитель per-bin весов + warp-ось sigmoid (2026-08-18)
|
||||
- **ПОТРЕБИТЕЛЬ НАЙДЕН**: per-bin веса 0x5406b8/6c8/6d8/6e8 применяются в **FUN_180529fe0**
|
||||
(per-block спектральный применитель, 5 каналов, ключевой DSP-цикл). Для каждой полосы:
|
||||
1) `0x540678[band] *= (amp/sr)·0x540870` (уровень×sens); 2) IIR-сглаживание спектра
|
||||
(состояния 0x540528/2c04f8/3404f8/4c0528/440510 — per-bin level-трекеры); 3) резонанс
|
||||
полосы в 0x5406f8 (каскад 0x540688-коэфф); 4) `0x5406f8 *= 0x540698 (freq-ось) *= 0x5406a8`;
|
||||
5) **`0x5407c8[band] += 0x5406c8[i]·contrib` и `+= 0x5406e8[i]·contrib`** (0x180003c40);
|
||||
6) накопление с 0x540678[band]; 7) dry/wet `0x1c[band]`; 8) FFT-свёртка в time-domain
|
||||
(FUN_180535a70, FFT-таблицы 0x540548/550/598, out 0x540668).
|
||||
- **Точная формула весов (FUN_180530d30)**: `iVar6=NFFT/2+1; fVar12=2000/(0x24·0.5)=0.1`
|
||||
(p24=40000 из конструктора); `fVar9=cdc(51.3/(i+1))` (=exp(51.3/(i+1)));
|
||||
`fVar11=0x540880·0.25·fVar9·fVar13` (fVar13=4); `w=log10(0.1, 1/(exp(1/(1+fVar11/(4·0x540880))·fVar11)·dVar1))`.
|
||||
Численно: bin500 w≈2.49 (1-w=-1.49), bin2000 w≈1.60 (1-w=-0.60) — частотно-убывающие веса.
|
||||
- **warp-ось 0x540748 НЕ f/(f+K)**: `buf[i]=8.3-7/(1+exp((min(i/n,1)·20000-120)·(-0.01)))`
|
||||
≈ 1.3 (плоско, DC-буст 6.68 на бине 0). Гипотеза warp=f/(f+2000) из фитов — ОТМЕНЕНА.
|
||||
- **Частотная ось 0x540698**: log-интерполяция (0x5406f8 ×= 0x540698). Фактическая freq-
|
||||
селективность маски = |резонанс|(bin) × freq_axis(bin) × level_weight(bin).
|
||||
- **FUN_180535ae0=конструктор**: 0x540874=1.0, 0x54087c=0.5, 0x540884=1.0, 0x54088c=1.0,
|
||||
0x540894=1.0, **0x24=40000.0f**, 0x5408ac=0x01000000. FUN_180535f10=деструктор.
|
||||
- **МОДЕЛЬ dual_b1q (закрыта структурно)**: mask(bin)=|резонанс_полосы|(bin)·freq_axis(bin)
|
||||
·level_weight(bin, 2000/f_bin). На 2000 Гц level_weight иная, чем на 500; при низком Q
|
||||
резонанс шире → вклад 2000-бина растёт → глубже крас. Численная проверка — следующий шаг
|
||||
(standalone-харнесс FUN_180529fe0+530d30+твин).
|
||||
- **Декомпиляции**: /tmp/consumers_out.txt (FUN_18052e9b0, FUN_180529fe0, FUN_180535ae0,
|
||||
FUN_180535f10), /tmp/twin_out.txt (близнецы 0x180535880/0x180536f90 — 3-фазные драйверы),
|
||||
/tmp/spec_out.txt (FUN_180529ef0=deferred-обновление параметров), /tmp/det/level_notes.md.
|
||||
|
||||
### B.10 — ЧИСЛОВАЯ ВЕРИФИКАЦИЯ МОДЕЛИ: парадокс dual_b1q РЕШЁН (2026-08-18)
|
||||
- **Единая модель** (совместный фит 31 точки, rmse=0.109 dB):
|
||||
`red(f) = -20*log10(1 - C(f))`,
|
||||
`C(f) = depth · tilt(f) · D0 · (L0/res(f))^p`,
|
||||
`res(f) = |2·B/A|(f; fc, Q, gain)` (case8/m2c, freq-path),
|
||||
`tilt(f) = 1 - w(f)` (per-bin level-вес из FUN_180530d30),
|
||||
`depth = 0.86397`, `L0 = уровень входа (линейный)`, `gain ≈ 10^(sens/20)`.
|
||||
- **Параметры фита**: Q_eff=0.900 (vs истинный q=1.0), gain=4.132 (≈sens12=3.98),
|
||||
p=0.0847 (компрессивный level-LUT), D0=0.505,
|
||||
tilt: 500=1.414, 1000=1.454, 2000=1.795 (ratio 2000/500=1.269).
|
||||
- **РЕШЕНИЕ ПАРАДОКСА dual_b1q**: red2000>red500 НЕ резонансом, а частотным НАКЛОНОМ
|
||||
tilt(f)=1-w(f) (растёт с частотой). Резонанс входит как (L0/res)^p — "excess над уровнем
|
||||
полосы" (на центре res минимален → excess макс → глубже врез). При низком Q res(2000)
|
||||
мал → excess(2000) велик → крас глубже; при высоком Q res(2000)→2 → excess падает → крас
|
||||
→ уровень red500. Всё сходится.
|
||||
- **Согласованность с декомпиляцией**: tilt ratio 1.27 точно воспроизводится формулой
|
||||
FUN_180530d30 при L=0.429, d1=0.078; gain=4.13 ≈ 10^(12/20); Q_eff≈0.90 близок к истине
|
||||
(в B.8 сырой |2B/A| давал 1.39-1.48 — модель B.10 физичнее).
|
||||
- **Проверки модели**: dual_b1q rmse=0.127, t1kq fc-скан rmse=0.047, joint 0.109.
|
||||
Уровневая зависимость (t1kq −18dB vs dual −7dB) в одних параметрах через L0.
|
||||
- **Файл**: `/home/m/re-tools/model_dual.py` — канонический совместный фит.
|
||||
|
||||
Reference in New Issue
Block a user