From 3b2a0ee976029b41cd7406bdac3b5b30a198d980 Mon Sep 17 00:00:00 2001 From: Jan Svabenik Date: Wed, 18 Mar 2026 07:29:43 +0100 Subject: [PATCH] Add digital mode labels to classifier --- internal/classifier/rules.go | 25 ++++++++++++++++++++----- internal/classifier/types.go | 6 ++++++ 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/internal/classifier/rules.go b/internal/classifier/rules.go index 4484e6c..e74cdb0 100644 --- a/internal/classifier/rules.go +++ b/internal/classifier/rules.go @@ -22,12 +22,21 @@ func RuleClassify(feat Features) Classification { if flat > 0.7 { second = ClassNoise } + // digital voice rough guesses + if feat.InstFreqStd < 0.5 && feat.EnvVariance < 0.3 { + second = ClassDMR + } case bw >= 2000 && bw < 3000: - // candidate for FT8/WSPR (very rough): low env variance, narrow BW + // candidate for FT8 if feat.EnvVariance < 0.5 && feat.InstFreqStd < 0.7 { - best = ClassUnknown - second = ClassUnknown - conf = 0.5 + best = ClassFT8 + conf = 0.55 + } + case bw >= 150 && bw < 500: + // candidate for WSPR + if feat.EnvVariance < 0.4 && feat.InstFreqStd < 0.5 { + best = ClassWSPR + conf = 0.55 } case bw >= 500 && bw < 3e3: if sym > 0.2 { @@ -39,8 +48,14 @@ func RuleClassify(feat Features) Classification { } else if p2a > 3 && flat < 0.4 { best = ClassAM conf = 0.6 + } else if feat.InstFreqStd > 0.8 { + best = ClassFSK + conf = 0.5 + } else if feat.InstFreqStd < 0.3 { + best = ClassPSK + conf = 0.5 } - case bw < 500: + case bw < 150: best = ClassCW conf = 0.7 } diff --git a/internal/classifier/types.go b/internal/classifier/types.go index 0cf6abc..d70539f 100644 --- a/internal/classifier/types.go +++ b/internal/classifier/types.go @@ -10,6 +10,12 @@ const ( ClassSSBUSB SignalClass = "USB" ClassSSBLSB SignalClass = "LSB" ClassCW SignalClass = "CW" + ClassFSK SignalClass = "FSK" + ClassPSK SignalClass = "PSK" + ClassDMR SignalClass = "DMR" + ClassDStar SignalClass = "D-STAR" + ClassFT8 SignalClass = "FT8" + ClassWSPR SignalClass = "WSPR" ClassNoise SignalClass = "NOISE" ClassUnknown SignalClass = "UNKNOWN" )