mirror of
https://git.vladimir.cc/vladimir/ewsdr.git
synced 2026-08-25 19:45:09 +00:00
feat(tx): заводские EQ-кривые ESSB, честная АЧХ в редакторе, фикс 3-полосного EQ
Ключ ко всему — семантика EQ в WDSP (wdsp/eq.c, eq_impulse + TXA.c): F[1..n] это УЗЛЫ ломаной АЧХ, между ними интерполяция по децибелам, а за крайними узлами при ctfmode=0 (так создаётся eqp у TXA, мы его не меняем) идёт кумулятивный скат (f/f0)^4 на каждый бин — фактически обрыв. Значит включённый EQ работает как второй полосовой фильтр, и верхний узел обязан лежать за верхней кромкой TX-фильтра. Settings: заводские ESSB несут свою кривую (AddEQ) — ESSB 3.5k узлы 100..3600, ESSB 5k узлы 100..5100, преамп в минус (EQ стоит до компрессора и ALC). EQ у Default/SSB DX/SSB Wide сбрасывается в заводской ноль (FlatEQ), а не наследует живой, иначе «сброс к заводским» не сбрасывал бы тембр. Сетка узлов вынесена в модульную DEF_EQ_FREQS. WDSPEngine: единая точка пуша EQ (PushTXEQProfile). Починен 3-полосный режим: раньше в WDSP уходили первые три узла 10-полосной сетки (100/200/400) и включённый EQ убивал весь голос выше 400 Гц; теперь legacy-раскладка самого WDSP (150/400/1500/6000, как SetTXAGrphEQ). EqualizerControl: кривая — точный порт eq_impulse вместо гауссовых горбов (сверено с C численно, расхождение 0.0 дБ), рисуется без клампа ±15, чтобы обрыв за крайними узлами был виден. В 3-полосном режиме ручки стоят на 150/1500/6000 и по частоте не таскаются, сетка профиля при этом цела. RadioController/SettingsForm/MainForm: кнопка Factory — пересборка заводского набора с применением Default. Без неё обновлённые заводские профили не доедут до тех, у кого секция tx_profiles уже записана: она читается, а не создаётся. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -595,6 +595,7 @@ type
|
||||
function AddTXProfile(const AName: string): Integer; // форк текущего звука
|
||||
procedure RenameTXProfile(Idx: Integer; const AName: string);
|
||||
procedure DeleteTXProfile(Idx: Integer);
|
||||
procedure ResetTXProfilesToFactory; // заводской набор заново
|
||||
procedure SaveTXProfilesToConfig;
|
||||
|
||||
// ---- Управление диапазонами (состояние + DSP; рендер через события) ----
|
||||
@@ -5046,6 +5047,22 @@ begin
|
||||
Changed(rfTXProfile);
|
||||
end;
|
||||
|
||||
procedure TRadioController.ResetTXProfilesToFactory;
|
||||
// Пересобирает заводской набор поверх текущего списка. База — ЖИВЫЕ настройки,
|
||||
// поэтому «Default» = микрофонный вход, полоса, динамика и мощность как сейчас,
|
||||
// но с заводским (ровным) EQ. Единственный способ доехать до обновлённых
|
||||
// заводских профилей с уже записанной секцией tx_profiles: она читается, а не
|
||||
// пересоздаётся.
|
||||
begin
|
||||
DefaultTXProfiles(FTXSettings, FDrivePercent, FTXProfiles);
|
||||
// ActiveIdx гасим перед Select: иначе StoreActiveTXProfile внутри него
|
||||
// впишет в свежий «Default» живой EQ и сброс тембра тут же отменится.
|
||||
FTXProfiles.ActiveIdx := -1;
|
||||
// Применяем «Default» в эфир — иначе живой EQ остался бы кривым, а профиль
|
||||
// говорил бы «ровный», и первая же правка TX-настроек вернула бы кривую.
|
||||
SelectTXProfile(0); // сам сохранит и отрендерит
|
||||
end;
|
||||
|
||||
procedure TRadioController.ApplyTXSettingsToDSP;
|
||||
begin
|
||||
if not FWDSPReady then Exit;
|
||||
|
||||
Reference in New Issue
Block a user