From 82df4dfb8ce8dad116816d441f2926f5f2a94f7f Mon Sep 17 00:00:00 2001 From: Vladimir Date: Tue, 4 Aug 2026 18:47:22 +0300 Subject: [PATCH] =?UTF-8?q?feat(tx):=20=D0=B7=D0=B0=D0=B2=D0=BE=D0=B4?= =?UTF-8?q?=D1=81=D0=BA=D0=BE=D0=B9=20=D0=BF=D1=80=D0=BE=D1=84=D0=B8=D0=BB?= =?UTF-8?q?=D1=8C=20FM=20=E2=80=94=20=D0=BF=D0=BB=D0=BE=D1=82=D0=BD=D0=B0?= =?UTF-8?q?=D1=8F=20=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D1=8F=D1=86=D0=B8=D1=8F?= =?UTF-8?q?=20=D1=81=20=D0=BA=D0=BE=D0=BC=D0=BF=D1=80=D0=B5=D1=81=D1=81?= =?UTF-8?q?=D0=B8=D0=B5=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Шестой заводской профиль: компрессор 8 дБ + своя кривая EQ. Для FM компрессия работает иначе, чем для SSB: девиация ограничена жёстко, громкость даёт средний уровень, а не пики. По цепи TXA (wdsp/TXA.c:xtxa) eqp → leveler → bp0 → compressor → ALC идут ДО xfmmod, то есть профиль на FM-звук влияет целиком. Кривая намеренно не задирает верх: предыскажение (xemphp) по умолчанию стоит вторым вариантом — после ALC, прямо перед модулятором, — поэтому компрессор его не удержит и лишний буст ушёл бы в перемодуляцию на свистящих. Снизу срез бубнения, лёгкий подъём разборчивости 1.4..2.3 кГц, спад к 3.4 кГц. Крайние узлы 200 и 3400 взяты с запасом вокруг AF-полосы модулятора 300..3000, чтобы обрыв EQ не попал внутрь неё (проверено расчётом по формуле eq.c). Полоса 300/3000 в профиле для самого FM косметическая — края bp0 движок считает по Карсону; она сыграет, только если привязать профиль к голосовому режиму. Девиация, AF-срез и позиция предыскажения остаются свойствами аппарата (вкладка Hardware) и профилем не переключаются. Co-Authored-By: Claude Opus 5 --- Settings.pas | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/Settings.pas b/Settings.pas index dbe5cbe..9ffbd2d 100644 --- a/Settings.pas +++ b/Settings.pas @@ -1934,6 +1934,15 @@ const ESSB50_F: array[1..10] of Double = (100, 180, 300, 550, 950, 1600, 2400, 3300, 4200, 5100); ESSB50_G: array[1..10] of Double = ( -5, -3, -1, 0, 0, 1, 2, 3.5, 5, 5); ESSB50_PRE = -3.0; + // FM: узлы охватывают AF-полосу модулятора (штатно 300..3000, вкладка + // Hardware), крайние с запасом — за ними EQ обрывает АЧХ. Верх НЕ поднимаем: + // предыскажение (pre-emphasis) само задирает его 6 дБ/окт и по умолчанию + // стоит ПОСЛЕ динамики (xemphp вторым, сразу перед xfmmod), то есть + // компрессор его уже не удержит — лишний буст ушёл бы в перемодуляцию на + // свистящих. Снизу режем бубнение, лёгкий подъём разборчивости 1.4..2.3 кГц. + FM_F: array[1..10] of Double = (200, 300, 450, 700, 1000, 1400, 1800, 2300, 2800, 3400); + FM_G: array[1..10] of Double = ( -8, -4, -1, 0, 0, 1, 2, 2, 1, -2); + FM_PRE = -1.0; // Тембр у заводского профиля — заводской: EQ выключен, все усиления и // преамп в нуле, сетка узлов штатная. Наследовать сюда живой EQ нельзя — @@ -2018,6 +2027,13 @@ begin Add('SSB Wide', 200, 3100, False, 5.0); AddEQ('ESSB 3.5k', 100, 3500, False, 5.0, ESSB35_F, ESSB35_G, ESSB35_PRE); AddEQ('ESSB 5k', 100, 5000, False, 5.0, ESSB50_F, ESSB50_G, ESSB50_PRE); + // FM: плотная модуляция за счёт компрессора — девиация ограничена жёстко, + // поэтому громкость даёт средний уровень, а не пики. Полоса 300..3000 здесь + // косметическая: в FM края bp0 считает сам движок по Карсону (девиация + + // AF-срез), профильные значения работают, только если привязать этот профиль + // к голосовому режиму. Девиация и AF-срез — свойства аппарата (вкладка + // Hardware), профилем не переключаются. + AddEQ('FM', 300, 3000, True, 8.0, FM_F, FM_G, FM_PRE); end; function TSettingsManager.LoadTXProfiles(const MAC: array of Byte;