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
+14 -8
View File
@@ -97,8 +97,9 @@ const
CLR_INPUT = TColor($00FFFFFF);
CLR_INPUT_TEXT = TColor($00202020);
// Лампа feedback (пороги Thetis: >181 горячо, 129..181 оптимум, 91..128
// слабовато, <=90 нет сигнала). TColor = BGR.
// Лампа feedback пороги от цели PSFBTarget (Thetis-Enhanced eu2av):
// >1.5×цели горячо, 0.7..1.3×цели оптимум, 0.5×..0.7× слабовато, ниже — нет
// сигнала. TColor = BGR.
CLR_FB_HOT = TColor($00FF9030); // голубой: слишком горячо (атт. мал)
CLR_FB_OK = TColor($0000FF00); // зелёный: оптимум
CLR_FB_LOW = TColor($0000FFFF); // жёлтый: слабовато
@@ -382,7 +383,7 @@ end;
procedure TPureSignalPopup.RefreshStatus;
var
FB: Integer;
FB, FBTarget: Integer;
LampClr: TColor;
begin
if (FController = nil) or not Visible then Exit;
@@ -394,17 +395,22 @@ begin
FBtn2Ton.Active := FController.FTwoTone;
FB := FController.PSFeedbackLevel;
FBTarget := FController.PSFBTarget;
if FController.FPSFeedbackOn then
begin
if FB > 181 then LampClr := CLR_FB_HOT
else if FB > 128 then LampClr := CLR_FB_OK
else if FB > 90 then LampClr := CLR_FB_LOW
else LampClr := CLR_FB_NONE;
if FB > Round(FBTarget * 1.5) then LampClr := CLR_FB_HOT
else if FB >= Round(FBTarget * 0.7) then
begin
if FB <= Round(FBTarget * 1.3) then LampClr := CLR_FB_OK
else LampClr := CLR_FB_LOW // 1.3..1.5×: желтовато
end
else if FB >= Round(FBTarget * 0.5) then LampClr := CLR_FB_LOW
else LampClr := CLR_FB_NONE;
end
else
LampClr := CLR_LAMP_OFF;
if FFbLamp.Color <> LampClr then FFbLamp.Color := LampClr;
FLbFbVal.Caption := Format('FB: %d', [FB]);
FLbFbVal.Caption := Format('FB: %d/%d', [FB, FBTarget]);
if FController.PSCorrecting then
begin