22g: NO-LUT test isolates gap to detector front-end; unified sidechain-clamp hypothesis (knee at 0dBFS, identical renders above)

This commit is contained in:
2026-08-22 19:39:22 +03:00
parent 41b0d3c250
commit ef7d3f49c7
3 changed files with 244 additions and 7 deletions
+14 -7
View File
@@ -98,16 +98,23 @@ static void process_band_structural(
constexpr double DRP = 0.2159;
double rp = RP0 * std::pow(static_cast<double>(band.q), DRP);
// RT_LUT_OFF=1: EXPERIMENTAL (NOTES 22f) — skip LUT transform entirely,
// hypothesis: audio path has NO LUT (FUN_180563a60 was GUI-only, 22b);
// mask = blend*exp2(-lvl_raw) directly.
static const int lut_off = getenv("RT_LUT_OFF") ? atoi(getenv("RT_LUT_OFF")) : 0;
for (size_t k = 0; k < nbin; k++) {
double res_k = std::max(static_cast<double>(res[k]), 1e-12);
double lvl = static_cast<double>(am[k]) / res_k * scale_factor;
// dB-domain LUT (FUN_180563a60) on LEVEL before IIR/exp2: keeps both
// quiet (t1kq) and loud (t1k) inputs inside the LUT domain [A,B],
// avoiding the t<0 clamp collapse that mask-domain LUT hits on loud input.
double dB = std::log10(std::max(lvl, 1e-12)) * 20.0;
double t = (dB - LUT_A) / (LUT_B - LUT_A);
t = std::min(std::max(t, 0.0), 1.0);
lvl = std::pow(t, static_cast<double>(LUT_GAMMA)) * LUT_MULT;
if (!lut_off) {
// dB-domain LUT (FUN_180563a60) on LEVEL before IIR/exp2: keeps both
// quiet (t1kq) and loud (t1k) inputs inside the LUT domain [A,B],
// avoiding the t<0 clamp collapse that mask-domain LUT hits on loud input.
double dB = std::log10(std::max(lvl, 1e-12)) * 20.0;
double t = (dB - LUT_A) / (LUT_B - LUT_A);
t = std::min(std::max(t, 0.0), 1.0);
lvl = std::pow(t, static_cast<double>(LUT_GAMMA)) * LUT_MULT;
}
band_level[k] = static_cast<float>(lvl);
}
+48
View File
@@ -1573,3 +1573,51 @@ Audio-референсы константы: **FUN_180529c60**, 18052baa0, 18052
FUN_18052d650 IIR1 / leveltrack таблицы) — искать ограничитель амплитуды FFT/am.
2. Точная формула капа от sens: снять полы на сетке sens {3,6,9,12} × trim{18,24}.
3. Порт: вместо t-clamp LUT — детекторный кап + аффинный закон Phase A; корпус с гейтом.
## ============ UPDATE 2026-08-22g: NO-LUT TEST + CLIPPING THEORY REFINED ============
### NO-LUT эксперимент (RT_LUT_OFF=1, render48k)
Тракт@bm85 (hot-тон, RT_DUMP_BIN): lvl_raw=3.0117 → post-IIR1/2 band_level=1.0646
(IIR1 A[85]≈0.65 сильно сглаживает изолированный пик) → prewarp mask=0.3825·W=0.408
→ итоговый gain модели −7.67 dB (против real 20.72). Убрали LUT — модель всё равно
далека: разрыв теперь ЛОКАЛИЗОВАН в детекторном фронте (am/res/scale и/или IIR-сглаживание),
а не в форме кривой. Модельный lvl_max=3.012 почти касался бы пола 3.1188=log2(20/ln10),
если бы не разводился IIR1 по частоте.
### Клиппинг-теория: частично опровергнута, но указывает на clamp sidechain
- REAPER рендерит в float: trim-овердрайв кормит плагин честными float >1.0, обрезки на
itemе
## ============ UPDATE 2026-08-22g: NO-LUT TEST + CLIPPING THEORY REFINED ============
### NO-LUT эксперимент (RT_LUT_OFF=1, render48k)
Тракт@bm85 (hot-тон, RT_DUMP_BIN): lvl_raw=3.0117 → post-IIR1/2 band_level=1.0646
(IIR1 A[85]≈0.65 сильно сглаживает изолированный пик) → prewarp mask=0.3825·W=0.408
→ итоговый gain модели −7.67 dB (против real 20.72). Убрали LUT — модель всё равно
далека: разрыв теперь ЛОКАЛИЗОВАН в детекторном фронте (am/res/scale и/или IIR-сглаживание),
а не в форме кривой. Модельный lvl_max=3.012 почти касался бы пола 3.1188=log2(20/ln10),
если бы не разводился IIR1 по частоте.
### Клиппинг-теория: частично опровергнута, но указывает на clamp sidechain
- REAPER рендерит в float: trim-овердрайв кормит плагин честными float больше 1.0,
обрезки на item'е НЕТ.
- Pre-clipped файл (x12dB с клиппингом на диске) @trim0 -> -12.31 dB != -26.74: сравнение
НЕКОРРЕКТНО (искажён DRY-путь файла), но показало, что «клиппинг на входе» сам по себе
не воспроизводит пин.
### ОБЪЕДИНЁННАЯ ГИПОТЕЗА (лид): clamp копии sidechain на +-1.0 внутри плагина
Факты:
1. Колено hot-тона ровно при переходе эффективного уровня через 0 dBFS (trim 0->+6).
2. h_06 == h_12 == h_24 по метрике — после достижения 0 dBFS драйв не растёт.
3. Полы = точные кратные ln10/20 ({0.8x, 1.0x} для sens 12/6).
4. mix = сухой кроссфейд (-5.26 предсказано / -5.20 измерено).
Открытое: cold trim+24 (+6 eff) дал -15.74 вместо -20.72 => кламп либо мягкий (tanh-like,
разная глубина насыщения), либо детектор реагирует на RMS/форму, а не только пик.
### NEXT
1. Прямая верификация: live-capture sidechain-буфера плагина во время сатурированного
рендера (step7_capture-style скан памяти, искать плоскую вершину +-1.0).
2. Снять форму клампа: сетка hot-файлов {-9,-6,-3,0 dBFS} x trim {6..24} -> кривая
насыщения mask(eff_level).
3. Порт: sidechain-clamp в render48k (min(max(in,-1),1) на копии для детектора) +
аффинный закон Phase A без LUT -> корпус с гейтом.
+182
View File
@@ -0,0 +1,182 @@
0000000180533340 <.data>:
180533340: 4c 8b dc mov %rsp,%r11
180533343: 49 89 5b 10 mov %rbx,0x10(%r11)
180533347: 57 push %rdi
180533348: 48 81 ec a0 00 00 00 sub $0xa0,%rsp
18053334f: 66 0f 6e 01 movd (%rcx),%xmm0
180533353: 48 b8 00 00 00 00 00 movabs $0x3ff0000000000000,%rax
18053335a: 00 f0 3f
18053335d: f3 0f 59 1d 27 0a f9 mulss 0x1f90a27(%rip),%xmm3 # 0x1824c3d8c
180533364: 01
180533365: bb 01 00 00 00 mov $0x1,%ebx
18053336a: 48 8b f9 mov %rcx,%rdi
18053336d: 48 c7 81 10 00 08 00 movq $0x0,0x80010(%rcx)
180533374: 00 00 00 00
180533378: 41 0f 29 73 e8 movaps %xmm6,-0x18(%r11)
18053337d: 0f 28 f2 movaps %xmm2,%xmm6
180533380: 0f 5b c0 cvtdq2ps %xmm0,%xmm0
180533383: 48 89 41 10 mov %rax,0x10(%rcx)
180533387: f3 0f 5e f3 divss %xmm3,%xmm6
18053338b: 44 0f 29 6c 24 20 movaps %xmm13,0x20(%rsp)
180533391: 44 0f 28 e9 movaps %xmm1,%xmm13
180533395: f3 0f 59 f0 mulss %xmm0,%xmm6
180533399: 39 19 cmp %ebx,(%rcx)
18053339b: 0f 8e 22 01 00 00 jle 0x1805334c3
1805333a1: 49 89 73 08 mov %rsi,0x8(%r11)
1805333a5: 48 8d 71 18 lea 0x18(%rcx),%rsi
1805333a9: 41 0f 29 7b d8 movaps %xmm7,-0x28(%r11)
1805333ae: f3 0f 10 bc 24 d0 00 movss 0xd0(%rsp),%xmm7
1805333b5: 00 00
1805333b7: 45 0f 29 43 c8 movaps %xmm8,-0x38(%r11)
1805333bc: f3 44 0f 10 05 df 0a movss 0x1f90adf(%rip),%xmm8 # 0x1824c3ea4
1805333c3: f9 01
1805333c5: 45 0f 29 4b b8 movaps %xmm9,-0x48(%r11)
1805333ca: f3 44 0f 10 8c 24 d8 movss 0xd8(%rsp),%xmm9
1805333d1: 00 00 00
1805333d4: 45 0f 29 53 a8 movaps %xmm10,-0x58(%r11)
1805333d9: f2 44 0f 10 15 2e 1b movsd 0x1f91b2e(%rip),%xmm10 # 0x1824c4f10
1805333e0: f9 01
1805333e2: 45 0f 29 5b 98 movaps %xmm11,-0x68(%r11)
1805333e7: f2 44 0f 10 1d c8 12 movsd 0x1f912c8(%rip),%xmm11 # 0x1824c46b8
1805333ee: f9 01
1805333f0: 45 0f 29 63 88 movaps %xmm12,-0x78(%r11)
1805333f5: f2 44 0f 10 25 42 0d movsd 0x1f90d42(%rip),%xmm12 # 0x1824c4140
1805333fc: f9 01
1805333fe: 66 90 xchg %ax,%ax
180533400: 66 0f 6e cb movd %ebx,%xmm1
180533404: 0f 5b c9 cvtdq2ps %xmm1,%xmm1
180533407: 0f 2f ce comiss %xmm6,%xmm1
18053340a: 76 14 jbe 0x180533420
18053340c: 0f 28 c6 movaps %xmm6,%xmm0
18053340f: f3 0f 5e c1 divss %xmm1,%xmm0
180533413: 0f 28 cf movaps %xmm7,%xmm1
180533416: e8 c1 18 4e 01 call 0x181a14cdc
18053341b: 0f 28 d8 movaps %xmm0,%xmm3
18053341e: eb 07 jmp 0x180533427
180533420: 0f 28 de movaps %xmm6,%xmm3
180533423: f3 0f 5e d9 divss %xmm1,%xmm3
180533427: f3 41 0f 59 dd mulss %xmm13,%xmm3
18053342c: 41 0f 28 c0 movaps %xmm8,%xmm0
180533430: 0f 28 cb movaps %xmm3,%xmm1
180533433: f3 41 0f 5e c9 divss %xmm9,%xmm1
180533438: f3 41 0f 58 c8 addss %xmm8,%xmm1
18053343d: f3 0f 5e c1 divss %xmm1,%xmm0
180533441: 0f 57 c9 xorps %xmm1,%xmm1
180533444: f3 0f 5a c8 cvtss2sd %xmm0,%xmm1
180533448: 41 0f 54 ca andps %xmm10,%xmm1
18053344c: 66 0f 5a d1 cvtpd2ps %xmm1,%xmm2
180533450: f3 0f 59 d3 mulss %xmm3,%xmm2
180533454: f3 0f 5e 57 08 divss 0x8(%rdi),%xmm2
180533459: 0f 5a c2 cvtps2pd %xmm2,%xmm0
18053345c: f2 41 0f 59 c3 mulsd %xmm11,%xmm0
180533461: e8 40 18 4e 01 call 0x181a14ca6
180533466: 0f 57 d2 xorps %xmm2,%xmm2
180533469: ff c3 inc %ebx
18053346b: f2 0f 5a d0 cvtsd2ss %xmm0,%xmm2
18053346f: 0f 5a ca cvtps2pd %xmm2,%xmm1
180533472: 0f 5a c2 cvtps2pd %xmm2,%xmm0
180533475: f2 0f 11 8e 00 00 08 movsd %xmm1,0x80000(%rsi)
18053347c: 00
18053347d: 41 0f 28 d4 movaps %xmm12,%xmm2
180533481: f2 0f 5c d0 subsd %xmm0,%xmm2
180533485: f2 0f 11 16 movsd %xmm2,(%rsi)
180533489: 48 83 c6 08 add $0x8,%rsi
18053348d: 3b 1f cmp (%rdi),%ebx
18053348f: 0f 8c 6b ff ff ff jl 0x180533400
180533495: 44 0f 28 64 24 30 movaps 0x30(%rsp),%xmm12
18053349b: 44 0f 28 5c 24 40 movaps 0x40(%rsp),%xmm11
1805334a1: 44 0f 28 54 24 50 movaps 0x50(%rsp),%xmm10
1805334a7: 44 0f 28 4c 24 60 movaps 0x60(%rsp),%xmm9
1805334ad: 44 0f 28 44 24 70 movaps 0x70(%rsp),%xmm8
1805334b3: 0f 28 bc 24 80 00 00 movaps 0x80(%rsp),%xmm7
1805334ba: 00
1805334bb: 48 8b b4 24 b0 00 00 mov 0xb0(%rsp),%rsi
1805334c2: 00
1805334c3: 4c 8d 9c 24 a0 00 00 lea 0xa0(%rsp),%r11
1805334ca: 00
1805334cb: 49 8b 5b 18 mov 0x18(%r11),%rbx
1805334cf: 41 0f 28 73 f0 movaps -0x10(%r11),%xmm6
1805334d4: 45 0f 28 6b 80 movaps -0x80(%r11),%xmm13
1805334d9: 49 8b e3 mov %r11,%rsp
1805334dc: 5f pop %rdi
1805334dd: c3 ret
1805334de: cc int3
1805334df: cc int3
1805334e0: 48 89 5c 24 08 mov %rbx,0x8(%rsp)
1805334e5: 48 89 6c 24 10 mov %rbp,0x10(%rsp)
1805334ea: 48 89 74 24 18 mov %rsi,0x18(%rsp)
1805334ef: 48 89 7c 24 20 mov %rdi,0x20(%rsp)
1805334f4: 41 56 push %r14
1805334f6: 48 83 ec 40 sub $0x40,%rsp
1805334fa: 41 8b c1 mov %r9d,%eax
1805334fd: c6 44 24 20 00 movb $0x0,0x20(%rsp)
180533502: 49 8b f0 mov %r8,%rsi
180533505: 4c 8b f2 mov %rdx,%r14
180533508: 44 8b c0 mov %eax,%r8d
18053350b: 48 8d 54 24 30 lea 0x30(%rsp),%rdx
180533510: 45 33 c9 xor %r9d,%r9d
180533513: 48 8b e9 mov %rcx,%rbp
180533516: e8 25 c1 ff ff call 0x18052f640
18053351b: 48 8b 45 20 mov 0x20(%rbp),%rax
18053351f: 48 8d 15 92 d8 11 02 lea 0x211d892(%rip),%rdx # 0x182650db8
180533526: 4c 63 4c 24 30 movslq 0x30(%rsp),%r9
18053352b: 48 8d 0d 86 d8 11 02 lea 0x211d886(%rip),%rcx # 0x182650db8
180533532: 4a 8d 3c 88 lea (%rax,%r9,4),%rdi
180533536: ff 15 cc 7a 67 01 call *0x1677acc(%rip) # 0x181bab008
18053353c: 8b 5c 24 34 mov 0x34(%rsp),%ebx
180533540: 4d 8b c6 mov %r14,%r8
180533543: 48 8b d7 mov %rdi,%rdx
180533546: 48 8b ce mov %rsi,%rcx
180533549: 44 8b cb mov %ebx,%r9d
18053354c: 85 c0 test %eax,%eax
18053354e: 75 07 jne 0x180533557
180533550: e8 5b e9 ac ff call 0x180001eb0
180533555: eb 05 jmp 0x18053355c
180533557: e8 c4 e5 ac ff call 0x180001b20
18053355c: 48 8b 7d 20 mov 0x20(%rbp),%rdi
180533560: 48 8d 15 51 d8 11 02 lea 0x211d851(%rip),%rdx # 0x182650db8
180533567: 48 63 c3 movslq %ebx,%rax
18053356a: 48 8d 0d 47 d8 11 02 lea 0x211d847(%rip),%rcx # 0x182650db8
180533571: 48 8d 1c 86 lea (%rsi,%rax,4),%rbx
180533575: 49 8d 34 86 lea (%r14,%rax,4),%rsi
180533579: ff 15 89 7a 67 01 call *0x1677a89(%rip) # 0x181bab008
18053357f: 44 8b 4c 24 38 mov 0x38(%rsp),%r9d
180533584: 4c 8b c6 mov %rsi,%r8
180533587: 48 8b d7 mov %rdi,%rdx
18053358a: 48 8b cb mov %rbx,%rcx
18053358d: 85 c0 test %eax,%eax
18053358f: 75 07 jne 0x180533598
180533591: e8 1a e9 ac ff call 0x180001eb0
180533596: eb 05 jmp 0x18053359d
180533598: e8 83 e5 ac ff call 0x180001b20
18053359d: 48 8b 5c 24 50 mov 0x50(%rsp),%rbx
1805335a2: 48 8b 6c 24 58 mov 0x58(%rsp),%rbp
1805335a7: 48 8b 74 24 60 mov 0x60(%rsp),%rsi
1805335ac: 48 8b 7c 24 68 mov 0x68(%rsp),%rdi
1805335b1: 48 83 c4 40 add $0x40,%rsp
1805335b5: 41 5e pop %r14
1805335b7: c3 ret
1805335b8: cc int3
1805335b9: cc int3
1805335ba: cc int3
1805335bb: cc int3
1805335bc: cc int3
1805335bd: cc int3
1805335be: cc int3
1805335bf: cc int3
1805335c0: 40 53 rex push %rbx
1805335c2: 56 push %rsi
1805335c3: 57 push %rdi
1805335c4: 48 83 ec 40 sub $0x40,%rsp
1805335c8: 66 41 0f 6e c0 movd %r8d,%xmm0
1805335cd: 48 8b da mov %rdx,%rbx
1805335d0: f3 0f e6 c0 cvtdq2pd %xmm0,%xmm0
1805335d4: 48 8b f1 mov %rcx,%rsi
1805335d7: 0f 29 74 24 30 movaps %xmm6,0x30(%rsp)
1805335dc: e8 e3 16 4e 01 call 0x181a14cc4
1805335e1: 0f 28 f0 movaps %xmm0,%xmm6
1805335e4: f2 0f 10 05 fc 0b f9 movsd 0x1f90bfc(%rip),%xmm0 # 0x1824c41e8
1805335eb: 01
1805335ec: e8 d3 16 4e 01 call 0x181a14cc4
1805335f1: f2 0f 5e f0 divsd %xmm0,%xmm6
1805335f5: 48 8d 15 bc d7 11 02 lea 0x211d7bc(%rip),%rdx # 0x182650db8