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

docs: finalize phase milestones and ukf test config

master
Jan Svabenik пре 3 часа
родитељ
комит
fd718d55cc
3 измењених фајлова са 194 додато и 146 уклоњено
  1. +52
    -88
      PLAN.md
  2. +2
    -1
      README.md
  3. +140
    -57
      config.yaml

+ 52
- 88
PLAN.md Прегледај датотеку

@@ -82,108 +82,72 @@ Verantwortung:

---

## Phase-1-Umbau (dieser Arbeitslauf)
## Phase-1-Umbau

### Phase-1 Status (closure)
### Phase-1 Status
- Architekturgrundlage, Config-Modell und Arbitration/Admission-Surface sind umgesetzt.
- Abschlussfokus: Tests/Edge-Cases, API/Debug-Surface glaetten, Docs klar ziehen.
- Keine neuen Scheduler- oder Multi-Resolution-Ausbauschritte in Phase 1.

### A. Benennung / Projektidentität
- Projektname auf `sdr-wideband-suite` umstellen
- README auf Zielbild anpassen

### B. Konfigurationsmodell vorbereiten
Neue Konfig-Teile einführen:
- `pipeline.mode`
- `surveillance.*`
- `refinement.*`
- `resources.*`
- optionale `profiles.*`

Zusatz:
- `refinement.detail_fft_size` für einen eigenständigen Detailpfad (Refinement-FFT) neben der Surveillance-FFT

Wichtig:
- Abwärtskompatibilität zur bisherigen Config möglichst erhalten
- bisherige Felder weiterhin nutzbar

### C. Analyse von UI trennen
- `fft_size` als primär **analysis/surveillance**-Parameter behandeln
- UI-seitige Bin-/FPS-Wünsche als reine Presentation-Ebene behandeln
- klare Trennung im Code etablieren

### D. Candidate-/Refinement-Modell einziehen
- neue Candidate-/Refinement-Datentypen einführen
- zunächst mit CPU-/bestehendem GPU-Extraction-Pfad implementieren
- Detector bleibt vorerst Kern der Candidate-Erzeugung
- Refiner sitzt danach explizit als eigener Schritt in der Pipeline
- Refinement-Workitems mit expliziten Ausführungsparametern (FFT/Span/Stage)

### E. Pipeline-Orchestrierung modularisieren
- `runDSP()` entflechten
- Schritte explizit machen:
- ingest
- spectrum
- detect
- refine
- classify
- track
- present
- record
- Gemeinsame Arbitration-/Budget-Sicht für refinement/record/decode zentralisieren (Admission + Queue/Hold + Debug-Surface) -- umgesetzt via zentralem Arbiter im Pipeline-Paket + normalisierter Reason-Taxonomie; künftige Phase: tieferer Scheduler/Intent-Budget-Override

### F. Dokumentierte Betriebsprofile
- initiale Profile definieren, z. B.:
- `legacy`
- `wideband-balanced`
- `wideband-aggressive`
- `archive`

### G. Tests / Build grün halten
- Go tests ausführen
- Build testen
- erst danach commit/push
- Phase 1 ist als Meilenstein abgeschlossen.

### Kernpunkte
- Projektname auf `sdr-wideband-suite` umgestellt
- neues Konfigurationsmodell für `pipeline`, `surveillance`, `refinement`, `resources`, `profiles`
- Analyse klarer von Presentation getrennt
- explizites Candidate-/Refinement-Modell eingeführt
- `runDSP()` in klarere Schritte zerlegt
- gemeinsame Arbitration-/Budget-Sicht für refinement/record/decode zentralisiert
- initiale Betriebsprofile dokumentiert
- Tests/Build grün gehalten

---

## Spätere Phasen
## Phase-2-Umbau

### Phase 2
- echte mehrstufige Surveillance-Resolution-Engine
- GPU-seitige Reduction/Decimation
- UI-Detailfenster an Refinement koppeln
### Phase-2 Status
- Phase 2 ist als Meilenstein abgeschlossen.

Phase-2 Status (Wave E):
- Derived-detection Governance: detection vs support-only klarer (Policy + Debug)
- Fused candidate evidence summaries mit Rollen/Kindern und Support-Only Hinweis
- Surveillance-Level Summaries berichten Rollen/Kind (Primary/Derived/Support/Presentation)
### Gelandete Wellen
- **Wave A**: operative Surveillance-Level, decimated/derived spectra, Level-Set und API-Sicht
- **Wave B**: derived candidate pass, primary/derived fusion, candidate evidence
- **Wave C**: level-aware candidate semantics und konservatives evidence-aware scoring
- **Wave D**: detection governance, Rollen für detection/support/presentation, derived-detection policy
- **Wave E**: Konsolidierung von detection/support semantics, fused candidate summaries, Debug/API/Docs

### Phase 3
- Scheduler/Priority/Budget-Engine
- Kandidatenpriorisierung
- automatische Decoder-Slot-Vergabe
### Ergebnis
- echte mehrstufige Surveillance-Resolution-Grundlage
- derived detection governance und support-only Semantik
- fused candidate evidence summaries
- Level-Rollen und Debug-Sicht sind operativ sichtbar

Phase-3 Status (Wave 3E):
- Wave 3A: Priority-Scoring + BudgetModel scaffolding integriert
- Wave 3B: Arbitration/Admission + Hold/Displacement-Logik für Refinement/Record/Decode
- Wave 3C: Pressure-Summaries + Decision-Queue-Stats + Reason-Taxonomie + Tests (Hold/Displacement)
- Wave 3E: Konservative cross-resource Rebalance-Schicht (Refinement/Record/Decode) mit profil-/intent-spezifischem Schutz, Debug-Surface und Szenario-Tests
---

### Phase 4
- breitbandige Multi-Span-Profile
- 20-80 MHz konkrete Betriebsmodi
- adaptive Quality-of-Service
## Phase-3-Umbau

### Phase-3 Status
- Phase 3 ist als konservativer Runtime-Intelligence-Meilenstein abgeschlossen.

### Gelandete Wellen
- **Wave 3A**: Priority-Tiers, Admission-Classes, reichere Reason-Familien
- **Wave 3B**: Budget-Preferences, Effective-Budgets, Pressure-Summaries
- **Wave 3C**: Hold-Protection, opportunistic displacement, displaced-by-hold, harmonisierte Reason-Taxonomie
- **Wave 3D**: family-aware tier floors, intent-aware hold behavior, family-priority Runtime-Semantik
- **Wave 3E**: konservative cross-resource Rebalance für refinement/record/decode mit profil-/intent-spezifischem Schutz

### Ergebnis
- refinement / record / decode sprechen eine gemeinsame Admission-/Priority-Sprache
- pressure ist sichtbar und verhaltenswirksam
- hold / protection / displacement sind erklärbar
- signal-family priorities greifen in echte Runtime-Entscheidungen ein
- conservative adaptive rebalance verschiebt Ressourcen zwischen refinement / record / decode

---

## Erfolgskriterien für Phase 1
## Spätere Phasen

- Fork existiert als neues Repo
- Projekt ist logisch als Wideband-Fork positioniert
- neue Architekturbegriffe sind im Code und in der Config sichtbar
- bestehende Kernfunktionen bleiben lauffähig
- Grundlage für spätere skalierbare, autonome Arbeitsweise ist gelegt
### Phase 4
- breitbandige Multi-Span-Profile
- 20-80 MHz konkrete Betriebsmodi
- adaptive Quality-of-Service
- weitere Scheduler-/Betriebsintelligenz über die konservative Phase-3-Rebalance hinaus

---



+ 2
- 1
README.md Прегледај датотеку

@@ -13,7 +13,8 @@ Go-based SDR analysis engine and live spectrum/waterfall UI, evolved from the or
- WFM stereo + RDS baseband
- Mock mode for testing without hardware
- Phase-1 architecture foundation complete: explicit pipeline/surveillance/refinement/resources config model plus candidate/refinement/admission scaffolding
- Phase-2 (in progress): derived detection governance, multi-resolution support levels, fused candidate evidence summaries
- Phase-2 milestone complete: multi-resolution surveillance levels, derived detection governance, support levels, and fused candidate evidence summaries
- Phase-3 milestone complete: conservative runtime prioritization/admission/pressure/hold/displacement/rebalance behavior across refinement, record, and decode

---



+ 140
- 57
config.yaml Прегледај датотеку

@@ -1,157 +1,240 @@
bands:
- name: 40m
start_hz: 7.0e6
end_hz: 7.2e6
center_hz: 7.1e6
- name: uk-fm-broadcast
start_hz: 87.5e6
end_hz: 108.0e6
center_hz: 99.5e6
sample_rate: 2048000
fft_size: 2048
gain_db: 30
fft_size: 4096
gain_db: 32
tuner_bw_khz: 1536
use_gpu_fft: true
agc: false
dc_block: false
iq_balance: false
classifier_mode: combined
agc: true
dc_block: true
iq_balance: true
pipeline:
mode: wideband-balanced
profile: wideband-balanced
goals:
intent: wideband-surveillance
monitor_start_hz: 7.0e6
monitor_end_hz: 7.2e6
monitor_span_hz: 200000
signal_priorities: ["hf-voice", "digital", "cw"]
auto_record_classes: []
auto_decode_classes: []
intent: broadcast-monitoring
monitor_start_hz: 88.0e6
monitor_end_hz: 108.0e6
monitor_span_hz: 20000000
signal_priorities: ["wfm", "rds", "broadcast", "digital"]
auto_record_classes: ["wfm"]
auto_decode_classes: ["rds"]
surveillance:
analysis_fft_size: 2048
frame_rate: 15
strategy: single-resolution
analysis_fft_size: 4096
frame_rate: 12
strategy: multi-resolution
display_bins: 2048
display_fps: 15
display_fps: 12
derived_detection: auto
refinement:
enabled: true
max_concurrent: 8
detail_fft_size: 2048
max_concurrent: 16
detail_fft_size: 4096
min_candidate_snr_db: 0
min_span_hz: 0
max_span_hz: 0
min_span_hz: 80000
max_span_hz: 250000
auto_span: true
resources:
prefer_gpu: true
max_refinement_jobs: 16
max_recording_streams: 8
max_decode_jobs: 8
decision_hold_ms: 2000
profiles:
- name: legacy
description: Current single-band pipeline behavior
surveillance:
analysis_fft_size: 2048
strategy: single-resolution
display_bins: 2048
display_fps: 15
derived_detection: auto
resources:
prefer_gpu: false
max_refinement_jobs: 8
max_recording_streams: 16
max_decode_jobs: 16
decision_hold_ms: 2000
refinement:
enabled: true
max_concurrent: 8
detail_fft_size: 2048
min_candidate_snr_db: 0
min_span_hz: 0
max_span_hz: 0
auto_span: true
pipeline:
mode: legacy
profile: legacy
goals:
intent: general-monitoring
- name: wideband-balanced
description: Prepared baseline for scalable wideband surveillance
description: Baseline multi-resolution wideband surveillance
surveillance:
analysis_fft_size: 4096
frame_rate: 12
strategy: multi-resolution
display_bins: 2048
display_fps: 12
derived_detection: auto
resources:
prefer_gpu: true
max_refinement_jobs: 16
max_recording_streams: 16
max_decode_jobs: 12
decision_hold_ms: 2000
refinement:
enabled: true
max_concurrent: 16
detail_fft_size: 4096
min_candidate_snr_db: 0
min_span_hz: 4000
max_span_hz: 200000
auto_span: true
pipeline:
mode: wideband-balanced
profile: wideband-balanced
goals:
intent: wideband-surveillance
signal_priorities: ["digital", "wfm"]
- name: wideband-aggressive
description: Higher surveillance/refinement budgets for future broad-span monitoring
description: Higher surveillance/refinement budgets for dense wideband monitoring
surveillance:
analysis_fft_size: 8192
frame_rate: 10
strategy: multi-resolution
display_bins: 4096
display_fps: 10
derived_detection: auto
resources:
prefer_gpu: true
max_refinement_jobs: 32
max_recording_streams: 24
max_decode_jobs: 16
decision_hold_ms: 2000
refinement:
enabled: true
max_concurrent: 32
detail_fft_size: 8192
min_candidate_snr_db: 0
min_span_hz: 6000
max_span_hz: 250000
auto_span: true
pipeline:
mode: wideband-aggressive
profile: wideband-aggressive
goals:
intent: high-density-wideband-surveillance
signal_priorities: ["digital", "wfm", "trunk"]
- name: archive
description: Record-first monitoring profile
surveillance:
analysis_fft_size: 4096
frame_rate: 12
strategy: single-resolution
display_bins: 2048
display_fps: 12
derived_detection: auto
resources:
prefer_gpu: true
max_refinement_jobs: 12
max_recording_streams: 24
max_decode_jobs: 12
decision_hold_ms: 2500
refinement:
enabled: true
max_concurrent: 12
detail_fft_size: 4096
min_candidate_snr_db: 0
min_span_hz: 4000
max_span_hz: 200000
auto_span: true
pipeline:
mode: archive
profile: archive
goals:
intent: archive-and-triage
resources:
prefer_gpu: true
max_refinement_jobs: 8
max_recording_streams: 16
max_decode_jobs: 16
decision_hold_ms: 2000
signal_priorities: ["wfm", "nfm", "digital"]
- name: digital-hunting
description: Digital-first refinement and decode focus
surveillance:
analysis_fft_size: 4096
frame_rate: 12
strategy: multi-resolution
display_bins: 2048
display_fps: 12
derived_detection: auto
resources:
prefer_gpu: true
max_refinement_jobs: 16
max_recording_streams: 12
max_decode_jobs: 16
decision_hold_ms: 2000
refinement:
enabled: true
max_concurrent: 16
detail_fft_size: 4096
min_candidate_snr_db: 0
min_span_hz: 3000
max_span_hz: 120000
auto_span: true
pipeline:
mode: digital-hunting
profile: digital-hunting
goals:
intent: digital-surveillance
signal_priorities: ["ft8", "wspr", "fsk", "psk", "dmr"]
detector:
threshold_db: -20
min_duration_ms: 250
hold_ms: 500
ema_alpha: 0.2
hysteresis_db: 3
threshold_db: -55
min_duration_ms: 120
hold_ms: 1200
ema_alpha: 0.35
hysteresis_db: 6
min_stable_frames: 3
gap_tolerance_ms: 500
cfar_enabled: true
cfar_guard_cells: 2
cfar_train_cells: 16
cfar_rank: 24
cfar_scale_db: 6
gap_tolerance_ms: 1200
cfar_mode: GOSCA
cfar_guard_hz: 15000
cfar_train_hz: 120000
cfar_guard_cells: 3
cfar_train_cells: 24
cfar_rank: 36
cfar_scale_db: 7
cfar_wrap_around: true
edge_margin_db: 4
max_signal_bw_hz: 250000
merge_gap_hz: 12000
class_history_size: 10
class_switch_ratio: 0.6
recorder:
enabled: true
enabled: false
min_snr_db: 10
min_duration: 1s
max_duration: 300s
preroll_ms: 500
record_iq: true
record_audio: true
record_iq: false
record_audio: false
auto_demod: true
auto_decode: false
max_disk_mb: 0
output_dir: "data/recordings"
output_dir: data/recordings
class_filter: []
ring_seconds: 8
deemphasis_us: 50
extraction_fir_taps: 101
extraction_bw_mult: 1.2
decoder:
ft8_cmd: "C:/WSJT/wsjtx-2.7.0-rc6/bin/jt9.exe -8 {audio}"
wspr_cmd: "C:/WSJT/wsjtx-2.7.0-rc6/bin/wsprd.exe {audio}"
dmr_cmd: "tools/dsd-neo/bin/dsd-neo.exe -fs -i {audio} -s {sr} -o null"
dstar_cmd: "tools/dsd-neo/bin/dsd-neo.exe -fd -i {audio} -s {sr} -o null"
fsk_cmd: "tools/fsk/fsk_decoder --iq {iq} --sample-rate {sr}"
psk_cmd: "tools/psk/psk_decoder --iq {iq} --sample-rate {sr}"
web_addr: ":8080"
event_path: "data/events.jsonl"
frame_rate: 15
ft8_cmd: C:/WSJT/wsjtx-2.7.0-rc6/bin/jt9.exe -8 {audio}
wspr_cmd: C:/WSJT/wsjtx-2.7.0-rc6/bin/wsprd.exe {audio}
dmr_cmd: tools/dsd-neo/bin/dsd-neo.exe -fs -i {audio} -s {sr} -o null
dstar_cmd: tools/dsd-neo/bin/dsd-neo.exe -fd -i {audio} -s {sr} -o null
fsk_cmd: tools/fsk/fsk_decoder --iq {iq} --sample-rate {sr}
psk_cmd: tools/psk/psk_decoder --iq {iq} --sample-rate {sr}
web_addr: :8080
event_path: data/events.jsonl
frame_rate: 12
waterfall_lines: 200
web_root: "web"
web_root: web

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