mirror of
https://git.vladimir.cc/vladimir/ewsdr.git
synced 2026-08-25 18:43:51 +00:00
add nb nr
This commit is contained in:
+158
-10
@@ -55,6 +55,39 @@ const
|
||||
AGC_MEDIUM = 3;
|
||||
AGC_FAST = 4;
|
||||
|
||||
// RX filter modes
|
||||
NR_MODE_OFF = 0;
|
||||
NR_MODE_1 = 1;
|
||||
NR_MODE_2 = 2;
|
||||
NR_MODE_3 = 3;
|
||||
NR_MODE_4 = 4;
|
||||
|
||||
NB_MODE_OFF = 0;
|
||||
NB_MODE_1 = 1;
|
||||
NB_MODE_2 = 2;
|
||||
|
||||
FILTER_NR_AGC_POSITION = 1;
|
||||
FILTER_NB_TAU = 0.00001;
|
||||
FILTER_NB_ADVTIME = 0.00001;
|
||||
FILTER_NB_HANGTIME = 0.00001;
|
||||
FILTER_NB_THRESHOLD = 4.95;
|
||||
FILTER_NB2_MODE = 0;
|
||||
FILTER_NR2_GAIN_METHOD = 2;
|
||||
FILTER_NR2_NPE_METHOD = 0;
|
||||
FILTER_NR2_POST_RUN = 0;
|
||||
FILTER_NR2_POST_TAPER = 12;
|
||||
FILTER_NR2_POST_NLEVEL = 15.0;
|
||||
FILTER_NR2_POST_FACTOR = 15.0;
|
||||
FILTER_NR2_POST_RATE = 5.0;
|
||||
FILTER_NR2_TRAINED_THRESHOLD = -0.5;
|
||||
FILTER_NR2_TRAINED_T2 = 0.2;
|
||||
FILTER_NR4_REDUCTION_AMOUNT = 10.0;
|
||||
FILTER_NR4_SMOOTHING_FACTOR = 20.0;
|
||||
FILTER_NR4_WHITENING_FACTOR = 0.0;
|
||||
FILTER_NR4_NOISE_RESCALE = 2.0;
|
||||
FILTER_NR4_POST_THRESHOLD = -3.0;
|
||||
FILTER_NR4_NOISE_SCALING_TYPE = 0;
|
||||
|
||||
// S-meter types для GetRXAMeter
|
||||
RXA_S_PK = 0; // peak, dBm
|
||||
RXA_S_AV = 1; // average, dBm
|
||||
@@ -140,8 +173,9 @@ type
|
||||
FAGCThresh: Double; // читается из WDSP (GetRXAAGCThresh)
|
||||
FLastSpectrumW: Integer; // последняя известная ширина спектра (пикс)
|
||||
FShiftHz: Double; // NCO shift для CTUN
|
||||
FNREnabled: Boolean;
|
||||
FNBEnabled: Boolean;
|
||||
FNRMode: Integer;
|
||||
FNBMode: Integer;
|
||||
FSNBEnabled: Boolean;
|
||||
FANFEnabled: Boolean;
|
||||
FMuted: Boolean;
|
||||
FVolume: Double;
|
||||
@@ -153,6 +187,11 @@ type
|
||||
procedure PushIQItemToDSP(const Item: TIQQueueItem);
|
||||
procedure OpenAnalyzer;
|
||||
procedure CloseAnalyzer;
|
||||
procedure ApplyNRState;
|
||||
procedure ApplyNBState;
|
||||
procedure ApplySNBState;
|
||||
procedure ApplyANFState;
|
||||
procedure ApplyNoiseFilterState;
|
||||
|
||||
public
|
||||
constructor Create(SampleRate: Integer = 192000;
|
||||
@@ -181,8 +220,11 @@ type
|
||||
procedure UpdateAGCLines(SpectrumW: Integer); // читает hang/thresh из WDSP для линии на спектре
|
||||
procedure SetSpectrumWidth(W: Integer); // обновляет FLastSpectrumW для корректных AGC линий
|
||||
procedure SetShift(ShiftHz: Double); // CTUN NCO сдвиг
|
||||
procedure SetNRMode(Mode: Integer);
|
||||
procedure SetNR(Enable: Boolean);
|
||||
procedure SetNBMode(Mode: Integer);
|
||||
procedure SetNB(Enable: Boolean);
|
||||
procedure SetSNB(Enable: Boolean);
|
||||
procedure SetANF(Enable: Boolean);
|
||||
procedure SetVolume(Vol: Double);
|
||||
procedure SetMute(Mute: Boolean);
|
||||
@@ -212,6 +254,9 @@ type
|
||||
property Mode: Integer read FMode;
|
||||
property FilterLow: Integer read FFilterLow;
|
||||
property FilterHigh: Integer read FFilterHigh;
|
||||
property NRMode: Integer read FNRMode;
|
||||
property NBMode: Integer read FNBMode;
|
||||
property SNBEnabled: Boolean read FSNBEnabled;
|
||||
property LastError: string read FLastError;
|
||||
property SMeter: Double read FSMeter;
|
||||
property OnAudio: TOnAudioReady read FOnAudio write FOnAudio;
|
||||
@@ -317,6 +362,10 @@ begin
|
||||
FAGCTop := -90.0;
|
||||
FVolume := 0.7;
|
||||
FSMeter := -130.0;
|
||||
FNRMode := NR_MODE_OFF;
|
||||
FNBMode := NB_MODE_OFF;
|
||||
FSNBEnabled := False;
|
||||
FANFEnabled := False;
|
||||
FRXAccPos := 0;
|
||||
|
||||
SetLength(FRXIn, FBufSize * 2); // in_size пар @ FSampleRate (4096*2)
|
||||
@@ -438,6 +487,10 @@ begin
|
||||
0
|
||||
);
|
||||
|
||||
create_anbEXT(RXA_CHAN, 1, FBufSize, FSampleRate, 0.0001, 0.0001, 0.0001, 0.05, 20);
|
||||
create_nobEXT(RXA_CHAN, 1, 0, FBufSize, FSampleRate, 0.0001, 0.0001, 0.0001, 0.05, 20);
|
||||
|
||||
SetRXABandpassWindow(RXA_CHAN, 1);
|
||||
SetRXAMode(RXA_CHAN, ModeToWDSP(FMode));
|
||||
SetRXAShiftRun(RXA_CHAN, 1);
|
||||
SetRXAShiftFreq(RXA_CHAN, 0.0);
|
||||
@@ -474,6 +527,7 @@ begin
|
||||
SetTXAPanelSelect(TXA_CHAN, 1);
|
||||
|
||||
FInitialized := True;
|
||||
ApplyNoiseFilterState;
|
||||
Result := True;
|
||||
|
||||
// Запускаем DSP поток после успешной инициализации WDSP
|
||||
@@ -505,6 +559,8 @@ begin
|
||||
end;
|
||||
|
||||
CloseAnalyzer;
|
||||
destroy_anbEXT(RXA_CHAN);
|
||||
destroy_nobEXT(RXA_CHAN);
|
||||
CloseChannel(RXA_CHAN);
|
||||
CloseChannel(TXA_CHAN);
|
||||
FInitialized := False;
|
||||
@@ -760,25 +816,117 @@ begin
|
||||
FSampleRate);
|
||||
end;
|
||||
|
||||
procedure TWDSPEngine.ApplyNRState;
|
||||
begin
|
||||
if not FInitialized then Exit;
|
||||
|
||||
SetRXAANRVals(RXA_CHAN, 64, 16, 16e-4, 10e-7);
|
||||
SetRXAANRPosition(RXA_CHAN, FILTER_NR_AGC_POSITION);
|
||||
SetRXAANRRun(RXA_CHAN, Ord(FNRMode = NR_MODE_1));
|
||||
|
||||
SetRXAEMNRPosition(RXA_CHAN, FILTER_NR_AGC_POSITION);
|
||||
SetRXAEMNRgainMethod(RXA_CHAN, FILTER_NR2_GAIN_METHOD);
|
||||
SetRXAEMNRnpeMethod(RXA_CHAN, FILTER_NR2_NPE_METHOD);
|
||||
SetRXAEMNRtrainZetaThresh(RXA_CHAN, FILTER_NR2_TRAINED_THRESHOLD);
|
||||
SetRXAEMNRtrainT2(RXA_CHAN, FILTER_NR2_TRAINED_T2);
|
||||
SetRXAEMNRpost2Taper(RXA_CHAN, FILTER_NR2_POST_TAPER);
|
||||
SetRXAEMNRpost2Nlevel(RXA_CHAN, FILTER_NR2_POST_NLEVEL);
|
||||
SetRXAEMNRpost2Factor(RXA_CHAN, FILTER_NR2_POST_FACTOR);
|
||||
SetRXAEMNRpost2Rate(RXA_CHAN, FILTER_NR2_POST_RATE);
|
||||
SetRXAEMNRaeRun(RXA_CHAN, 1);
|
||||
SetRXAEMNRpost2Run(RXA_CHAN, FILTER_NR2_POST_RUN);
|
||||
SetRXAEMNRRun(RXA_CHAN, Ord(FNRMode = NR_MODE_2));
|
||||
|
||||
SetRXARNNRPosition(RXA_CHAN, FILTER_NR_AGC_POSITION);
|
||||
SetRXARNNRRun(RXA_CHAN, Ord(FNRMode = NR_MODE_3));
|
||||
|
||||
SetRXASBNRreductionAmount(RXA_CHAN, FILTER_NR4_REDUCTION_AMOUNT);
|
||||
SetRXASBNRsmoothingFactor(RXA_CHAN, FILTER_NR4_SMOOTHING_FACTOR);
|
||||
SetRXASBNRwhiteningFactor(RXA_CHAN, FILTER_NR4_WHITENING_FACTOR);
|
||||
SetRXASBNRnoiseRescale(RXA_CHAN, FILTER_NR4_NOISE_RESCALE);
|
||||
SetRXASBNRpostFilterThreshold(RXA_CHAN, FILTER_NR4_POST_THRESHOLD);
|
||||
SetRXASBNRnoiseScalingType(RXA_CHAN, FILTER_NR4_NOISE_SCALING_TYPE);
|
||||
SetRXASBNRPosition(RXA_CHAN, FILTER_NR_AGC_POSITION);
|
||||
SetRXASBNRRun(RXA_CHAN, Ord(FNRMode = NR_MODE_4));
|
||||
end;
|
||||
|
||||
procedure TWDSPEngine.ApplyNBState;
|
||||
begin
|
||||
if not FInitialized then Exit;
|
||||
|
||||
SetEXTANBTau(RXA_CHAN, FILTER_NB_TAU);
|
||||
SetEXTANBHangtime(RXA_CHAN, FILTER_NB_HANGTIME);
|
||||
SetEXTANBAdvtime(RXA_CHAN, FILTER_NB_ADVTIME);
|
||||
SetEXTANBThreshold(RXA_CHAN, FILTER_NB_THRESHOLD);
|
||||
SetEXTANBRun(RXA_CHAN, Ord(FNBMode = NB_MODE_1));
|
||||
|
||||
SetEXTNOBMode(RXA_CHAN, FILTER_NB2_MODE);
|
||||
SetEXTNOBTau(RXA_CHAN, FILTER_NB_TAU);
|
||||
SetEXTNOBHangtime(RXA_CHAN, FILTER_NB_HANGTIME);
|
||||
SetEXTNOBAdvtime(RXA_CHAN, FILTER_NB_ADVTIME);
|
||||
SetEXTNOBThreshold(RXA_CHAN, FILTER_NB_THRESHOLD);
|
||||
SetEXTNOBRun(RXA_CHAN, Ord(FNBMode = NB_MODE_2));
|
||||
end;
|
||||
|
||||
procedure TWDSPEngine.ApplySNBState;
|
||||
begin
|
||||
if not FInitialized then Exit;
|
||||
SetRXASNBARun(RXA_CHAN, Ord(FSNBEnabled));
|
||||
end;
|
||||
|
||||
procedure TWDSPEngine.ApplyANFState;
|
||||
begin
|
||||
if not FInitialized then Exit;
|
||||
SetRXAANFPosition(RXA_CHAN, FILTER_NR_AGC_POSITION);
|
||||
SetRXAANFRun(RXA_CHAN, Ord(FANFEnabled));
|
||||
end;
|
||||
|
||||
procedure TWDSPEngine.ApplyNoiseFilterState;
|
||||
begin
|
||||
ApplyNRState;
|
||||
ApplyNBState;
|
||||
ApplySNBState;
|
||||
ApplyANFState;
|
||||
end;
|
||||
|
||||
procedure TWDSPEngine.SetNRMode(Mode: Integer);
|
||||
begin
|
||||
if Mode < NR_MODE_OFF then Mode := NR_MODE_OFF;
|
||||
if Mode > NR_MODE_4 then Mode := NR_MODE_4;
|
||||
FNRMode := Mode;
|
||||
ApplyNRState;
|
||||
end;
|
||||
|
||||
procedure TWDSPEngine.SetNR(Enable: Boolean);
|
||||
begin
|
||||
FNREnabled := Enable;
|
||||
if not FInitialized then Exit;
|
||||
SetRXAEMNRRun(RXA_CHAN, Ord(Enable));
|
||||
if Enable then SetNRMode(NR_MODE_1)
|
||||
else SetNRMode(NR_MODE_OFF);
|
||||
end;
|
||||
|
||||
procedure TWDSPEngine.SetNBMode(Mode: Integer);
|
||||
begin
|
||||
if Mode < NB_MODE_OFF then Mode := NB_MODE_OFF;
|
||||
if Mode > NB_MODE_2 then Mode := NB_MODE_2;
|
||||
FNBMode := Mode;
|
||||
ApplyNBState;
|
||||
end;
|
||||
|
||||
procedure TWDSPEngine.SetNB(Enable: Boolean);
|
||||
begin
|
||||
FNBEnabled := Enable;
|
||||
if not FInitialized then Exit;
|
||||
SetEXTANBRun(RXA_CHAN, Ord(Enable));
|
||||
if Enable then SetNBMode(NB_MODE_1)
|
||||
else SetNBMode(NB_MODE_OFF);
|
||||
end;
|
||||
|
||||
procedure TWDSPEngine.SetSNB(Enable: Boolean);
|
||||
begin
|
||||
FSNBEnabled := Enable;
|
||||
ApplySNBState;
|
||||
end;
|
||||
|
||||
procedure TWDSPEngine.SetANF(Enable: Boolean);
|
||||
begin
|
||||
FANFEnabled := Enable;
|
||||
if not FInitialized then Exit;
|
||||
SetRXAANFRun(RXA_CHAN, Ord(Enable));
|
||||
ApplyANFState;
|
||||
end;
|
||||
|
||||
procedure TWDSPEngine.SetVolume(Vol: Double);
|
||||
|
||||
Reference in New Issue
Block a user