Initial commit: bandsaunter, an RTL-SDR signal scanner
Sweeps any set of frequency ranges, records what it finds, and works out what kind of signal it was. - Frequency ranges entered by hand or picked from a 135-entry US band plan, including whole-band and all-CW sweeps that resolve the demodulator per segment. - Detection calibrated against the peak-hold detector's own noise statistics, so the threshold means real margin over static rather than over the floor. - A content gate: captures are kept only if they carry voice, decodable CW, or an identified digital keying scheme. Speech is recognised by a pitch track that drifts, which static cannot imitate. - Identification of NFM/WFM/AM/SSB, CW with Morse decoded to text, P25, DMR, NXDN, D-STAR, POCSAG, FLEX, ACARS, AIS, APRS, n-FSK and n-PSK. - Gapless streaming capture, with the signal path fast enough to keep up in real time, so recordings play back at the right speed. - Optional one-file-per-frequency recording with spoken timestamps, and speech-to-text transcription. - Menus and command line generated from one settings table, so neither can offer something the other cannot; settings persist in ~/.config. 367 tests, run against synthetic signals, a built-in receiver simulator, and real hardware. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
commit
db3e0c79b9
39 changed files with 13473 additions and 0 deletions
41
pyproject.toml
Normal file
41
pyproject.toml
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
[build-system]
|
||||
requires = ["setuptools>=64"]
|
||||
build-backend = "setuptools.build_meta"
|
||||
|
||||
[project]
|
||||
name = "bandsaunter"
|
||||
version = "1.0.0"
|
||||
description = "Signal scanner, recorder and identifier for RTL-SDR receivers"
|
||||
readme = "README.md"
|
||||
requires-python = ">=3.10"
|
||||
license = {text = "MIT"}
|
||||
dependencies = [
|
||||
"numpy>=1.22",
|
||||
"scipy>=1.8",
|
||||
"rich>=12.0",
|
||||
"PyYAML>=5.4",
|
||||
]
|
||||
|
||||
[project.optional-dependencies]
|
||||
plots = ["matplotlib>=3.5"]
|
||||
dev = ["pytest>=7.0"]
|
||||
# Speech recognition for --transcribe. Optional: transcription is off by
|
||||
# default, and the scan says so plainly when no recogniser is installed.
|
||||
transcribe = ["faster-whisper>=1.0"]
|
||||
transcribe-small = ["vosk>=0.3"]
|
||||
|
||||
# System packages, which pip cannot install. Recorded here so packaging does
|
||||
# not have to rediscover them:
|
||||
# Depends: librtlsdr0 -- the dongle is unreachable without it
|
||||
# Recommends: espeak-ng -- clearer spoken timestamps; a built-in
|
||||
# synthesiser is used when absent
|
||||
|
||||
[project.scripts]
|
||||
bandsaunter = "bandsaunter.cli:main"
|
||||
|
||||
[tool.setuptools.packages.find]
|
||||
include = ["bandsaunter*"]
|
||||
|
||||
[tool.pytest.ini_options]
|
||||
testpaths = ["tests"]
|
||||
filterwarnings = ["ignore::DeprecationWarning"]
|
||||
Loading…
Add table
Add a link
Reference in a new issue