mirror of
https://git.vladimir.cc/vladimir/ewsdr.git
synced 2026-08-25 20:37:33 +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:
@@ -532,6 +532,7 @@ type
|
||||
procedure OnTXProfileAddFromSettings(const AName: string);
|
||||
procedure OnTXProfileRenameFromSettings(Idx: Integer; const AName: string);
|
||||
procedure OnTXProfileDeleteFromSettings(Idx: Integer);
|
||||
procedure OnTXProfileFactoryFromSettings(Sender: TObject);
|
||||
procedure OnChannelStoreChanged(Sender: TObject);
|
||||
procedure OnChannelActiveChanged(Idx: Integer; const Name: string; Active: Boolean);
|
||||
procedure PbSpectrumMouseDown(Sender: TObject; Button: TMouseButton;
|
||||
@@ -5769,6 +5770,11 @@ begin
|
||||
FController.DeleteTXProfile(Idx);
|
||||
end;
|
||||
|
||||
procedure TMainForm.OnTXProfileFactoryFromSettings(Sender: TObject);
|
||||
begin
|
||||
FController.ResetTXProfilesToFactory;
|
||||
end;
|
||||
|
||||
procedure TMainForm.OnChannelActiveChanged(Idx: Integer; const Name: string; Active: Boolean);
|
||||
begin
|
||||
// Рендер кнопки Channel по событию адаптера каналов (Active=True → подсветка+имя).
|
||||
@@ -8778,6 +8784,7 @@ begin
|
||||
SF.OnTXProfileAdd := OnTXProfileAddFromSettings;
|
||||
SF.OnTXProfileRename := OnTXProfileRenameFromSettings;
|
||||
SF.OnTXProfileDelete := OnTXProfileDeleteFromSettings;
|
||||
SF.OnTXProfileFactory := OnTXProfileFactoryFromSettings;
|
||||
SF.OnAlexChange := OnAlexSettingsChange;
|
||||
SF.OnXvtrChange := OnXvtrSettingsChange;
|
||||
SF.OnOCChange := OnOCSettingsChange;
|
||||
|
||||
Reference in New Issue
Block a user