aethersdr / aethersdr/AetherSDR

3D stacked trace: 1-frame signal dip at pan-revealed edges (median-of-3 fed fallback-filled reprojected raw history)

Open
#3,953 1 comment 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

awaiting-response bug
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, reprojectFrequencyFrame remaps m_rawPrev1/2 into the new frequency frame. Columns that were out-of-band in the old frame (newly revealed by the gesture) have no source data, so reprojectRow fills them with fallbackDbm (kKiwiSdrWaterfallMinDbm — the noise floor).
  • The next updateKiwiSdrWaterfallRow -> m_dss.pushRow computes, 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

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.