You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
I used the AI-assisted bug report tool (Help → Support → File an Issue)
I have attached a support bundle or log file
What happened?
The DeepFist receive backend (#5716, default off) publishes 41.7 % / 35.5 % of the text of two recorded off-air W1AW bulletins (ARLD038 / ARLP038). Replayed with the app's Parameters (src/models/DeepFistCwModel.cpp:32-34) and scored against the published text, beside ggmorse and the DeepCW streaming committer on the same audio with the same scorer:
The activity gate (src/core/deepfist/DeepFistStream.cpp:92, threshold 12) is closed on 66.2 % / 72.1 % of the 0.4 s ticks, on audio that is near-continuous CW. On ARLD038, 1667 of the 2960 gated ticks score 9–12.
The figures measure the backend as a whole — model, window, activity gate and committer — not the model in isolation. This is the "transcribed off-air recordings" evaluation named in #4817.
One Parameters field changed at a time (app Parameters otherwise):
Change
ARLD038
ARLP038
Ticks gated
activityThreshold 15
84.3 %
82.7 %
87 % / 87 %
activityThreshold 9
29.5 %
40.1 %
29 % / 47 %
activityThreshold 6
15.0 %
20.6 %
3 % / 11 %
activityThreshold 3
13.9 %
20.5 %
0 % / 0 %
guardSeconds 2.0 / 3.0
61.4 / 61.4 %
63.9 / 63.4 %
unchanged
carryPending off
64.3 %
66.9 %
unchanged
decode window 3–15 s (compile-time)
61.6–64.4 %
63.4–68.5 %
unchanged
input level −12 / +24 dB
text byte-identical to 0 dB
same
—
requireCompletedMark off cannot be tested in the app configuration: Parameters::valid() requires it while normalizeActivity is on (src/core/deepfist/DeepFistStream.cpp:14).
Not measured: whether a lower threshold emits characters on an empty frequency. Both recordings are near-continuous CW.
The stream's speed estimate (clamped 5–60 WPM, third_party/deepfist/DeepFistConditioner.cpp:198) sits at 60 WPM on 86.6 % (ARLD038) / 55.7 % (ARLP038) of ticks; below the ceiling it reads mostly 19–20 WPM. W1AW sends bulletins at 18 WPM. The stream uses the estimate only to choose the slow guard, and src/core/deepfist/DeepFistStream.cpp:64 notes it is not a calibrated UI reading.
For all three decoders this bears on the same choice: which parameters to expose in the GUI, and which defaults give good copy out of the box. A shared replay harness across the three decoders would make comparisons like this repeatable.
Report preparation
What happened?
The DeepFist receive backend (#5716, default off) publishes 41.7 % / 35.5 % of the text of two recorded off-air W1AW bulletins (ARLD038 / ARLP038). Replayed with the app's Parameters (
src/models/DeepFistCwModel.cpp:32-34) and scored against the published text, beside ggmorse and the DeepCW streaming committer on the same audio with the same scorer:The activity gate (
src/core/deepfist/DeepFistStream.cpp:92, threshold 12) is closed on 66.2 % / 72.1 % of the 0.4 s ticks, on audio that is near-continuous CW. On ARLD038, 1667 of the 2960 gated ticks score 9–12.The figures measure the backend as a whole — model, window, activity gate and committer — not the model in isolation. This is the "transcribed off-air recordings" evaluation named in #4817.
One Parameters field changed at a time (app Parameters otherwise):
activityThreshold15activityThreshold9activityThreshold6activityThreshold3guardSeconds2.0 / 3.0carryPendingoffrequireCompletedMarkoff cannot be tested in the app configuration:Parameters::valid()requires it whilenormalizeActivityis on (src/core/deepfist/DeepFistStream.cpp:14).third_party/deepfist/DeepFistConditioner.cpp:198) sits at 60 WPM on 86.6 % (ARLD038) / 55.7 % (ARLP038) of ticks; below the ceiling it reads mostly 19–20 WPM. W1AW sends bulletins at 18 WPM. The stream uses the estimate only to choose the slow guard, andsrc/core/deepfist/DeepFistStream.cpp:64notes it is not a calibrated UI reading.For all three decoders this bears on the same choice: which parameters to expose in the GUI, and which defaults give good copy out of the box. A shared replay harness across the three decoders would make comparisons like this repeatable.
Related: #5716 (DeepFist backend) · #4817 (CW decoder backends RFC; maintainer decision) · #5758 (decoder input routing) · K5PTB#1 (DeepCW streaming commit, same audio)
What did you expect?
Copy of the bulletin comparable to the other receive backends on the same audio.
Steps to reproduce
2859fdef(the DeepFist, ggmorse, resampler and CW-model sources are unchanged through43df9732).exp27_bt-champion(hashes equal the manifest insrc/core/deepfist/DeepFistModelAssets.cpp) and the four audio zips attached to DeepCW: keep word spaces in the panels; sliding-window decode with time-anchored commit K5PTB/AetherSDR#1.run.sh <checkout> <modelDir> <zipDir>. It applies a local replay tool (included as a patch), replays both bulletins, and scores them withscore_cer.pyfrom the DeepCW: keep word spaces in the panels; sliding-window decode with time-anchored commit K5PTB/AetherSDR#1 bundle. Texts are byte-identical to the bundled outputs (40/40).aethersdr-issue-deepfist-cer-w1aw-2026-09-25.zip
AetherSDR version
main
2859fdef(v26.9.4 + 23), built with-DENABLE_DEEPFIST_EXPERIMENT=ON; offline replay, no app session.Radio model & firmware
FLEX-8400, firmware 4.2.20.41 — used only to record the two bulletins (17 m, 2026-09-24, receive only).
Operating system
Linux
OS version and hardware
Ubuntu 24.04.5 LTS, Qt 6.8.3, Intel Core i9-14900HX, ONNX Runtime 1.27.0 (CPU)
— authored by agent (Claude Code) on behalf of @skerker