summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLeah Rowe <leah@libreboot.org>2026-03-12 23:26:47 +0000
committerLeah Rowe <leah@libreboot.org>2026-03-12 23:26:47 +0000
commitf396654ae8c6708be5a505c3c58cd55d3fcfec1d (patch)
treeacb2da4cea74f507d74a0dbdb644ff739b572d2a
parentc4fefba877af2a47cc2a32e47e0451603115618f (diff)
util/spkmodem-decode: separate silence check
i conflated two separate tests in a previous change. the silence check was defeated by still checking f alongside it, which would be set, thus satisfying the condition, and proceeding, which defeats the purpose of the silence check (ignore false signal that is actually noise) - so in the original patch that i wrote, the extra checks actually do nothing. this patch fixes that, and makes the logic a bit clearer. Signed-off-by: Leah Rowe <leah@libreboot.org>
-rw-r--r--util/spkmodem_decode/spkmodem-decode.c27
1 files changed, 16 insertions, 11 deletions
diff --git a/util/spkmodem_decode/spkmodem-decode.c b/util/spkmodem_decode/spkmodem-decode.c
index 08e7b17a..ff94e90e 100644
--- a/util/spkmodem_decode/spkmodem-decode.c
+++ b/util/spkmodem_decode/spkmodem-decode.c
@@ -460,25 +460,30 @@ auto_detect_tone(struct decoder_state *st)
{
int f;
+ if (st->learn_samples >= LEARN_SAMPLES)
+ return;
+
/*
- * Don't also run auto-detect during decode,
- * otherwise it would run for every sample.
+ * Ignore silence / near silence.
+ * Both FIR windows will be near zero when no signal exists.
*/
- if (st->learn_samples >= LEARN_SAMPLES)
+ if (st->freq_data <= 2 && st->freq_separator <= 2) {
+ st->learn_samples++;
return;
+ }
/*
- * Check both FIR windows.
- * Inside separator frames, the separator window contains tone,
- * during data frames the data window does; a minimum of
- * the two captures the lowest active tone cluster more reliably.
+ * Choose the lowest active tone.
+ * Separator frames carry tone in the separator window,
+ * data frames carry tone in the data window.
*/
f = st->freq_data;
- if (st->freq_separator > 0 && st->freq_separator < f)
+
+ if (f <= 0 || (st->freq_separator > 0 &&
+ st->freq_separator < f))
f = st->freq_separator;
- if (f > 0 || /* prevent noise from corrupting tone-learning */
- st->freq_data > 2 || /* <--- stop from */
- st->freq_separator > 2) { /* learning silence if no signal */
+
+ if (f > 0) {
if (f < st->freq_min)
st->freq_min = f;