fix(dmr): use flat discriminator and reject noise sync

This commit is contained in:
2026-07-14 19:30:43 +03:00
parent 300bc91a46
commit a19c82a214
3 changed files with 118 additions and 10 deletions
+19 -5
View File
@@ -60,7 +60,7 @@ const
MODE_DIGU = 8;
MODE_DIGL = 9;
MODE_WFM = 10;
MODE_DMR = 11; // DMR receive: WDSP NFM discriminator -> DMRDecoder
MODE_DMR = 11; // DMR receive: flat WDSP discriminator -> DMRDecoder
// Минимальная длина FIR у WDSP: create_* поднимают fircore с
// nc = max(2048, dsp_size). В firmin.c nfor = nc / size, idxmask = nfor - 1,
@@ -73,6 +73,7 @@ const
WFM_AF_LOW = 20.0;
WFM_AF_HIGH = 15000.0;
WFM_TAU_DE_US = 50.0e-6; // Европа/Россия (Америка — 75 мкс)
DMR_DEVIATION = 2500.0;
// Потолок dsp_rate для WFM. Вещательному каналу (200 кГц) хватает 192 кГц,
// а гнать цепь на полном IQ-rate нельзя: при 576 кГц dsp_size стал бы 12288,
// и fircore спланировал бы FFT на 2*12288 = 24576 точек. Это не степень
@@ -933,7 +934,10 @@ begin
MODE_DIGU: Result := WDSP_DIGU;
MODE_DIGL: Result := WDSP_DIGL;
MODE_WFM: Result := WDSP_RX_WFM;
MODE_DMR: Result := WDSP_FM;
// The narrow-FM path always applies its 300..3000 Hz speech filters and
// de-emphasis. Those filters collapse the four DMR discriminator levels.
// WFMD is a plain quadrature discriminator and permits flat data audio.
MODE_DMR: Result := WDSP_RX_WFM;
else Result := WDSP_USB;
end;
end;
@@ -942,7 +946,8 @@ function TWDSPEngine.ModeToWDSPTX(Mode: Integer): Integer;
// txaMode расходится с rxaMode после DRM — отдельный маппинг только для WFM.
begin
if Mode = MODE_WFM then Result := WDSP_TX_WFM
else Result := ModeToWDSP(Mode);
else if Mode = MODE_DMR then Result := WDSP_FM
else Result := ModeToWDSP(Mode);
end;
function TWDSPEngine.WantWideDSP(Mode: Integer): Boolean;
@@ -2693,7 +2698,13 @@ begin
ApplyDSPRate(Mode);
SetRXAMode(RXA_CHAN, ModeToWDSP(Mode));
SetTXAMode(TXA_CHAN, ModeToWDSPTX(Mode));
if Mode = MODE_WFM then ApplyWFMSettings;
if Mode = MODE_WFM then ApplyWFMSettings
else if Mode = MODE_DMR then
begin
SetRXAWFMDeviation (RXA_CHAN, DMR_DEVIATION);
SetRXAWFMAFFilter (RXA_CHAN, 20.0, 7000.0);
SetRXAWFMDeemphRun (RXA_CHAN, 0);
end;
// НЕ вызываем ApplyDefaultFilter — фильтр устанавливается явно из UI
end;
@@ -2929,7 +2940,10 @@ end;
procedure TWDSPEngine.SetRXFMDeviation(Deviation: Double);
begin
if not FInitialized then Exit;
SetRXAFMDeviation(RXA_CHAN, Deviation);
if FMode = MODE_DMR then
SetRXAWFMDeviation(RXA_CHAN, Deviation)
else
SetRXAFMDeviation(RXA_CHAN, Deviation);
end;
procedure TWDSPEngine.SetFMSquelch(Enable: Boolean; Level: Integer);