Преглед изворни кода

fix: use stable signals for live audio streaming

master
Jan Svabenik пре 5 часа
родитељ
комит
595ff3ba84
2 измењених фајлова са 30 додато и 4 уклоњено
  1. +10
    -0
      ROADMAP.md
  2. +20
    -4
      cmd/sdrd/dsp_loop.go

+ 10
- 0
ROADMAP.md Прегледај датотеку

@@ -128,6 +128,16 @@ Phase 5 should still avoid unnecessary premature hardware-specific complexity, b

---

## Future Architecture Note - Observation/Track Reconciliation

A likely later improvement is an explicit reconciliation layer between:
- raw surveillance observations / candidates
- stable tracked signals / identities

This is intentionally NOT the first fix for live-audio regressions.
For now, stable-ID-carrying signal sources should be used for stream/session-sensitive paths.
If needed later, a dedicated observation-to-track reconciliation layer can be introduced as its own architecture block.

## Phase 6 - Adaptive QoS / Scheduler Intelligence

### Core idea


+ 20
- 4
cmd/sdrd/dsp_loop.go Прегледај датотеку

@@ -65,11 +65,26 @@ func runDSP(ctx context.Context, srcMgr *sourceManager, cfg config.Config, det *
var displaySignals []detector.Signal
if len(art.detailIQ) > 0 {
displaySignals = state.refinement.Result.Signals
if rec != nil && len(displaySignals) > 0 && len(art.allIQ) > 0 {
stableSignals := rt.det.StableSignals()
streamSignals := displaySignals
if len(stableSignals) > 0 {
streamSignals = stableSignals
}
if rec != nil && len(art.allIQ) > 0 {
log.Printf("LIVEAUDIO DSP: detailIQ=%d displaySignals=%d streamSignals=%d stableSignals=%d allIQ=%d", len(art.detailIQ), len(displaySignals), len(streamSignals), len(stableSignals), len(art.allIQ))
aqCfg := extractionConfig{firTaps: rt.cfg.Recorder.ExtractionTaps, bwMult: rt.cfg.Recorder.ExtractionBwMult}
streamSnips, streamRates := extractForStreaming(extractMgr, art.allIQ, rt.cfg.SampleRate, rt.cfg.CenterHz, displaySignals, rt.streamPhaseState, rt.streamOverlap, aqCfg)
items := make([]recorder.StreamFeedItem, 0, len(displaySignals))
for j, ds := range displaySignals {
streamSnips, streamRates := extractForStreaming(extractMgr, art.allIQ, rt.cfg.SampleRate, rt.cfg.CenterHz, streamSignals, rt.streamPhaseState, rt.streamOverlap, aqCfg)
items := make([]recorder.StreamFeedItem, 0, len(streamSignals))
for j, ds := range streamSignals {
className := "<nil>"
if ds.Class != nil {
className = string(ds.Class.ModType)
}
snipLen := 0
if j < len(streamSnips) {
snipLen = len(streamSnips[j])
}
log.Printf("LIVEAUDIO DSP: streamSignal idx=%d id=%d center=%.3fMHz bw=%.0f class=%s snip=%d", j, ds.ID, ds.CenterHz/1e6, ds.BWHz, className, snipLen)
if ds.ID == 0 || ds.Class == nil {
continue
}
@@ -82,6 +97,7 @@ func runDSP(ctx context.Context, srcMgr *sourceManager, cfg config.Config, det *
}
items = append(items, recorder.StreamFeedItem{Signal: ds, Snippet: streamSnips[j], SnipRate: snipRate})
}
log.Printf("LIVEAUDIO DSP: feedItems=%d", len(items))
if len(items) > 0 {
rec.FeedSnippets(items)
}


Loading…
Откажи
Сачувај