diff --git a/PLAN.md b/PLAN.md index b6c0063..347b2bf 100644 --- a/PLAN.md +++ b/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 --- diff --git a/README.md b/README.md index f62b91b..957e52a 100644 --- a/README.md +++ b/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 --- diff --git a/config.yaml b/config.yaml index f4646d2..22bbad3 100644 --- a/config.yaml +++ b/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