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:
2026-07-17 23:01:08 +03:00
co-authored by Claude Fable 5
parent 6a9aebc23c
commit 7a999c95ee
5 changed files with 75 additions and 18 deletions
+7 -2
View File
@@ -404,6 +404,7 @@ type
FPSInts: Integer;
FPSSpi: Integer;
FPSHWPeak: Double;
FPSOutlierSigma: Double; // eu2av MAD-фильтр перед фитом; 0 = выкл.
// Кэшированные TX-параметры — применяются после OpenChannel(TXA) и при изменении.
// Для Filter/Compressor/Leveler/ALC/PhaseRot/EQ/AM/FM/CTCSS.
@@ -668,7 +669,8 @@ type
function PSGetMaxTX: Double;
procedure PSSetParams(MoxDelay, LoopDelay: Double; TXDelayNs: Integer;
RelaxPtol: Boolean; Pin, Map, Stabilize: Boolean;
Ints, Spi: Integer; HWPeak: Double);
Ints, Spi: Integer; HWPeak: Double;
OutlierSigma: Double);
// Расширенное TX управление (применяются мгновенно если канал открыт)
procedure SetTXFilterFull(Low, High, NC, MP, Window: Integer);
@@ -1318,6 +1320,7 @@ begin
FPSInts := 16;
FPSSpi := 256;
FPSHWPeak := 0.2899; // протокол 2 (Saturn: 0.6121)
FPSOutlierSigma := 0.0; // выкл. до ApplyPSSettingsToDSP (авто по плате)
FMonitorRXDuringTX := False;
FPostTXMuteUntil := 0;
FActiveDisplayID := RX_DISP_ID;
@@ -3549,11 +3552,12 @@ begin
SetPSStabilize(TXA_CHAN, Ord(FPSStabilize));
SetPSIntsAndSpi(TXA_CHAN, FPSInts, FPSSpi);
SetPSHWPeak(TXA_CHAN, FPSHWPeak);
SetPSOutlierSigma(TXA_CHAN, FPSOutlierSigma);
end;
procedure TWDSPEngine.PSSetParams(MoxDelay, LoopDelay: Double; TXDelayNs: Integer;
RelaxPtol: Boolean; Pin, Map, Stabilize: Boolean; Ints, Spi: Integer;
HWPeak: Double);
HWPeak: Double; OutlierSigma: Double);
begin
FPSMoxDelay := MoxDelay;
FPSLoopDelay := LoopDelay;
@@ -3565,6 +3569,7 @@ begin
if Ints > 0 then FPSInts := Ints;
if Spi > 0 then FPSSpi := Spi;
if HWPeak > 0 then FPSHWPeak := HWPeak;
if OutlierSigma >= 0 then FPSOutlierSigma := OutlierSigma;
ApplyPSParams;
end;