A .NET 10 Software-Defined Radio (SDR) receiver for DAB+ and FM broadcasts
RadI0 is a cross-platform software-defined radio receiver for DAB+ and FM radio broadcasts, built with .NET 10. It uses an RTL-SDR dongle to capture and demodulate radio signals, providing a terminal-based interface for tuning, playing, recording, and streaming audio.
- Download
- Features
- Requirements
- Installation
- Usage
- NuGet packages used by RadI0
- Build from Source
- License
| Linux (arm) | Linux (arm64, Raspberry Pi) | Linux (x64) | Windows (arm64) | Windows (x64) | Windows (x86) |
|---|---|---|---|---|---|
- OFDM Demodulator (Fast Fourier Transform)
- Viterbi convolution decoding
- Reed–Solomon forward error correction
- FIC channel data parsing
- ADTS stream demodulation
- AAC recording
- PCM recording (using faad2 for converting AAC => PCM)
- UDP streaming support (ADTS aac for DAB+)
- Service number-based tuning
- PAD dynamic label parsing
- MOT slideshow (images are saved to user's folder pictures/RadI0)
- Mono/Stereo FM demodulation
- PCM WAVE recording
- RDS RadioText parsing
- Terminal-based GUI (Terminal.GUI)
- Cross-platform: Linux & Windows support
- Audio playback via libVLC
- RTL-SDR Dongle: RTL2832U-based USB receiver (e.g., RTL-SDR Blog V3, NooElec NESDR, ASTROMETA USB Dongle)
- Antenna: Standard telescopic or dipole antenna (suitable for 88-108 MHz FM and 174-240 MHz DAB+)
- USB Port: For connecting the RTL-SDR dongle
- .NET Runtime: .NET 10 or later
- Operating System: Linux (Ubuntu, Debian, etc.) or Windows
- External Dependencies:
RadI0 supports remote signal processing by connecting to an rtl_tcp instance. This allows you to set up your RTL-SDR dongle and antenna in a location with optimal reception and run the RadI0 receiver interface on a different machine anywhere in the world.
[!WARNING]
High Bandwidth Required: Using this feature requires a very stable and high-speed network connection. Because raw I/Q samples are transferred over the network, the data throughput for DAB+ is approximately 30 Mbit/s. Ensure your internet bandwidth can support this sustained rate to avoid signal stuttering or synchronization loss.
- Start
rtl_tcpon the remote machine (Linux or Windows with an RTL-SDR USB dongle connected and a good signal antenna attached):
rtl_tcp -a 0.0.0.0 -p 1234
- Go to Menu → Connect to RTL TCP and enter the IP address of the remote machine.
-
Linux
sudo apt-get install libfaad2 rtl-sdr libasound2 libasound2-dev libvlc-dev vlc libvlc-bin libvlc-dev
- extract release archive package (tar.xz)
-
Windows
- install RTL2832U driver (Zadig)
- download rtl-sdr windows binaries (https://ftp.osmocom.org/binaries/windows/rtl-sdr/)
- download (or build from source)
libfaad2.dll - Modify PATH varible (or copy
libfaad2.dllandrtl-sdrto suitable folder) to make the libraries visible ( I'm using this Windows folderc:\users\petrj\\.dotnet\Toolswith these files:libfaad2.dlllibfaad2_dll.dlllibrtlsdr.dlllibusb-1.0.dlllibwinpthread-1.dllrtl_tcp.exe) - extract release archive package (7z)
Tune 8D frequency
./RadI0 -dab -f 8D
Tune 8C frequency and play radio corresponding to service number 1175:
./RadI0 -dab -f 8C -sn "1175"
Tune 8C frequency, play radio corresponding to service number 1175 and save audio to PCM wave:
./RadI0 -dab -f 8C -sn "1175" -wave /tmp/radio.wave
Stream DAB audio to UDP:
./RadI0 -f 8C -sn 1175 -udp 127.0.0.1:8020
Note: The stream (ADTS aac format) can be played by VLC or mplayer:
cvlc udp://@:8020 :demux=aac mplayer -nocache -demuxer aac udp://127.0.0.1:8020
RadI0 broadcasts real-time status information as JSON over UDP, allowing other applications to monitor and display radio information (frequency, station name, DLS/RDS data, etc.) independently.
To enable UDP status streaming, add the -stat IP:Port command line option:
./RadI0 -f 8C -sn 1175 -stat 127.0.0.1:5000
Example JSON status message:
{
"status": "Connected",
"name": "BBC Radio 1",
"freq": "11A",
"dynamicLabel": "Beatles - Yestarday"
}Short PowerShell receiver example:
$udp = New-Object System.Net.Sockets.UdpClient(5000)
$remote = New-Object System.Net.IPEndPoint([System.Net.IPAddress]::Any,0)
$data = $udp.Receive([ref]$remote)
$text = [System.Text.Encoding]::UTF8.GetString($data)
$json = ConvertFrom-Json $text
Write-Host "Status: $($json.status) Frequency: $($json.freq) Station: $($json.name)"This feature allows you to build custom display applications, dashboards, and monitoring tools that consume this data. A complete example of consuming this data is available in the PowerShell display example script, which listens on UDP port 5000 and displays the radio information on a 2-line customer display.
Export DAB audio to AAC file:
./RadI0 -f 7C -sn 3889 -aac MyDABRadioRecord.aac
Tune and play 104 MHz
./RadI0 -fm -f "104 MHz"
Export FM audio to WAVE file:
./RadI0 -fm -if FM.raw -wave MyFMRadioRecord.wave
RadI0 builds on several public library packages from this repository. These packages are publicly available and can be reused in other .NET projects for RTL-SDR hardware access, audio playback, FM demodulation, DAB+ decoding, and shared common functionality.
- Provides low-level RTL-SDR driver support, USB dongle control, and device state handling.
- Provides shared DSP utilities, audio data structures, thread worker helpers, and common event types.
- Provides audio playback and buffering abstractions for different platforms, plus AAC decoding support.
- Provides FM demodulation and stereo decoding.
- Provides DAB+ signal processing, ensemble and service discovery, AAC frame extraction, and DAB service handling.
- Powershell module helping build and deploy RadI0
-
Create a Personal Access Token on GitHub
- Go to: https://github.com/settings/tokens
- Create a token (classic) with at least:
read:packagesscope
-
Add the NuGet source:
dotnet nuget add source \
--username YOUR_GITHUB_USERNAME \
--password YOUR_PERSONAL_ACCESS_TOKEN \
--store-password-in-clear-text \
--name github \
"https://nuget.pkg.github.com/petrj/index.json"dotnet restoredotnet publish -c Release -r linux-x64
dotnet publish -c Release -r linux-arm64
dotnet publish -c Release -r linux-arm
dotnet publish -c Release -r win-x64
dotnet publish -c Release -r win-x86
dotnet publish -c Release -r win-arm64Ask user:
pwsh ./Clear.ps1Select runtime:
pwsh ./MakeRelease.ps1Available Runtimes:
1) linux-x64
2) linux-arm64
3) linux-arm
4) win-x64
5) win-x86
6) win-arm64
Select Runtime [default: 1]:Specific runtime:
pwsh ./MakeRelease.ps1 -Runtime linux-x64All available runtimes:
pwsh ./MakeRelease.ps1 -Clear -AllRuntimes./MakeRelease.ps1 -Clear -AllRuntimesNuGet packages used by RadI0 are used in DVBTTelevizor. Through this actively developed application, you can also listen to digital radio directly on Android devices.
GNU GPL v2. See the LICENSE file for details.
Contributions are welcome! Please feel free to submit issues or pull requests to improve RadI0.







