mirror of
https://git.vladimir.cc/vladimir/ewsdr.git
synced 2026-08-25 20:37:33 +00:00
fix fft, waterfall
This commit is contained in:
+143
-169
@@ -35,9 +35,9 @@ type
|
||||
const BandCal: array of Double) of object;
|
||||
|
||||
TOnDisplayParamChange = procedure(FFTSize, WindowType, SpecDetector,
|
||||
SpecAvgMode, SpecAvgCount: Integer; SpecBackmult: Double) of object;
|
||||
TOnWaterfallParamChange = procedure(WfDetector, WfAvgMode, WfAvgCount: Integer;
|
||||
WfBackmult: Double) of object;
|
||||
SpecAvgMode: Integer; SpecAvgTimeMS: Double) of object;
|
||||
TOnWaterfallParamChange = procedure(WfDetector, WfAvgMode: Integer;
|
||||
WfAvgTimeMS, WfHigh, WfLow, WfAGCOffset: Double) of object;
|
||||
TOnGridParamChange = procedure(RefLevel, Range, GridStep: Double) of object;
|
||||
TOnAudioDevChange = procedure(DevIndex: Integer; const DevName: string) of object;
|
||||
TOnAudioInDevChange = procedure(DevIndex: Integer; const DevName: string) of object;
|
||||
@@ -79,13 +79,14 @@ type
|
||||
// Spectrum group
|
||||
FCmbSpecDet: TComboBox;
|
||||
FCmbSpecAvg: TComboBox;
|
||||
FSpinSpecCount: TSpinEdit;
|
||||
FEdSpecBackmult: TEdit;
|
||||
FSpecAvgTime: TFloatSpinEdit;
|
||||
// Waterfall group
|
||||
FCmbWfDet: TComboBox;
|
||||
FCmbWfAvg: TComboBox;
|
||||
FSpinWfCount: TSpinEdit;
|
||||
FEdWfBackmult: TEdit;
|
||||
FWfAvgTime: TFloatSpinEdit;
|
||||
FWfHigh: TFloatSpinEdit;
|
||||
FWfLow: TFloatSpinEdit;
|
||||
FWfAGCOffset: TFloatSpinEdit;
|
||||
// Grid group
|
||||
FEdRefLevel: TEdit;
|
||||
FEdRange: TEdit;
|
||||
@@ -136,12 +137,11 @@ type
|
||||
procedure OnWindowChange(Sender: TObject);
|
||||
procedure OnSpecDetChange(Sender: TObject);
|
||||
procedure OnSpecAvgModeChange(Sender: TObject);
|
||||
procedure OnSpecCountChange(Sender: TObject);
|
||||
procedure OnSpecBackmultChange(Sender: TObject);
|
||||
procedure OnSpecAvgTimeChange(Sender: TObject);
|
||||
procedure OnWfDetChange(Sender: TObject);
|
||||
procedure OnWfAvgModeChange(Sender: TObject);
|
||||
procedure OnWfCountChange(Sender: TObject);
|
||||
procedure OnWfBackmultChange(Sender: TObject);
|
||||
procedure OnWfAvgTimeChange(Sender: TObject);
|
||||
procedure OnWfThresholdChange(Sender: TObject);
|
||||
procedure OnRefLevelChange(Sender: TObject);
|
||||
procedure OnRangeChange(Sender: TObject);
|
||||
procedure OnGridStepChange(Sender: TObject);
|
||||
@@ -157,8 +157,11 @@ type
|
||||
procedure FireWaterfallChange;
|
||||
procedure FireGridChange;
|
||||
|
||||
function GetSpecBackmult: Double;
|
||||
function GetWfBackmult: Double;
|
||||
function GetSpecAvgTimeMS: Double;
|
||||
function GetWfAvgTimeMS: Double;
|
||||
function GetWfHigh: Double;
|
||||
function GetWfLow: Double;
|
||||
function GetWfAGCOffset: Double;
|
||||
function GetRefLevel: Double;
|
||||
function GetRange: Double;
|
||||
function GetGridStep: Double;
|
||||
@@ -169,10 +172,10 @@ type
|
||||
|
||||
// Заполнить элементы управления текущими значениями (без firing events)
|
||||
procedure LoadValues(
|
||||
FFTSize, WinType, SpecDet, SpecAvgMode, SpecAvgCount: Integer;
|
||||
SpecBackmult: Double;
|
||||
WfDet, WfAvgMode, WfAvgCount: Integer;
|
||||
WfBackmult: Double;
|
||||
FFTSize, WinType, SpecDet, SpecAvgMode: Integer;
|
||||
SpecAvgTimeMS: Double;
|
||||
WfDet, WfAvgMode: Integer;
|
||||
WfAvgTimeMS, WfHigh, WfLow, WfAGCOffset: Double;
|
||||
RefLevel, Range, GridStep: Double;
|
||||
const AudioOutDevName: string;
|
||||
const AudioInDevName: string);
|
||||
@@ -208,9 +211,8 @@ const
|
||||
CLR_ACCENT = TColor($0040FF80);
|
||||
BTN_H = 24;
|
||||
|
||||
// FFT sizes (index → value)
|
||||
FFT_SIZES: array[0..5] of Integer = (1024, 2048, 4096, 8192, 16384, 32768);
|
||||
FFT_NAMES: array[0..5] of string = ('1024','2048','4096','8192','16384','32768');
|
||||
FFT_SIZES: array[0..6] of Integer = (4096, 8192, 16384, 32768, 65536, 131072, 262144);
|
||||
FFT_NAMES: array[0..6] of string = ('4096','8192','16384','32768','65536','131072','262144');
|
||||
|
||||
WINDOW_NAMES: array[0..6] of string = (
|
||||
'Rectangular', '4-term Blackman-Harris', 'Hann',
|
||||
@@ -219,17 +221,19 @@ const
|
||||
DETECTOR_NAMES: array[0..4] of string = (
|
||||
'Peak', 'Rosenfell', 'Average', 'Sample', 'RMS');
|
||||
|
||||
AVGMODE_NAMES: array[0..4] of string = (
|
||||
'Peak Hold', 'None', 'Recursive', 'Time Window', 'Log Recursive');
|
||||
// Note: AVERAGE_PEAK_HOLD=-1, NONE=0, RECURSIVE=1, TIME_WINDOW=2, LOG_RECURSIVE=3
|
||||
// Index → WDSP value mapping: 0→-1, 1→0, 2→1, 3→2, 4→3
|
||||
AVGMODE_VALUES: array[0..4] of Integer = (-1, 0, 1, 2, 3);
|
||||
AVGMODE_NAMES: array[0..3] of string = (
|
||||
'None', 'Recursive', 'Time Window', 'Log Recursive');
|
||||
AVGMODE_VALUES: array[0..3] of Integer = (0, 1, 2, 3);
|
||||
WF_AVGMODE_NAMES: array[0..3] of string = (
|
||||
'None', 'Recursive', 'Time Window', 'Log Recursive');
|
||||
WF_AVGMODE_VALUES: array[0..3] of Integer = (0, 1, 2, 3);
|
||||
|
||||
GRID_STEPS: array[0..4] of Double = (5.0, 10.0, 20.0, 30.0, 40.0);
|
||||
GRID_STEP_NAMES: array[0..4] of string = ('5 dB','10 dB','20 dB','30 dB','40 dB');
|
||||
|
||||
FPS_VALUES: array[0..5] of Integer = (5, 10, 15, 20, 25, 30);
|
||||
FPS_NAMES: array[0..5] of string = ('5 fps','10 fps','15 fps','20 fps','25 fps','30 fps');
|
||||
FPS_VALUES: array[0..12] of Integer = (5, 10, 15, 20, 25, 30, 40, 50, 60, 75, 80, 90, 100);
|
||||
FPS_NAMES: array[0..12] of string = ('5 fps','10 fps','15 fps','20 fps','25 fps','30 fps',
|
||||
'40 fps','50 fps','60 fps','75 fps','80 fps','90 fps','100 fps');
|
||||
|
||||
PA_BAND_NAMES: array[0..10] of string =
|
||||
('160m','80m','60m','40m','30m','20m','17m','15m','12m','10m','6m');
|
||||
@@ -240,8 +244,8 @@ constructor TSettingsForm.Create(AOwner: TComponent);
|
||||
begin
|
||||
inherited CreateNew(AOwner);
|
||||
Caption := 'Settings';
|
||||
Width := 700;
|
||||
Height := 560;
|
||||
Width := 760;
|
||||
Height := 640;
|
||||
Position := poScreenCenter;
|
||||
BorderStyle := bsSizeable;
|
||||
Color := CLR_BG;
|
||||
@@ -457,31 +461,20 @@ begin
|
||||
end;
|
||||
|
||||
procedure TSettingsForm.BuildRX1Tab;
|
||||
// Layout (alTop stack in FTabDispRX1):
|
||||
// 8px top padding
|
||||
// FFT group — full width
|
||||
// 12px separator
|
||||
// PnlMid — Spectrum (alLeft) | 10px gap | Waterfall (alClient), same height
|
||||
// 12px separator
|
||||
// Spectrum Grid group — full width
|
||||
// hint (alBottom)
|
||||
//
|
||||
// Row step: STEP = BTN_H + 10 = 34px. Inner padding: R1 = 10.
|
||||
const
|
||||
R1 = 10; // top padding inside groups
|
||||
LX = 10; // left margin inside group
|
||||
LW = 88; // label column width
|
||||
CX = LX + LW + 4; // combo/edit column start (= 102)
|
||||
STEP = BTN_H + 10; // row step (= 34)
|
||||
SEP = 12; // gap between groups
|
||||
COLW = 328; // left column panel width
|
||||
COLGAP = 10; // horizontal gap between columns
|
||||
GH2 = 100; // GroupBox height for 2-row groups
|
||||
GH3 = 136; // GroupBox height for 3-row groups
|
||||
R1 = 12;
|
||||
LX = 12;
|
||||
LW = 112;
|
||||
CX = LX + LW + 8;
|
||||
STEP = 34;
|
||||
SEP = 12;
|
||||
GH_FFT = 100;
|
||||
GH_SPEC = 136;
|
||||
GH_WF = 170;
|
||||
GH_GRID = 100;
|
||||
var
|
||||
PnlFFT, PnlMid, PnlL, PnlSepH, PnlR: TPanel;
|
||||
PnlFFT, PnlSpec, PnlWF: TPanel;
|
||||
Grp: TGroupBox;
|
||||
Lbl: TLabel;
|
||||
i: Integer;
|
||||
|
||||
function MkGrp(AParent: TWinControl; const Cap: string; AH: Integer): TGroupBox;
|
||||
@@ -508,28 +501,17 @@ var
|
||||
S.Height := AH;
|
||||
end;
|
||||
|
||||
function MkEdit(AParent: TWinControl; AX, AY, AW: Integer;
|
||||
AOnExit: TNotifyEvent): TEdit;
|
||||
function MkFloat(AParent: TWinControl; AX, AY, AW: Integer; AValue: Double;
|
||||
AMin, AMax, AInc: Double; AOnChange: TNotifyEvent): TFloatSpinEdit;
|
||||
begin
|
||||
Result := TEdit.Create(Self);
|
||||
Result := TFloatSpinEdit.Create(Self);
|
||||
Result.Parent := AParent;
|
||||
Result.SetBounds(AX, AY, AW, BTN_H);
|
||||
Result.Color := CLR_PANEL;
|
||||
Result.Font.Color := CLR_TEXT;
|
||||
Result.Font.Name := 'Courier New';
|
||||
Result.Font.Size := 8;
|
||||
Result.OnExit := AOnExit;
|
||||
end;
|
||||
|
||||
function MkSpin(AParent: TWinControl; AX, AY, AW: Integer;
|
||||
AOnChange: TNotifyEvent): TSpinEdit;
|
||||
begin
|
||||
Result := TSpinEdit.Create(Self);
|
||||
Result.Parent := AParent;
|
||||
Result.SetBounds(AX, AY, AW, BTN_H);
|
||||
Result.MinValue := 1;
|
||||
Result.MaxValue := 256;
|
||||
Result.Value := 2;
|
||||
Result.Value := AValue;
|
||||
Result.MinValue := AMin;
|
||||
Result.MaxValue := AMax;
|
||||
Result.Increment := AInc;
|
||||
Result.DecimalPlaces := 1;
|
||||
Result.Color := CLR_PANEL;
|
||||
Result.Font.Color := CLR_TEXT;
|
||||
Result.Font.Name := 'Courier New';
|
||||
@@ -538,24 +520,15 @@ var
|
||||
end;
|
||||
|
||||
begin
|
||||
// Hint at bottom (added first so alBottom is honoured by later alTop panels)
|
||||
Lbl := MakeLbl(FTabDispRX1,
|
||||
'Backmult: higher value = slower decay (range 0.0 .. 1.0)', LX, 0, 0);
|
||||
Lbl.Align := alBottom;
|
||||
Lbl.Height := 22;
|
||||
Lbl.Font.Color := CLR_TEXTDIM;
|
||||
|
||||
// ── Top padding ───────────────────────────────────────────────────────────
|
||||
MkSep(FTabDispRX1, 8);
|
||||
|
||||
// ── FFT (full width, alTop) ───────────────────────────────────────────────
|
||||
PnlFFT := TPanel.Create(Self);
|
||||
PnlFFT.Parent := FTabDispRX1;
|
||||
PnlFFT.BevelOuter := bvNone;
|
||||
PnlFFT.Color := CLR_BG;
|
||||
PnlFFT.Align := alTop;
|
||||
PnlFFT.Height := GH2;
|
||||
Grp := MkGrp(PnlFFT, 'FFT', GH2);
|
||||
PnlFFT.Height := GH_FFT;
|
||||
Grp := MkGrp(PnlFFT, 'FFT / Analyzer', GH_FFT);
|
||||
MakeLbl(Grp, 'FFT Size:', LX, R1+4, LW);
|
||||
FCmbFFTSize := MakeCombo(Grp, CX, R1, 130, OnFFTSizeChange);
|
||||
for i := 0 to High(FFT_NAMES) do FCmbFFTSize.Items.Add(FFT_NAMES[i]);
|
||||
@@ -563,75 +536,70 @@ begin
|
||||
FCmbWindow := MakeCombo(Grp, CX, R1+STEP, 250, OnWindowChange);
|
||||
for i := 0 to High(WINDOW_NAMES) do FCmbWindow.Items.Add(WINDOW_NAMES[i]);
|
||||
|
||||
// ── Separator ─────────────────────────────────────────────────────────────
|
||||
MkSep(FTabDispRX1, SEP);
|
||||
|
||||
// ── Middle row: Spectrum (left) | Waterfall (right) at the same level ─────
|
||||
PnlMid := TPanel.Create(Self);
|
||||
PnlMid.Parent := FTabDispRX1;
|
||||
PnlMid.BevelOuter := bvNone;
|
||||
PnlMid.Color := CLR_BG;
|
||||
PnlMid.Align := alTop;
|
||||
PnlMid.Height := GH3;
|
||||
|
||||
PnlL := TPanel.Create(Self);
|
||||
PnlL.Parent := PnlMid;
|
||||
PnlL.BevelOuter := bvNone;
|
||||
PnlL.Color := CLR_BG;
|
||||
PnlL.Align := alLeft;
|
||||
PnlL.Width := COLW;
|
||||
|
||||
PnlSepH := TPanel.Create(Self);
|
||||
PnlSepH.Parent := PnlMid;
|
||||
PnlSepH.BevelOuter := bvNone;
|
||||
PnlSepH.Color := CLR_BG;
|
||||
PnlSepH.Align := alLeft;
|
||||
PnlSepH.Width := COLGAP;
|
||||
|
||||
PnlR := TPanel.Create(Self);
|
||||
PnlR.Parent := PnlMid;
|
||||
PnlR.BevelOuter := bvNone;
|
||||
PnlR.Color := CLR_BG;
|
||||
PnlR.Align := alClient;
|
||||
|
||||
// ── Spectrum (left column) ────────────────────────────────────────────────
|
||||
Grp := MkGrp(PnlL, 'Spectrum', GH3);
|
||||
PnlSpec := TPanel.Create(Self);
|
||||
PnlSpec.Parent := FTabDispRX1;
|
||||
PnlSpec.BevelOuter := bvNone;
|
||||
PnlSpec.Color := CLR_BG;
|
||||
PnlSpec.Align := alTop;
|
||||
PnlSpec.Height := GH_SPEC;
|
||||
Grp := MkGrp(PnlSpec, 'Spectrum', GH_SPEC);
|
||||
MakeLbl(Grp, 'Detector:', LX, R1+4, LW);
|
||||
FCmbSpecDet := MakeCombo(Grp, CX, R1, 172, OnSpecDetChange);
|
||||
for i := 0 to High(DETECTOR_NAMES) do FCmbSpecDet.Items.Add(DETECTOR_NAMES[i]);
|
||||
MakeLbl(Grp, 'Avg Mode:', LX, R1+STEP+4, LW);
|
||||
FCmbSpecAvg := MakeCombo(Grp, CX, R1+STEP, 172, OnSpecAvgModeChange);
|
||||
for i := 0 to High(AVGMODE_NAMES) do FCmbSpecAvg.Items.Add(AVGMODE_NAMES[i]);
|
||||
MakeLbl(Grp, 'Avg Count:', LX, R1+2*STEP+4, LW);
|
||||
FSpinSpecCount := MkSpin(Grp, CX, R1+2*STEP, 72, OnSpecCountChange);
|
||||
MakeLbl(Grp, 'Backmult:', CX+78, R1+2*STEP+4, 64);
|
||||
FEdSpecBackmult := MkEdit(Grp, CX+78+68, R1+2*STEP, 74, OnSpecBackmultChange);
|
||||
FEdSpecBackmult.Text := '0.45';
|
||||
MakeLbl(Grp, 'Avg Time (ms):', LX, R1+2*STEP+4, LW);
|
||||
FSpecAvgTime := MkFloat(Grp, CX, R1+2*STEP, 92, 120.0, 0.0, 5000.0, 10.0, OnSpecAvgTimeChange);
|
||||
|
||||
// ── Waterfall (right column) ──────────────────────────────────────────────
|
||||
Grp := MkGrp(PnlR, 'Waterfall', GH3);
|
||||
MkSep(FTabDispRX1, SEP);
|
||||
|
||||
PnlWF := TPanel.Create(Self);
|
||||
PnlWF.Parent := FTabDispRX1;
|
||||
PnlWF.BevelOuter := bvNone;
|
||||
PnlWF.Color := CLR_BG;
|
||||
PnlWF.Align := alTop;
|
||||
PnlWF.Height := GH_WF;
|
||||
Grp := MkGrp(PnlWF, 'Waterfall', GH_WF);
|
||||
MakeLbl(Grp, 'Detector:', LX, R1+4, LW);
|
||||
FCmbWfDet := MakeCombo(Grp, CX, R1, 172, OnWfDetChange);
|
||||
for i := 0 to High(DETECTOR_NAMES) do FCmbWfDet.Items.Add(DETECTOR_NAMES[i]);
|
||||
MakeLbl(Grp, 'Avg Mode:', LX, R1+STEP+4, LW);
|
||||
FCmbWfAvg := MakeCombo(Grp, CX, R1+STEP, 172, OnWfAvgModeChange);
|
||||
for i := 0 to High(AVGMODE_NAMES) do FCmbWfAvg.Items.Add(AVGMODE_NAMES[i]);
|
||||
MakeLbl(Grp, 'Avg Count:', LX, R1+2*STEP+4, LW);
|
||||
FSpinWfCount := MkSpin(Grp, CX, R1+2*STEP, 72, OnWfCountChange);
|
||||
MakeLbl(Grp, 'Backmult:', CX+78, R1+2*STEP+4, 64);
|
||||
FEdWfBackmult := MkEdit(Grp, CX+78+68, R1+2*STEP, 74, OnWfBackmultChange);
|
||||
FEdWfBackmult.Text := '0.45';
|
||||
for i := 0 to High(WF_AVGMODE_NAMES) do FCmbWfAvg.Items.Add(WF_AVGMODE_NAMES[i]);
|
||||
MakeLbl(Grp, 'Avg Time (ms):', LX, R1+2*STEP+4, LW);
|
||||
FWfAvgTime := MkFloat(Grp, CX, R1+2*STEP, 92, 120.0, 0.0, 5000.0, 10.0, OnWfAvgTimeChange);
|
||||
MakeLbl(Grp, 'High (dBm):', LX, R1+3*STEP+4, LW);
|
||||
FWfHigh := MkFloat(Grp, CX, R1+3*STEP, 92, -80.0, -160.0, 20.0, 1.0, OnWfThresholdChange);
|
||||
MakeLbl(Grp, 'Low (dBm):', CX+120, R1+3*STEP+4, 72);
|
||||
FWfLow := MkFloat(Grp, CX+196, R1+3*STEP, 92, -130.0, -180.0, 0.0, 1.0, OnWfThresholdChange);
|
||||
MakeLbl(Grp, 'AGC Offset:', LX, R1+4*STEP+4, LW);
|
||||
FWfAGCOffset := MkFloat(Grp, CX, R1+4*STEP, 92, 0.0, -40.0, 40.0, 0.5, OnWfThresholdChange);
|
||||
|
||||
// ── Separator ─────────────────────────────────────────────────────────────
|
||||
MkSep(FTabDispRX1, SEP);
|
||||
|
||||
// ── Spectrum Grid (full width, alTop) ─────────────────────────────────────
|
||||
Grp := MkGrp(FTabDispRX1, 'Spectrum Grid', GH2);
|
||||
Grp := MkGrp(FTabDispRX1, 'Spectrum Grid', GH_GRID);
|
||||
MakeLbl(Grp, 'Ref Level (dBm):', LX, R1+4, 116);
|
||||
FEdRefLevel := MkEdit(Grp, LX+120, R1, 80, OnRefLevelChange);
|
||||
FEdRefLevel := TEdit.Create(Self);
|
||||
FEdRefLevel.Parent := Grp;
|
||||
FEdRefLevel.SetBounds(LX+120, R1, 80, BTN_H);
|
||||
FEdRefLevel.Color := CLR_PANEL;
|
||||
FEdRefLevel.Font.Color := CLR_TEXT;
|
||||
FEdRefLevel.Font.Name := 'Courier New';
|
||||
FEdRefLevel.Font.Size := 8;
|
||||
FEdRefLevel.OnExit := OnRefLevelChange;
|
||||
FEdRefLevel.Text := '-20';
|
||||
MakeLbl(Grp, 'Range (dB):', LX, R1+STEP+4, LW);
|
||||
FEdRange := MkEdit(Grp, CX, R1+STEP, 80, OnRangeChange);
|
||||
FEdRange := TEdit.Create(Self);
|
||||
FEdRange.Parent := Grp;
|
||||
FEdRange.SetBounds(CX, R1+STEP, 80, BTN_H);
|
||||
FEdRange.Color := CLR_PANEL;
|
||||
FEdRange.Font.Color := CLR_TEXT;
|
||||
FEdRange.Font.Name := 'Courier New';
|
||||
FEdRange.Font.Size := 8;
|
||||
FEdRange.OnExit := OnRangeChange;
|
||||
FEdRange.Text := '110';
|
||||
MakeLbl(Grp, 'Grid Step:', CX+90, R1+STEP+4, 72);
|
||||
FCmbGridStep := MakeCombo(Grp, CX+90+76, R1+STEP, 80, OnGridStepChange);
|
||||
@@ -656,10 +624,10 @@ end;
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
procedure TSettingsForm.LoadValues(
|
||||
FFTSize, WinType, SpecDet, SpecAvgMode, SpecAvgCount: Integer;
|
||||
SpecBackmult: Double;
|
||||
WfDet, WfAvgMode, WfAvgCount: Integer;
|
||||
WfBackmult: Double;
|
||||
FFTSize, WinType, SpecDet, SpecAvgMode: Integer;
|
||||
SpecAvgTimeMS: Double;
|
||||
WfDet, WfAvgMode: Integer;
|
||||
WfAvgTimeMS, WfHigh, WfLow, WfAGCOffset: Double;
|
||||
RefLevel, Range, GridStep: Double;
|
||||
const AudioOutDevName: string;
|
||||
const AudioInDevName: string);
|
||||
@@ -669,7 +637,7 @@ begin
|
||||
FLoading := True;
|
||||
try
|
||||
// FFT Size
|
||||
Idx := 2; // default 4096
|
||||
Idx := 0; // default 4096
|
||||
for i := 0 to High(FFT_SIZES) do
|
||||
if FFT_SIZES[i] = FFTSize then begin Idx := i; Break; end;
|
||||
FCmbFFTSize.ItemIndex := Idx;
|
||||
@@ -678,7 +646,7 @@ begin
|
||||
if (WinType >= 0) and (WinType < FCmbWindow.Items.Count) then
|
||||
FCmbWindow.ItemIndex := WinType
|
||||
else
|
||||
FCmbWindow.ItemIndex := 5; // Kaiser
|
||||
FCmbWindow.ItemIndex := 2; // Hann
|
||||
|
||||
// Spectrum Detector
|
||||
if (SpecDet >= 0) and (SpecDet < FCmbSpecDet.Items.Count) then
|
||||
@@ -687,13 +655,11 @@ begin
|
||||
FCmbSpecDet.ItemIndex := 0;
|
||||
|
||||
// Spectrum Avg Mode (WDSP value → combo index)
|
||||
Idx := 2; // default Recursive
|
||||
Idx := 0; // default None
|
||||
for i := 0 to High(AVGMODE_VALUES) do
|
||||
if AVGMODE_VALUES[i] = SpecAvgMode then begin Idx := i; Break; end;
|
||||
FCmbSpecAvg.ItemIndex := Idx;
|
||||
|
||||
FSpinSpecCount.Value := EnsureRange(SpecAvgCount, 1, 256);
|
||||
FEdSpecBackmult.Text := FormatFloat('0.##', SpecBackmult);
|
||||
FSpecAvgTime.Value := EnsureRange(SpecAvgTimeMS, 0.0, 5000.0);
|
||||
|
||||
// Waterfall Detector
|
||||
if (WfDet >= 0) and (WfDet < FCmbWfDet.Items.Count) then
|
||||
@@ -702,13 +668,14 @@ begin
|
||||
FCmbWfDet.ItemIndex := 2; // Average
|
||||
|
||||
// Waterfall Avg Mode
|
||||
Idx := 4; // default Log Recursive
|
||||
for i := 0 to High(AVGMODE_VALUES) do
|
||||
if AVGMODE_VALUES[i] = WfAvgMode then begin Idx := i; Break; end;
|
||||
Idx := 1; // default Recursive
|
||||
for i := 0 to High(WF_AVGMODE_VALUES) do
|
||||
if WF_AVGMODE_VALUES[i] = WfAvgMode then begin Idx := i; Break; end;
|
||||
FCmbWfAvg.ItemIndex := Idx;
|
||||
|
||||
FSpinWfCount.Value := EnsureRange(WfAvgCount, 1, 256);
|
||||
FEdWfBackmult.Text := FormatFloat('0.##', WfBackmult);
|
||||
FWfAvgTime.Value := EnsureRange(WfAvgTimeMS, 0.0, 5000.0);
|
||||
FWfHigh.Value := EnsureRange(WfHigh, -160.0, 20.0);
|
||||
FWfLow.Value := EnsureRange(WfLow, -180.0, 0.0);
|
||||
FWfAGCOffset.Value := EnsureRange(WfAGCOffset, -40.0, 40.0);
|
||||
|
||||
// Grid
|
||||
FEdRefLevel.Text := FormatFloat('0.#', RefLevel);
|
||||
@@ -817,20 +784,29 @@ begin
|
||||
Result := 4096;
|
||||
end;
|
||||
|
||||
function TSettingsForm.GetSpecBackmult: Double;
|
||||
var V: Double; Err: Integer;
|
||||
function TSettingsForm.GetSpecAvgTimeMS: Double;
|
||||
begin
|
||||
Val(FEdSpecBackmult.Text, V, Err);
|
||||
if Err <> 0 then V := 0.45;
|
||||
Result := EnsureRange(V, 0.0, 1.0);
|
||||
Result := EnsureRange(FSpecAvgTime.Value, 0.0, 5000.0);
|
||||
end;
|
||||
|
||||
function TSettingsForm.GetWfBackmult: Double;
|
||||
var V: Double; Err: Integer;
|
||||
function TSettingsForm.GetWfAvgTimeMS: Double;
|
||||
begin
|
||||
Val(FEdWfBackmult.Text, V, Err);
|
||||
if Err <> 0 then V := 0.45;
|
||||
Result := EnsureRange(V, 0.0, 1.0);
|
||||
Result := EnsureRange(FWfAvgTime.Value, 0.0, 5000.0);
|
||||
end;
|
||||
|
||||
function TSettingsForm.GetWfHigh: Double;
|
||||
begin
|
||||
Result := EnsureRange(FWfHigh.Value, -160.0, 20.0);
|
||||
end;
|
||||
|
||||
function TSettingsForm.GetWfLow: Double;
|
||||
begin
|
||||
Result := EnsureRange(FWfLow.Value, -180.0, 0.0);
|
||||
end;
|
||||
|
||||
function TSettingsForm.GetWfAGCOffset: Double;
|
||||
begin
|
||||
Result := EnsureRange(FWfAGCOffset.Value, -40.0, 40.0);
|
||||
end;
|
||||
|
||||
function TSettingsForm.GetRefLevel: Double;
|
||||
@@ -880,8 +856,7 @@ begin
|
||||
FCmbWindow.ItemIndex,
|
||||
FCmbSpecDet.ItemIndex,
|
||||
AvgVal,
|
||||
FSpinSpecCount.Value,
|
||||
GetSpecBackmult);
|
||||
GetSpecAvgTimeMS);
|
||||
end;
|
||||
|
||||
procedure TSettingsForm.FireWaterfallChange;
|
||||
@@ -892,15 +867,17 @@ begin
|
||||
if FLoading then Exit;
|
||||
if not Assigned(FOnWaterfallChange) then Exit;
|
||||
AvgIdx := FCmbWfAvg.ItemIndex;
|
||||
if (AvgIdx >= 0) and (AvgIdx <= High(AVGMODE_VALUES)) then
|
||||
AvgVal := AVGMODE_VALUES[AvgIdx]
|
||||
if (AvgIdx >= 0) and (AvgIdx <= High(WF_AVGMODE_VALUES)) then
|
||||
AvgVal := WF_AVGMODE_VALUES[AvgIdx]
|
||||
else
|
||||
AvgVal := 3;
|
||||
AvgVal := 1;
|
||||
FOnWaterfallChange(
|
||||
FCmbWfDet.ItemIndex,
|
||||
AvgVal,
|
||||
FSpinWfCount.Value,
|
||||
GetWfBackmult);
|
||||
GetWfAvgTimeMS,
|
||||
GetWfHigh,
|
||||
GetWfLow,
|
||||
GetWfAGCOffset);
|
||||
end;
|
||||
|
||||
procedure TSettingsForm.FireGridChange;
|
||||
@@ -926,10 +903,7 @@ begin FireDisplayChange; end;
|
||||
procedure TSettingsForm.OnSpecAvgModeChange(Sender: TObject);
|
||||
begin FireDisplayChange; end;
|
||||
|
||||
procedure TSettingsForm.OnSpecCountChange(Sender: TObject);
|
||||
begin FireDisplayChange; end;
|
||||
|
||||
procedure TSettingsForm.OnSpecBackmultChange(Sender: TObject);
|
||||
procedure TSettingsForm.OnSpecAvgTimeChange(Sender: TObject);
|
||||
begin FireDisplayChange; end;
|
||||
|
||||
procedure TSettingsForm.OnWfDetChange(Sender: TObject);
|
||||
@@ -938,10 +912,10 @@ begin FireWaterfallChange; end;
|
||||
procedure TSettingsForm.OnWfAvgModeChange(Sender: TObject);
|
||||
begin FireWaterfallChange; end;
|
||||
|
||||
procedure TSettingsForm.OnWfCountChange(Sender: TObject);
|
||||
procedure TSettingsForm.OnWfAvgTimeChange(Sender: TObject);
|
||||
begin FireWaterfallChange; end;
|
||||
|
||||
procedure TSettingsForm.OnWfBackmultChange(Sender: TObject);
|
||||
procedure TSettingsForm.OnWfThresholdChange(Sender: TObject);
|
||||
begin FireWaterfallChange; end;
|
||||
|
||||
procedure TSettingsForm.OnRefLevelChange(Sender: TObject);
|
||||
|
||||
Reference in New Issue
Block a user