Habdec
RTTY Decoder for SDR and HAB
Install / Use
/learn @michalfratczak/HabdecREADME
HABDEC - RTTY decoder for High Altitude Balloons

Habdec is a C++17 software to decode RTTY telemetry from High Altitude Balloons and upload it to ~~UKHAS Habitat~~ sondehub.org
Some facts:
- builds and runs on Windows/Linux and x64/RaspberryPI/OdroixXU4 platforms
- Uses SoapySDR to consume IQ stream from your SDR
- runs in command line (headless)
- provides websocket server so can be controlled from any web browser even on your phone
- can be easily integrated into your own code
- has example python client
- decodes SSDV images
Original motivation for habdec was to have a portable tracking device you could take to a chasecar or into a field. Fatty laptop with dl-fldigi, full-fledged SDR app and required internet connection is not too comfortable.
Ultimatelly habdec is intended for integration into bigger app, based on OpenStreetmap and running on portable RaspberryPI or OdroidXU4 - see here, here or here
It was successfully used to track and recover several HAB payloads. Below is an altitude graph from ARY5 flight - you can see amount of valid telemetry sentences received. One receiver was a stationary antenna, the other is car roof magmount.
Getting habdec
To get habdec you can download precompiled exec or build it from source.
Getting Binary:
There's also raspberryPi 3 image with ready to use binary and build env. Go to Wiki
Building from source:
To build habdec you need a C++17 compiler and CMake version 3.8.2 You also need to build or install some dependencies:
- basic decoder: FFTW
- websocket server: SoapySDR, boost 1.68 (any version with boost-beast)
Instructions how to build habdec and it's dependencies are described in BuildInstructions.md
Usage
habdecWebsocketServer.exe --help
Command Line Interface options:
--config arg Last run config file. Autosaved on every
successful decode.
CLI opts:
--help Display help message
--device arg SDR Device Number. -1 to list
--sampling_rate arg (=0) Sampling Rate, as supported by device
--no_exit arg Constantly retry on missing device instead of exit.
--port arg Command Port, example: --port 127.0.0.1:5555
--station arg HABHUB station callsign. Omitting this flag disables HABHUB upload.
--latlon arg station GPS location (decimal)
--alt arg station altitude in meters
--freq arg frequency in MHz
--ppm arg frequency correction in PPM
--gain arg gain
--print arg live print received chars, values: 0, 1
--rtty arg rtty: baud bits stops, example: --rtty 300 8 2
--biast arg biasT, values: 0, 1
--bias_t arg biasT, values: 0, 1
--afc arg Auto Frequency Correction, values: 0, 1
--usb_pack arg AirSpy USB bit packing
--dc_remove arg DC remove
--dec arg decimation: 2^dec, range: 0-8
--lowpass arg lowpass bandwidth in Hertz
--lp_trans arg lowpass transition width. (0-1)
--sentence_cmd arg Call external command with sentence as parameter
--sondehub arg (=https://api.v2.sondehub.org) sondehub API url
Examples:
Print available devices
habdecWebsocketServer.exe --device -1
Reading config from file ./habdecWebsocketServer.opts
Current options:
device: -1
sampling_rate: 2.048e+06
command_host: 0.0.0.0
command_port: 5,555
station: habdec
freq: 4.3435e+08
gain: 15
live_print: 1
baud: 300
rtty_ascii_bits: 8
rtty_ascii_stops: 2
biast: 0
Found Rafael Micro R820T tuner
[INFO] [UHD] Win32; Microsoft Visual C++ version 14.0; Boost_106700; UHD_3.13.0.2-1-g78745bda
Available devices:
0:
device_id 0
driver airspy
label AIRSPY [440464c8:39627b4f]
serial 440464c8:39627b4f
Sampling Rates:
2.5e+06
1e+07
1:
available Yes
driver rtlsdr
label Generic RTL2832U OEM :: 00000001
manufacturer Realtek
product RTL2838UHIDIR
rtl 0
serial 00000001
tuner Rafael Micro R820T
Found Rafael Micro R820T tuner
Sampling Rates:
250,000
1.024e+06
1.536e+06
1.792e+06
1.92e+06
2.048e+06
2.16e+06
2.56e+06
2.88e+06
3.2e+06
No SDR device specified. Select one by specifying it's NUMBER
Failed Device Setup. EXIT.
Run with AirSpy
habdecWebsocketServer.exe --device 0 --sampling_rate 2.5e6
Specify websocket address and port
habdecWebsocketServer.exe --device 0 --sampling_rate 2.5e6 -port 12.13.14.15:5555
Some more options
habdecWebsocketServer.exe --device 0 --sampling_rate 2.5e6
--port 12.13.14.15:5555 --station Fred
--rtty 300 8 2
--print 1
--freq 434.5 --gain 20 --biast 1 --afc 1
Web Client
To control habdec parameters from your browser:
- start browser
- open
habdec/code/webClient/index.htmlfile from disk - set server field ip:port and Connect
Do not try connecting directly to http://ip:port - habdec is not an HTTP server and you will see this error:
The WebSocket handshake Connection field is missing the upgrade token
Known Limitations
- RTTY Modes NOT supported: 5bit baudot, 1.5 bit stop
- SSDV images are not uploaded to http://ssdv.habhub.org
- Automatic Frequency Correction needs more work. Use consciously. dc_remove=on can help if AFC is confused by center spike.
- Connecting from browser is not very reliable yet, sometimes you need to refresh and wait.
Reporting Problems
Use bugtracker.
Authors
- Michał Frątczak - parts of code from - GQRX
License
This project is licensed under the GNU General Public License
Related Skills
node-connect
342.0kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
84.7kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
342.0kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
commit-push-pr
84.7kCommit, push, and open a PR
