mirror of
https://git.vladimir.cc/vladimir/ewsdr.git
synced 2026-08-26 19:57:33 +00:00
fix(puresignal): цель feedback 22 для Orion MkII + outlier-фильтр calcc
Разбор «IMD3 хуже, чем в Thetis»: юзерская плата (Orion MkII/Anvelina PRO3) при стоковой цели feedback 152 перегружает входные каскады ADC2208+кодека — фидбек сам интермодулирует, PS корректирует по искажённому наблюдению. Замеры eu2av (Thetis-Enhanced): оптимум FB≈22 при ATT≈10 дБ. - PSFBTarget: цель уровня feedback, авто по плате (board 5 → 22, иначе 152), настройка ps_fb_target (0 = авто) - авто-ATT: пороги от цели (FB > 1.5×цели / FB < 0.7×цели при ATT>0), ddB = 20*log10(FB/цель). Заодно чинит «ATT всегда 0»: старый порог >181 на этой плате никогда не достигался - PSOutlierSigmaEff → SetPSOutlierSigma (новый экспорт libwdsp): MAD- фильтр выбросов перед фитом calcc, авто σ=5.0 для Orion MkII, настройка ps_outlier_sigma (-1 = авто) - лампа FB в поповере: зоны от цели (0.7–1.3× зелёная), подпись «FB: тек/цель» Требует libwdsp с патчами eu2av (форк wdsp, коммит d27684c). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
+40
-8
@@ -507,6 +507,7 @@ type
|
||||
procedure ApplyNoiseFilterButtonsToDSP; // NR/NB/SNB/ANF → WDSP
|
||||
procedure SendDUCSpecificFromSettings; // DUC Specific (mic/keyer/atten) в сеть
|
||||
procedure ApplyTXSettingsToDSP; // TX-цепь (фильтр/gain/EQ/comp/...) → WDSP
|
||||
function PSOutlierSigmaEff: Double; // σ outlier-фильтра calcc (авто по плате)
|
||||
|
||||
// ---- Управление диапазонами (состояние + DSP; рендер через события) ----
|
||||
// MakeBandSettings — снимок текущего состояния в запись диапазона.
|
||||
@@ -756,7 +757,11 @@ type
|
||||
// Вооружение/снятие feedback-тракта (сеть + движок), идемпотентно.
|
||||
procedure PSSetFeedbackPath(En: Boolean);
|
||||
// Статус для UI (кэш последнего PureSignalTick)
|
||||
function PSFeedbackLevel: Integer; // info[4], оптимум ~140-160
|
||||
function PSFeedbackLevel: Integer; // info[4], оптимум ~PSFBTarget
|
||||
// Эффективная цель уровня feedback: настройка ps_fb_target, либо авто по
|
||||
// плате (Orion MkII/ANAN-7000/8000 → 22 — выше перегружается вход ADC,
|
||||
// замеры eu2av на Anvelina PRO3; остальные → 152, классика Thetis).
|
||||
function PSFBTarget: Integer;
|
||||
function PSCalCount: Integer; // info[5]
|
||||
function PSCorrecting: Boolean; // info[14]=1 — коррекция применяется
|
||||
function PSMaxTXVal: Double; // GetPSMaxTX (пик TX для SetPk)
|
||||
@@ -4412,6 +4417,30 @@ begin
|
||||
Changed(rfPureSignal);
|
||||
end;
|
||||
|
||||
function TRadioController.PSFBTarget: Integer;
|
||||
begin
|
||||
Result := FTXSettings.PSFBTarget;
|
||||
if Result <= 0 then
|
||||
begin
|
||||
if FDevConnected and (FNetwork <> nil) and (FNetwork.Device.BoardType = 5) then
|
||||
Result := 22 // Orion MkII: замеры eu2av — при 152 фидбек-АЦП сам даёт IMD
|
||||
else
|
||||
Result := 152; // классическая цель Thetis
|
||||
end;
|
||||
end;
|
||||
|
||||
function TRadioController.PSOutlierSigmaEff: Double;
|
||||
begin
|
||||
Result := FTXSettings.PSOutlierSigma;
|
||||
if Result < 0 then
|
||||
begin
|
||||
if FDevConnected and (FNetwork <> nil) and (FNetwork.Device.BoardType = 5) then
|
||||
Result := 5.0 // Orion MkII: дефолт Thetis-Enhanced eu2av
|
||||
else
|
||||
Result := 0.0; // выключен
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TRadioController.ApplyPSSettingsToDSP;
|
||||
var
|
||||
Ints, Spi: Integer;
|
||||
@@ -4426,7 +4455,7 @@ begin
|
||||
FTXSettings.PSTXDelayNs, FTXSettings.PSRelaxPtol,
|
||||
FTXSettings.PSPin, FTXSettings.PSMap,
|
||||
FTXSettings.PSStabilize, Ints, Spi,
|
||||
FTXSettings.PSHWPeak);
|
||||
FTXSettings.PSHWPeak, PSOutlierSigmaEff);
|
||||
// Правка частот двухтональника при активном 2TON — применяем живьём.
|
||||
if FTwoTone then
|
||||
FDSPEngine.SetTXTwoTone(True, FTXSettings.PSTTFreq1, FTXSettings.PSTTFreq2);
|
||||
@@ -4464,6 +4493,7 @@ procedure TRadioController.PureSignalTick;
|
||||
// + auto-attenuate (timer2code): подстройка AttOnTX по уровню feedback.
|
||||
var
|
||||
NewAtt: Integer;
|
||||
FBTarget: Integer;
|
||||
ddB: Double;
|
||||
CalAttemptsChanged: Boolean;
|
||||
begin
|
||||
@@ -4555,21 +4585,23 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
// --- Auto-attenuate (Thetis timer2code) ---
|
||||
// --- Auto-attenuate (Thetis-Enhanced eu2av timer2code) ---
|
||||
// По завершении очередной попытки калибровки: если feedback слишком горячий
|
||||
// (>181) или слабый при ненулевом атт. (<=128), подстроить AttOnTX так,
|
||||
// чтобы уровень лёг к оптимуму 152.
|
||||
// (>1.5×цели) или слабый при ненулевом атт. (<0.7×цели), подстроить AttOnTX
|
||||
// так, чтобы уровень лёг к цели PSFBTarget (22 на Orion MkII — выше вход
|
||||
// фидбек-АЦП интермодулирует сам, и PS корректирует по искажённому сигналу).
|
||||
FBTarget := PSFBTarget;
|
||||
case FPSAAState of
|
||||
0: begin
|
||||
CalAttemptsChanged := FPSInfo[5] <> FPSInfoPrev[5];
|
||||
if FTXSettings.PSAutoAtten and CalAttemptsChanged
|
||||
and ((FPSInfo[4] > 181) or
|
||||
((FPSInfo[4] <= 128) and (FTXSettings.AttOnTX > 0))) then
|
||||
and ((FPSInfo[4] > Round(FBTarget * 1.5)) or
|
||||
((FPSInfo[4] < Round(FBTarget * 0.7)) and (FTXSettings.AttOnTX > 0))) then
|
||||
begin
|
||||
FPSAAState := 1;
|
||||
if (FPSInfo[4] > 0) and (FPSInfo[4] <= 256) then
|
||||
begin
|
||||
ddB := 20.0 * Log10(FPSInfo[4] / 152.293);
|
||||
ddB := 20.0 * Log10(FPSInfo[4] / FBTarget);
|
||||
if ddB < -100.0 then ddB := -100.0;
|
||||
if ddB > +100.0 then ddB := +100.0;
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user