From e43f0e1e35f8e5c4e47b8a1bc5e16d83639c5621 Mon Sep 17 00:00:00 2001 From: f4exb Date: Mon, 16 Feb 2026 01:10:55 +0100 Subject: [PATCH] Freq Scanner voice activity: check good spacing among broad peaks only --- plugins/channelrx/freqscanner/freqscannersink.cpp | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/plugins/channelrx/freqscanner/freqscannersink.cpp b/plugins/channelrx/freqscanner/freqscannersink.cpp index ccf0dccac..9a2c143b1 100644 --- a/plugins/channelrx/freqscanner/freqscannersink.cpp +++ b/plugins/channelrx/freqscanner/freqscannersink.cpp @@ -378,6 +378,7 @@ Real FreqScannerSink::voiceActivityLevel(int bin, int channelBins, bool isLSB) c // Find peaks above noise floor QVector peakBins; + QVector broadPeakBins; QVector peakMags; // Calculate average noise floor from raw FFT @@ -469,20 +470,22 @@ Real FreqScannerSink::voiceActivityLevel(int bin, int channelBins, bool isLSB) c // Voice formants are typically 50-200 Hz wide // CW signals are <50 Hz wide - if (bandwidth >= 50.0 && bandwidth <= 200.0) { + if (bandwidth >= 50.0 && bandwidth <= 200.0) + { + broadPeakBins.append(peakBin); broadPeakCount++; } } // Check formant spacing (voice formants are typically 500-1500 Hz apart) bool goodSpacing = false; - if (broadPeakCount >= 2 && peakBins.size() >= 2) + if (broadPeakCount >= 2) { - for (int p = 0; p < peakBins.size() - 1; p++) + for (int p = 0; p < broadPeakBins.size() - 1; p++) { - int spacing = std::abs(peakBins[p + 1] - peakBins[p]); + int spacing = std::abs(broadPeakBins[p + 1] - broadPeakBins[p]); float spacingHz = spacing * binBW; - if (spacingHz >= 400.0 && spacingHz <= 1800.0) { + if (spacingHz >= 400.0 && spacingHz <= 1100.0) { goodSpacing = true; break; } @@ -555,7 +558,7 @@ Real FreqScannerSink::voiceActivityLevel(int bin, int channelBins, bool isLSB) c score = std::min(score * 1.2f, 1.0f); } - // Penalize if too many narrow peaks (likely CW or noise) + // Penalize if too many narrow peaks (likely CW or noise) // => This condition is ALWAYS true as there are always many more peaks than broad peaks // int narrowPeakCount = peakBins.size() - broadPeakCount; // if (narrowPeakCount > broadPeakCount) {