mirror of
https://git.vladimir.cc/vladimir/ewsdr.git
synced 2026-08-25 20:37:33 +00:00
fix(dmr): use flat discriminator and reject noise sync
This commit is contained in:
+19
-5
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user