feat(tx): заводской профиль FM — плотная модуляция с компрессией

Шестой заводской профиль: компрессор 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 <noreply@anthropic.com>
This commit is contained in:
2026-08-04 18:47:22 +03:00
co-authored by Claude Opus 5
parent 0ba808e886
commit 82df4dfb8c
+16
View File
@@ -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;