aethersdr / aethersdr/AetherSDR
3D stacked trace: 1-frame signal dip at pan-revealed edges (median-of-3 fed fallback-filled reprojected raw history)
Nobody has claimed this yet.
- Dominant language
- C++
- Stars
- 221
- Forks
- 117
- Avg merge
- 2d 7h
- Merged PRs (30d)
- 299
Description
Follow-up from #3942 review
#3942 preserves and reprojects DSS (3D stacked-trace) history across frequency-frame changes so the trace stays aligned with the waterfall on Kiwi receivers. As part of that, DssRenderer::reprojectFrequencyFrame also reprojects the raw median-of-3 impulse-rejection history (m_rawPrev1 / m_rawPrev2). This introduces a minor, self-correcting artifact.
Mechanism
- On pan/zoom,
reprojectFrequencyFrameremapsm_rawPrev1/2into the new frequency frame. Columns that were out-of-band in the old frame (newly revealed by the gesture) have no source data, soreprojectRowfills them withfallbackDbm(kKiwiSdrWaterfallMinDbm— the noise floor). - The next
updateKiwiSdrWaterfallRow -> m_dss.pushRowcomputes, per column,median3(newRaw[c], m_rawPrev1[c], m_rawPrev2[c]). - For a newly-revealed column, two of the three inputs are the floor, so the median collapses to the floor even when
newRaw[c]carries a real signal.
Impact
The newest (front) trace shows a transient dip/notch at the pan-revealed edge for ~1 frame, recovering over the next 1–2 rows as the raw history refills with real data. Purely cosmetic, 3D-mode + Kiwi only, self-correcting. Not a blocker — filed for polish.
Suggested fix
In reprojectFrequencyFrame, reset the raw-history depth instead of feeding fallback-filled rows into the next median:
// after reprojecting m_rows[...] for the visible history:
m_rawHistCount = 0; // let the next pushRow skip median-of-3 for one frame
// (drop the m_rawPrev1/m_rawPrev2 reprojection entirely)
Trade-off: this also skips impulse rejection for a single frame across all columns (one row could let a broadband impulse through right after a pan). If that's undesirable, an alternative is to only fill non-overlap columns of m_rawPrev1/2 from the corresponding reprojected display row rather than the floor, so the median has a plausible neighbor. The simple m_rawHistCount = 0 is likely sufficient given the artifact is already sub-frame.
Acceptance
- Pan/zoom in 3D stacked-trace mode on a Kiwi receiver with a signal near the incoming edge: no visible one-frame notch at the newly-revealed edge.
- No regression in impulse rejection during steady-state (non-pan) operation.
Filed as the follow-up noted in the #3942 review. (Second review item — the duplicated float->qfloat16 upload loop — is a trivial cleanup and folded into that review comment, not tracked separately.)
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start at DssRenderer::reprojectFrequencyFrame and follow how m_rawPrev1, m_rawPrev2, and m_rawHistCount are consumed by updateKiwiSdrWaterfallRow and m_dss.pushRow. Reproduce pan/zoom in 3D stacked-trace mode on a Kiwi receiver with a signal near the incoming edge, then verify that the one-frame notch is gone while steady-state impulse rejection still works.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- cpp
- Domain
- computer-graphics
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Quiet
- Clarity
- Clearly specified
- Newbie friendliness
- 74/100