Add WFM (broadcast FM) demodulator support

Wires the new wdsp WFM API into the engine and adds a WFM preset to the
FM filter row (200 kHz BW / 75 kHz deviation). Also fixes WDSP_SAM
constant which was 12 — that slot is now RXA_WFM in the updated enum.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-05-31 22:40:24 +03:00
co-authored by Claude Opus 4.7
parent 83ec28f997
commit e52e32dc20
3 changed files with 82 additions and 25 deletions
+32 -2
View File
@@ -36,7 +36,8 @@ const
WDSP_CWU = 4;
WDSP_FM = 5;
WDSP_AM = 6;
WDSP_SAM = 12;
WDSP_SAM = 10;
WDSP_WFM = 12;
// Наши индексы режимов (совпадают с кнопками MainForm)
MODE_LSB = 0;
@@ -277,6 +278,8 @@ type
FSMeter: Double;
FFilterLow: Integer;
FFilterHigh: Integer;
FWFMEnabled: Boolean; // переключатель: при MODE_FM использовать RXA_WFM вместо RXA_FM
FWFMDeviation: Double; // девиация для широкополосного WFM (например, 75 кГц)
FAGCMode: TWDSPAGCMode;
FAGCTop: Double; // gain (dB) = agc_gain в piHPSDR
FAGCSlope: Integer; // наклон АРУ в дБ (default 0)
@@ -361,6 +364,8 @@ type
procedure SetSNB(Enable: Boolean);
procedure SetANF(Enable: Boolean);
procedure SetRXFMDeviation(Deviation: Double);
procedure SetWFMMode(Enabled: Boolean);
procedure SetRXWFMDeviation(Deviation: Double);
procedure SetFMSquelch(Enable: Boolean; Level: Integer);
procedure SetVolume(Vol: Double);
procedure SetMute(Mute: Boolean);
@@ -690,7 +695,7 @@ begin
MODE_DSB: Result := WDSP_DSB;
MODE_CWL: Result := WDSP_CWL;
MODE_CWU: Result := WDSP_CWU;
MODE_FM: Result := WDSP_FM;
MODE_FM: if FWFMEnabled then Result := WDSP_WFM else Result := WDSP_FM;
MODE_AM: Result := WDSP_AM;
MODE_SAM: Result := WDSP_SAM;
else Result := WDSP_USB;
@@ -828,6 +833,8 @@ begin
FTXEQFreqs[10] := 3500;
FTXAMCarrier := 0.5;
FTXFMDeviation := 5000.0;
FWFMEnabled := False;
FWFMDeviation := 75000.0;
FTXFMLowCut := 300;
FTXFMHighCut := 3000;
FTXFMEmphPos := 1;
@@ -1539,6 +1546,29 @@ begin
SetRXAFMDeviation(RXA_CHAN, Deviation);
end;
// Переключает RXA-демодулятор между узкополосным FM (RXA_FM) и широкополосным
// WFM (RXA_WFM, broadcast 88..108 МГц со стерео и RDS). Срабатывает только при
// FMode = MODE_FM; в других режимах флаг просто запоминается до перехода в FM.
procedure TWDSPEngine.SetWFMMode(Enabled: Boolean);
begin
if FWFMEnabled = Enabled then Exit;
FWFMEnabled := Enabled;
if not FInitialized then Exit;
if FMode = MODE_FM then
begin
SetRXAMode(RXA_CHAN, ModeToWDSP(FMode));
if Enabled then
SetRXAWFMDeviation(RXA_CHAN, FWFMDeviation);
end;
end;
procedure TWDSPEngine.SetRXWFMDeviation(Deviation: Double);
begin
FWFMDeviation := Deviation;
if not FInitialized then Exit;
SetRXAWFMDeviation(RXA_CHAN, Deviation);
end;
procedure TWDSPEngine.SetFMSquelch(Enable: Boolean; Level: Integer);
var Threshold: Double;
begin