Software-defined Radio Banner

Software-defined Radio

March 2022 to April 2022

Real-time Implementation
Digital Signal Processing
RDS Support
C++
Python
Project Management

Overview & Scope

A real-time implementation of a software-defined radio which includes support for both mono and stereo FM channels, as well as RDS (radio data system). Written in C++ and Python, the project processes the radio signals received through RF hardware using digital signal processing techniques, resulting in a fully useable radio!

The main objective of this project was to build a real-time implementation of a computing system while following industry-level specfications. This project is part of the "Computer Systems Integration Project" (COMPENG 3DY4) course taught by Dr. Nicola Nicolici at McMaster University.

General Technical Breakdown

For the sake of brevity, the project can be divided into three main parts.

1. RF Front-End and Mono Audio Processing

In this first part, the signal undergoes several stages of transformation. It is:

  • Filtered
  • Amplified
  • Down-converted to the intermediate sample rate

The resulting mono audio data is then further processed:

  • Upsampled
  • Filtered
  • Decimated to the audio sample rate

2. Stereo Audio Processing

The second part involves the extraction of stereo pilot tone and stereo data from the RF front-end. This is achieved using band-pass filters. The stereo pilot tone is then used in two key processes:

  • Recovering the stereo carrier
  • Mixing it with the stereo data to shift it to the center frequency

The mono path's low-pass filter and decimation/resampling are reused on the resulting data, which is subsequently passed to the stereo recombiner. The outcome of this is the generation of the left and right audio channels.

3. RDS Decoding and Application Layer

Finally, the third part, or RDS Decoding and Application Layer, involves the extraction of the RDS data. This is accomplished through:

  • Band-pass filtering
  • Squared non-linearity
  • Resampling

After the Manchester decoding and differential decoding processes, parity check and syndrome comparison are used to confirm frame synchronization. This step also allows for the extraction of the program information code, type, and service name for user display.