OFDM-Based Digital Voice Transmission System with PlutoSDR

OFDM-Based Digital Voice Transmission System with PlutoSDR

A complete walkthrough of building a digital voice transmission system using OFDM modulation on PlutoSDR — covering system architecture, PCM encoding, convolutional coding, frame synchronization, channel estimation, and signal recovery.

Introduction to OFDM

OFDM (Orthogonal Frequency Division Multiplexing) is a multi-carrier digital modulation technique that divides a communication channel into multiple narrower sub-channels and transmits data simultaneously across them. Each sub-channel operates at a lower data rate, but by using many sub-channels in parallel, a high overall data rate is achieved.

Note: This article focuses on system implementation. Readers unfamiliar with OFDM fundamentals are encouraged to study the basics first. The author plans to publish a dedicated OFDM fundamentals tutorial in the future.

System Overview

The complete system features a UI interface for controlling wireless data transmission. The system transmits pre-recorded voice files, with user-selectable modulation schemes. Unlike previous versions, this implementation includes channel coding — specifically convolutional coding — to improve reliability by correcting random errors caused by the wireless channel environment.

Key features:

  • UI interface for file selection and modulation configuration
  • Selectable convolutional coding rate (redundancy control)
  • Configurable sampling rate and carrier center frequency
  • OFDM with 1024 subcarriers + pilot tones for channel estimation
  • CA sequence preamble for frame synchronization

System Parameters

The following MATLAB code configures the PlutoSDR transmission and reception parameters. Adjust center frequency and sample rate according to your wireless environment.

% Transmitter configuration
txPluto = sdrtx('Pluto', 'RadioID', 'usb:0', ...
         'CenterFrequency', center_freq, ...
         'BasebandSampleRate', sample_rate, ...
         'ChannelMapping', 1);

% Receiver configuration
rxPluto = sdrrx('Pluto', 'RadioID', 'usb:0', ...
         'CenterFrequency', center_freq, ...
         'BasebandSampleRate', sample_rate, ...
         'ChannelMapping', 1, ...
         'OutputDataType', 'double', ...
         'GainSource', 'Manual', ...
         'Gain', Gain);

PCM Encoding: Analog to Digital Conversion

Voice signals are analog. For digital transmission, they must first be sampled and then PCM (Pulse Code Modulation) encoded. PCM follows the Nyquist sampling theorem — sampling at least twice the highest signal frequency — then quantizes each sample into discrete levels and encodes them as binary digits. This implementation uses 8‑segment quantized PCM, converting the voice signal into a binary bitstream.


(Refer to the original article for the PCM encoding flowchart)

PCM preserves signal integrity without compression, providing high-quality audio transmission. Different sampling frequencies and quantization bit depths can be selected based on application requirements.

Channel Coding: Convolutional Coding

Convolutional coding improves reliability by adding redundant information at the transmitter, enabling the receiver to detect and correct a certain number of errors. The encoder's state depends on previously input data symbols — output depends not only on the current input but also on a history of past inputs. The system allows user‑selectable coding rates, controlling the efficiency of redundancy addition.

OFDM Modulation

After PCM encoding and convolutional coding, the data bits are modulated into symbols. These symbols are then mapped to data subcarriers. The system uses OFDM symbols with 1024 subcarriers:

  • Data subcarriers: Carry the actual payload data
  • Pilot subcarriers: Used for channel estimation
  • Guard band: Only a subset of subcarriers are used to reduce out‑of‑band emission

(Refer to the original article for the spectrum plot)

Frame Synchronization with CA Sequence Preamble

Before transmission, a synchronization preamble is added to each data frame. The preamble uses a CA sequence whose autocorrelation properties enable reliable frame detection at the receiver.


(Refer to the original article for the received signal plot)

The received signal clearly distinguishes between signal and noise. Frame synchronization uses the preamble sequence:

Frame Synchronization Result — Red line shows decision threshold;
high pulses indicate frame start positions
(Refer to the original article for the synchronization plot)

Receiver Processing Chain

Once frame synchronization is complete, the receiver performs:

  1. OFDM demodulation
  2. Channel estimation using pilot subcarriers
  3. Frequency offset estimation and correction
  4. Symbol demodulation

(Refer to the original article for the constellation plot)

Decoding & Signal Recovery

After demodulation, the system performs:

  • Convolutional decoding to recover the original bitstream
  • PCM decoding to reconstruct the analog voice signal

(Refer to the original article for the bit error comparison plot)

(Refer to the original article for the recovered waveform)
Key takeaway: Digital voice transmission based on OFDM offers significantly improved reliability compared to analog systems. The bit error rate is low, making it suitable for high‑quality data transmission.

Project Files & Resources

The complete project files, including MATLAB code and documentation, are available upon request. Feel free to reach out for discussion or clarification.

Hardware Support

This system is designed for the PlutoSDR platform. For a ready‑to‑use PlutoSDR with full frequency support (70MHz–6GHz):



Previous post

Hinterlasse einen Kommentar