|
|
13 timmar sedan | |
|---|---|---|
| cmd/sdrd | 13 timmar sedan | |
| docs | 3 dagar sedan | |
| internal | 13 timmar sedan | |
| tools | 3 dagar sedan | |
| web | 14 timmar sedan | |
| .gitignore | 1 dag sedan | |
| PLAN.md | 14 timmar sedan | |
| README.md | 14 timmar sedan | |
| TODO.md | 1 dag sedan | |
| build-cuda-linux.sh | 3 dagar sedan | |
| build-cuda-windows.ps1 | 3 dagar sedan | |
| build-gpudemod-dll.ps1 | 3 dagar sedan | |
| build-sdrplay.ps1 | 2 dagar sedan | |
| config.yaml | 14 timmar sedan | |
| go.mod | 1 dag sedan | |
| go.sum | 5 dagar sedan | |
| start-sdr.ps1 | 5 dagar sedan | |
Go-based SDR analysis engine and live spectrum/waterfall UI, evolved from the original sdr-visual-suite into a more scalable foundation for wideband monitoring, candidate-driven refinement, classification, and demod/recording.
/api/gpuCore
go.mod)Optional (real device)
sdrplay_api.h + library)Optional (GPU)
nvcc for kernel build (Linux) or build-gpudemod-dll.ps1 (Windows)Windows build prerequisites (real device + GPU)
C:\msys64\mingw64\bin\gcc.exe / g++.exe) for CGO# From repo root
go run ./cmd/sdrd --mock
Open http://localhost:8080.
Edit config.yaml (autosave goes to config.autosave.yaml).
center_hz, sample_rate, fft_size, gain_db, tuner_bw_khzuse_gpu_fft, agc, dc_block, iq_balancedetector.*recorder.*decoder.*pipeline.mode -- operating mode label (legacy, wideband-balanced, ...)pipeline.profile -- last applied operating profile name (if any)pipeline.goals.* -- declarative target/intent layer for future autonomous operation
intentmonitor_start_hz / monitor_end_hz / monitor_span_hzsignal_prioritiesauto_record_classesauto_decode_classessurveillance.analysis_fft_size -- analysis FFT size used by the surveillance layersurveillance.frame_rate -- surveillance cadence targetsurveillance.strategy -- single-resolution or multi-resolutionsurveillance.display_bins -- preferred presentation density for clients/UIsurveillance.display_fps -- preferred presentation cadence for clients/UIrefinement.enabled -- enables explicit candidate refinement stagerefinement.max_concurrent -- refinement budget hintrefinement.detail_fft_size -- FFT size for refinement/detail path (defaults to surveillance analysis FFT)refinement.min_candidate_snr_db -- floor for future scheduling decisionsrefinement.min_span_hz / refinement.max_span_hz -- clamp refinement window span (0 = no clamp)refinement.auto_span -- use mod-type heuristics when candidate bandwidth is missing/oddresources.prefer_gpu -- GPU preference hintOperating profiles (wideband)
wideband-balanced: multi-resolution, 4096 surveillance/detail FFT, refinement span 4000-200000 Hzwideband-aggressive: multi-resolution, 8192 surveillance/detail FFT, refinement span 6000-250000 Hzarchive: record-forward bias, higher record/decode budgets, 4096 detail FFTdigital-hunting: digital-first priorities and decode biasresources.max_refinement_jobs -- processing budget hintresources.max_recording_streams -- recording/streaming budget hintresources.max_decode_jobs -- decode budget hintresources.decision_hold_ms -- baseline hold time for queue slots before churn (arbitration scales per profile/strategy and tags hold reasons in debug snapshots)profiles[] -- named operating profiles/intent metadataPhase 1 stays backward compatible, but the config model now reflects the intended separation between:
Refinement plans now rank candidates, while a shared arbitration step admits refinement/record/decode work based on budgets and hold policy. Arbitration reasons are normalized:
refinement:* for work item lifecycle (planned/admitted/running/completed/drop/skip)admission:* for refinement admission outcomesdecision:* for record/decode decisionsqueue:* when record/decode is deferred by budget
Hold policy reasons are surfaced as profile:* / strategy:* tokens in hold_source.Phase-1 scope stops at consistent policy surfaces, ranking/admission scaffolding, and debug visibility. Phase 2+ adds a true multi-resolution surveillance engine and scheduler/intent overrides that can re-balance budgets automatically.
The long-term target is that you describe what the system should do (for example broad-span monitoring intent, preferred signal families, auto-record/decode priorities), while the engine decides how to allocate surveillance, refinement and decoding budgets.
CFAR modes: OFF, CA, OS, GOSCA, CASO
go build ./cmd/sdrd
.\sdrd.exe --mock
$env:CGO_CFLAGS='-IC:\Program Files\SDRplay\API\inc'
$env:CGO_LDFLAGS='-LC:\Program Files\SDRplay\API\x64 -lsdrplay_api'
go build -tags sdrplay ./cmd/sdrd
.\sdrd.exe -config config.yaml
powershell -ExecutionPolicy Bypass -File .\build-cuda-windows.ps1
powershell -ExecutionPolicy Bypass -File .\build-sdrplay.ps1
This path:
gpudemod_kernels.dll (MSVC/nvcc)sdrplay,cufftsdrd.exeNotes:
build-sdrplay.ps1 expects MinGW at C:\msys64\mingw64\binGPUMOD_DLL=C:\path\to\gpudemod_kernels.dllexport CGO_CFLAGS='-I/opt/sdrplay_api/include'
export CGO_LDFLAGS='-L/opt/sdrplay_api/lib -lsdrplay_api'
go build -tags sdrplay ./cmd/sdrd
./cmd/sdrd/sdrd -config config.yaml
./build-cuda-linux.sh
GET /api/configPOST /api/configPOST /api/sdr/settingsGET /api/gpuGET /api/pipeline/policyGET /api/pipeline/recommendationsGET /api/refinement -> latest refinement plan/windows snapshot (includes window_stats, levels, request/context/work_items, plus arbitration with budgets/hold policy/refinement admission/queue/decision summary)GET /api/signals -> current live signalsGET /api/events?limit=&since= -> recent eventsGET /api/recordingsGET /api/recordings/:id (meta.json)GET /api/recordings/:id/iqGET /api/recordings/:id/audioGET /api/recordings/:id/decode?mode=FT8|WSPR|DMR|D-STAR|FSK|PSKGET /api/demod?freq=...&bw=...&mode=...&sec=... -> audio/wavWS /ws/audio?freq=...&bw=...&mode=... -> live PCM audio streamPut external decoder binaries/scripts under tools/ and configure decoder.* in config.yaml.
Placeholders: {iq}, {audio}, {sr}.
See tools/README.md for examples.
go test ./...
sdrplay support not built -> rebuild with -tags sdrplay.CGO_CFLAGS / CGO_LDFLAGS.gpudemod_kernels.dll / cudart64_13.dll next to sdrd.exe (Windows).--mock to run without hardware.