- Introduction
- Quick start
- Compatibility
- Manual setup
- Install odr-mmbTools & project
- Operations
- Configuration
- Troubleshooting & tips
- Acknowledgements & references
This project runs a DAB / DAB+ transmitter using a Raspberry Pi (or a Debian virtual host) together with a SoapySDR-compatible transceiver (e.g. HackRF One, LimeSDR). It uses the odr-mmbTools stack (Open Digital Radio) to encode, multiplex and modulate a micro-DAB ensemble.
Requirements (overview)
- Raspberry Pi (recommended: Pi 3 or Pi 4) or a Debian virtual machine.
- A SoapySDR-compatible TX device (HackRF One, LimeSDR, PlutoSDR, etc.).
- Network access for package installation and streaming sources.
Copy/paste the commands below on your target device after following the manual setup section.
# update packages
sudo apt-get update && sudo apt-get upgrade -y
# install git and clone the project
sudo apt-get install -y git
cd ~
git clone https://github.com/StefCoders/rpi-dab-tx.git
# run installer
bash rpi-dab-tx/install.shNotes
- Monitor the install script output in the same terminal to spot errors (the script prints progress & errors).
- The project web UIs run on the host at ports 8001–8003 (see Operations).
- Raspberry Pi 1 — ❌ Too slow
- Raspberry Pi 2 — ❓ Slow, untested
- Raspberry Pi 3 — ✅ Works (tested). Up to ~4 streams, more may crash under heavy load.
- Raspberry Pi 4 — ✅ Recommended for best performance.
- Raspberry Pi 5 — ✅ Recommended
- Raspberry Pi Zero / Zero W / 2W — ❌ Not recommended (slow, no ports).
This project:
- Uses odr-mmbtools (Open Digital Radio)
- Uses SoapySDR for hardware abstraction
- Provides sample configs (example: 2 services in a Micro DAB)
- Download and run Raspberry Pi Imager on your computer:
https://www.raspberrypi.com/software/ - In the Imager: Choose OS → Raspberry Pi OS (other) → Raspberry Pi OS Lite (32-bit or 64-bit).
- Choose your SD card and write the image.
- Optionally set SSH / user in Imager's advanced options (or use default
pi/raspberry). - Insert the SD card into the Pi and boot.
- Log in (default:
pi/raspberry) and run:sudo apt-get update && sudo apt-get upgrade -y
- Install VirtualBox: https://www.virtualbox.org/wiki/Downloads
- Install the VirtualBox Extension Pack.
- Install Vagrant: https://www.vagrantup.com/
- Start VirtualBox.
- Copy the
Vagrantfilefrom this repository to your host machine (orgit cloneon host). - From the folder with
Vagrantfilerun:vagrant up vagrant ssh
- Inside the VM run:
sudo apt-get update && sudo apt-get upgrade -y - Exit the VM:
exit
To attach your SoapySDR USB device to the VM: add a USB filter in VirtualBox for your device (name it e.g.dab_tx), thenvagrant haltandvagrant upagain so the VM sees the device.
-
(Optional but recommended) change the default user password:
passwd
If you used the Vagrant VM: default user is
vagrant/vagrant. -
Set the timezone:
timedatectl list-timezones sudo timedatectl set-timezone "Your/Timezone"(example:
sudo timedatectl set-timezone Europe/London) -
Clone the repository (production):
cd ~ sudo apt-get install -y git git clone https://github.com/StefCoders/rpi-dab-tx.git
Or clone the
devbranch (bleeding edge):git clone https://github.com/StefCoders/rpi-dab-tx.git --branch dev
-
Run the installer:
bash ~/rpi-dab-tx/install.shThe installer prints progress and errors to the terminal; monitor the output and fix any missing package errors if they appear.
- Supervisor web interface (start/stop services):
http://raspberrypi.local:8001(orhttp://<host-ip>:8001)- Default credential:
odr/odr
- Multiplex Manager:
http://raspberrypi.local:8002(defaultodr/odr) - Encoder Manager:
http://raspberrypi.local:8003(defaultodr/odr)
Replace
raspberrypi.localwith your host IP if mDNS is not available.
- Encoder Manager — Manage audio streams and PAD data (web UI).
- Audio Encoder — One per service; encodes audio stream and combines PAD data.
- PAD Encoder — Collects metadata (artist, song, logo) for a service.
- Multiplexer — Packs encoded services into a DAB ensemble (Micro DAB).
- Multiplex Manager — Tune multiplex-level parameters (web UI).
- Modulator — Converts multiplex output into IQ samples for the SDR.
- SDR transceiver — The physical device that transmits RF (configured via SoapySDR).
- Start encoder(s) (audio + PAD) first.
- Start the multiplexer.
- Start the modulator last.
- Stop the multiplexer first — this allows the modulator to stop cleanly.
- After the modulator has stopped, stop encoders or use STOP ALL.
- From the Supervisor web UI you can view
Tail -f stdout/Tail -f stderrfor each process. - From the shell, use
supervisorctl(if installed) or check process logs where they are written.
Edit the Supervisor configuration if you want to change the UI credentials.
Recommended: edit the file with an editor:
sudo nano /etc/supervisor/supervisord.confFind the [inet_http_server] block (or the relevant auth lines) and change username and password.
Quick sed (example — replace placeholders):
sudo sed -i -E 's/^(username[[:space:]]*=[[:space:]]*)odr/\1NEWUSERNAME/' /etc/supervisor/supervisord.conf
sudo sed -i -E 's/^(password[[:space:]]*=[[:space:]]*)odr/\1NEWPASSWORD/' /etc/supervisor/supervisord.confEditing the file with
nanois safer if you are not comfortable withsed.
Edit $HOME/dab/conf-em.json to change the web UI credentials:
sed -i 's/"username": "odr"/"username": "NEWUSER"/' $HOME/dab/conf-em.json
sed -i 's/"password": "odr"/"password": "NEWPASS"/' $HOME/dab/conf-em.jsonRestart the related services after changing credentials.
Edit $HOME/dab/mod.ini and make these changes:
[modulator]
rate=4096000
[firfilter]
enabled=1(You can edit with nano $HOME/dab/mod.ini or use sed to change values.)
If 5A is in use locally, pick a free DAB channel for your area and update mod.ini. Example: change from 5A → 6A:
sed -i 's/^channel=5A/channel=6A/' $HOME/dab/mod.iniCheck local/regulatory rules before transmitting RF — make sure you have permission and operate on allowed frequencies.
Default config targets HackRF. To switch drivers in mod.ini:
# LimeSDR
sed -i 's/device=driver=hackrf/device=driver=lime/' $HOME/dab/mod.ini
# PlutoSDR
sed -i 's/device=driver=hackrf/device=driver=plutosdr/' $HOME/dab/mod.iniAlso review SoapySDR docs for your device and fine-tune parameters like txgain.
Edit $HOME/dab/conf.mux and change label and shortlabel in the ensemble block to rename the Micro DAB.
- Start the Multiplex Manager (Supervisor job:
21-Multiplex-Manager). - Open
http://raspberrypi.local:8002(orhttp://<host-ip>:8002) to edit multiplex settings.
- Start
10-EncoderManager(Supervisor job). - Open
http://raspberrypi.local:8003to manage audio streams and PAD entries. - Use a radio stream URL (e.g. from Radio Browser) and test it locally with VLC before adding it to the encoder config.
Open $HOME/dab/conf.mux and edit the service blocks (srv-01, srv-02, etc.). Update:
id,ecclabel,shortlabelpty,language
Follow ETSI TS 101 756 for service metadata values.
- Installer seems to hang / errors: re-run the installer to capture errors or inspect the last lines in the terminal. Check
dmesg,journalctl, and Supervisor logs. - SDR device not found in VM: ensure you added a VirtualBox USB filter and USB device is claimed by the VM (plug/unplug after adding filter).
- High CPU usage: reduce
rateinmod.ini, disable FIR filter, or move to a more powerful host (Pi 4 or a small x86 VM). - Audio stream fails: test the stream URL in VLC on your desktop before adding it to the encoders.
- Permissions: many operations require
sudo— if in doubt, run commands withsudo.
- odr-mmbTools / Open Digital Radio: https://www.opendigitalradio.org/mmbtools
- SoapySDR project: https://github.com/pothosware/SoapySDR/wiki
- Raspberry Pi: https://www.raspberrypi.com/
- ETSI TS 101 756 (DAB metadata guidelines): https://www.etsi.org/deliver/etsi_ts/101700_101799/101756/
Change log
- Repository and credits updated to StefCoders.
- Document restructured and cleaned for clarity.
- Commands fixed and clarified; removed duplicated sections.
originally by collise
