Skip to main content

OFDM in MATLAB


MATLAB Script: Simple OFDM System

The following code provides a fundamental implementation of an OFDM system including initialization, data generation, pilot insertion, and modulation.

1. Initialization

Clearing the workspace and command window to ensure a clean run.

MATLAB
clc;
clear all;
close all;

% 2. Generate Random Bits
numBits = 100;
bits = randi([0, 1], 1, numBits);

% 3. Define Parameters
numSubcarriers = 4; 
numPilotSymbols = 3; 
cpLength = ceil(numBits / 4); 

% 4. Add Cyclic Prefix
dataWithCP = [bits(end - cpLength + 1:end), bits];

% 5. Insert Pilot Symbols
pilotSymbols = ones(1, numPilotSymbols); 
dataWithPilots = [pilotSymbols, dataWithCP];

% 6. Perform OFDM Modulation (IFFT)
dataMatrix = reshape(dataWithPilots, numSubcarriers, []);
ofdmSignal = ifft(dataMatrix, numSubcarriers);
ofdmSignal1 = reshape(ofdmSignal, 1, []);

% 7. Display the Generated Data
disp("Original Bits:");
disp(bits);
disp("Data with Cyclic Prefix and Pilots:");
disp(dataWithPilots);
disp("OFDM Signal:");
disp(ofdmSignal1);

%%%%%%%%%%%%%%%%%%%%%%%%%%% Demodulation %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% 8. Demodulation
ofdmSignal = reshape(ofdmSignal1, numSubcarriers, []);
rxSignal = fft(ofdmSignal, numSubcarriers);

% 9. Remove Cyclic Prefix
rxSignalNoCP = rxSignal(cpLength + 1:end);

% 10. Extract Data Symbols
dataSymbols = rxSignalNoCP(numPilotSymbols + 1:end);

% 11. Demodulate using Thresholding
threshold = 0;
demodulatedBits = (real(dataSymbols) > threshold);

% 12. Plotting
figure(1)
stem(bits);
legend("Original Information Bits")

figure(2)
hReal = stem(real(ofdmSignal1), 'r', 'DisplayName', 'Real Part');
hold on;
hImag = stem(imag(ofdmSignal1), 'b', 'DisplayName', 'Imaginary Part');
grid on;
title('Real and Imaginary Parts of OFDM Signal');
xlabel('Index');
ylabel('Amplitude');
legend;
hold off;

figure(3)
stem(demodulatedBits);
legend("Received Bits")
Original Bits
Fig 1: Original Information Bits
OFDM Signal
Fig 2: OFDM Signal (Time Domain)
Received Bits
Fig 3: Received Demodulated Bits

Ready to Learn More?

Explore our comprehensive guide on OFDM implementation and wireless communication systems.

View OFDM Simulator →

MATLAB Code for OFDM using QPSK

This script demonstrates OFDM implementation using Quadrature Phase Shift Keying (QPSK) modulation.

MATLAB (QPSK)
% The code is written by SalimWireless.Com
clc;
clear all;
close all;

% Generate random bits (must be even for QPSK)
numBits = 20;
if mod(numBits, 2) ~= 0
numBits = numBits + 1; % Make even
end
bits = randi([0, 1], 1, numBits);

% QPSK Modulation (2 bits per symbol)
bitPairs = reshape(bits, 2, []).';
qpskSymbols = (1/sqrt(2)) * ((2*bitPairs(:,1)-1) + 1j*(2*bitPairs(:,2)-1)); % Gray-coded

% Parameters
numSubcarriers = 4; % Number of OFDM subcarriers
numPilotSymbols = 3; % Number of pilot symbols
cpLength = ceil(length(qpskSymbols) / 4); % Cyclic prefix length

% Insert pilot symbols
pilotSymbols = ones(1, numPilotSymbols); % Example pilot symbols (BPSK pilots)
dataWithPilots = [pilotSymbols, qpskSymbols.'];

% Add cyclic prefix
dataWithCP = [dataWithPilots(end - cpLength + 1:end), dataWithPilots];

% Reshape and perform IFFT (OFDM modulation)
dataMatrix = reshape(dataWithCP, numSubcarriers, []);
ofdmSignal = ifft(dataMatrix, numSubcarriers);
ofdmSignal1 = reshape(ofdmSignal, 1, []);

% Display
disp("Original Bits:");
disp(bits);
disp("QPSK Symbols:");
disp(qpskSymbols.');
disp("Data with CP and Pilots:");
disp(dataWithCP);
disp("OFDM Signal:");
disp(ofdmSignal1);

%%%%%%%%%%%%%%%%%%%%%%%%%%% Demodulation %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% Reshape back to subcarrier-wise blocks and FFT
ofdmRxMatrix = reshape(ofdmSignal1, numSubcarriers, []);
rxSignal = fft(ofdmRxMatrix, numSubcarriers);

% Remove cyclic prefix
rxSignal1D = reshape(rxSignal, 1, []);
rxSignalNoCP = rxSignal1D(cpLength + 1:end);

% Remove pilots
rxDataSymbols = rxSignalNoCP(numPilotSymbols + 1:end);

% QPSK Demodulation
demodBits = zeros(1, 2*length(rxDataSymbols));
demodBits(1:2:end) = real(rxDataSymbols) > 0;
demodBits(2:2:end) = imag(rxDataSymbols) > 0;

%%%%%%%%%%%%%%%%%%%%%%%%%%% Plotting %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

figure(1)
stem(bits);
title("Original Bits");
xlabel("Bit Index"); ylabel("Bit Value");
legend("Original Bits");

figure(2)
hReal = stem(real(ofdmSignal1), 'r', 'DisplayName', 'Real Part');
hold on;
hImag = stem(imag(ofdmSignal1), 'b', 'DisplayName', 'Imaginary Part');
set(hReal, 'Marker', 'o', 'LineWidth', 1.5);
set(hImag, 'Marker', 'x', 'LineWidth', 1.5);
grid on;
title('OFDM Signal (Time Domain)');
xlabel('Sample Index');
ylabel('Amplitude');
legend;
hold off;

figure(3)
stem(demodBits);
title("Demodulated Bits");
xlabel("Bit Index"); ylabel("Bit Value");
legend("Demodulated Bits");

% Optional: Calculate BER
numErrors = sum(bits ~= demodBits);
ber = numErrors / numBits;
fprintf("Bit Error Rate (BER): %.4f\n", ber);

MATLAB Code for OFDM (using 16-QAM)

Implementation using 16-QAM modulation and the Cooley-Tukey algorithm logic for FFT/IFFT.

MATLAB (16-QAM)
% The code is written by SalimWireless.Com 
  clc;
clear all;
close all;

% OFDM System with 16-QAM

% Parameters
N = 64;        % Number of OFDM subcarriers
M = 16;        % Modulation order (16-QAM -> M = 16)
nSymbols = 100;% Number of OFDM symbols
Ncp = 16;      % Length of cyclic prefix

% Generate random data for transmission (0 to M-1 for 16-QAM)
data = randi([0 M-1], nSymbols, N);

% 16-QAM modulation of the data using custom function
modData = zeros(nSymbols, N);
for i = 1:nSymbols
    modData(i, :) = qammod(data(i, :), M);
end

% Perform IFFT to generate the time domain OFDM signal
ofdmTimeSignal = zeros(size(modData));
for i = 1:nSymbols
    ofdmTimeSignal(i, :) = ifft(modData(i, :));
end

% Add cyclic prefix
cyclicPrefix = ofdmTimeSignal(:, end-Ncp+1:end); % Extract cyclic prefix
ofdmWithCP = [cyclicPrefix ofdmTimeSignal];      % Add cyclic prefix to the signal

%% Plot Subcarriers in Frequency Domain (before IFFT)
figure;
stem(0:N-1, abs(modData(100, :))); % Plot absolute value of the subcarriers for the first symbol
title('Subcarriers in Frequency Domain for 1st OFDM Symbol (Before IFFT)');
xlabel('Subcarrier Index');
ylabel('Magnitude');

%% Plot Time Domain OFDM Signal (after IFFT)
figure;
plot(real(ofdmTimeSignal(1, :))); % Plot real part of the OFDM time signal for the first symbol
title('OFDM Signal in Time Domain for 1st OFDM Symbol (Without CP)');
xlabel('Time Sample Index');
ylabel('Amplitude');

%% Plot Time Domain OFDM Signal with Cyclic Prefix
figure;
plot(real(ofdmWithCP(1, :))); % Plot real part of the OFDM time signal with CP for the first symbol
title('OFDM Signal in Time Domain for 1st OFDM Symbol (With Cyclic Prefix)');
xlabel('Time Sample Index');
ylabel('Amplitude');

%% Receiver Side - Remove Cyclic Prefix and Demodulate
% Remove cyclic prefix
receivedSignal = ofdmWithCP(:, Ncp+1:end); % Remove cyclic prefix

% Apply FFT to recover the received subcarriers (back to frequency domain)
receivedSubcarriers = zeros(size(receivedSignal));
for i = 1:nSymbols
    receivedSubcarriers(i, :) = fft(receivedSignal(i, :));
end

% 16-QAM Demodulation of the received subcarriers using custom function
receivedData = zeros(nSymbols, N);
for i = 1:nSymbols
    receivedData(i, :) = qamdemod(receivedSubcarriers(i, :), M);
end

% Calculate symbol errors
numErrors = sum(data(:) ~= receivedData(:));
fprintf('Number of symbol errors: %d\n', numErrors);

%% Plot Received Subcarriers in Frequency Domain (after FFT at the receiver)
figure;
stem(0:N-1, abs(receivedSubcarriers(100, :))); % Plot absolute value of received subcarriers for the first symbol
title('Received Subcarriers in Frequency Domain for 1st OFDM Symbol (After FFT)');
xlabel('Subcarrier Index');
ylabel('Magnitude');

%% Plot Transmitted Data Constellation (Before IFFT)
figure;
scatterplot(modData(1, :)); % Plot for the first OFDM symbol
title('Transmitted 16-QAM Symbols for 1st OFDM Symbol');
xlabel('In-phase');
ylabel('Quadrature');

%% Plot Received Data Constellation (After Demodulation)
receivedModData = qammod(receivedData(1, :), M); % Map back for plotting
figure;
scatterplot(receivedModData);
title('Received 16-QAM Symbols for 1st OFDM Symbol');
xlabel('In-phase');
ylabel('Quadrature');
OFDM Subcarriers
Constellation


Contact Us

Name

Email *

Message *

Popular Posts

LDPC Encoding and Decoding Techniques

Low Density Parity Check (LDPC) Guide Comprehensive analysis of linear error-correcting block codes, Tanner graphs, and 5G-NR implementations. ๐Ÿ“˜ Overview ๐Ÿงฎ Encoding ๐Ÿงฉ Decoding ๐Ÿ“š Resources Theory Encoding Tech Tanner Graph 5G Encoding Decoding 'LDPC' is the abbreviation for 'low density parity check'. LDPC code H matrix contains very few amount of 1's and mostly zeroes. LDPC codes are error correcting code. Using LDPC codes, channel capacities that are close to the theoretical Shannon limit can be achieved. Low density parity check (LDPC) codes are linear error-correcting block code suitable for error correction in a large block sizes transmi...

Q-function in BER vs SNR Calculation (with Simulation)

Q-function in BER vs. SNR Calculation In digital communications and signal processing, the Q-function plays a significant role in predicting system reliability. It allows engineers to quantify the probability that Gaussian noise will exceed a specific threshold, causing a bit error. What is the Q-function? The Q-function is a mathematical function representing the tail probability of the standard normal (Gaussian) distribution. It is the complementary cumulative distribution function (CCDF) of a standard Gaussian distribution. Q(x) = (1 / √(2ฯ€)) ∫โ‚“∞ e^(-t² / 2) dt The Role of the Q-function in BER vs. SNR The Q-function is the standard tool for calculating BER in systems like BPSK or QPSK over AWGN (Additive White Gaussian Noise) channels. For BPSK: In BPSK, we transmit +√E b (bit 1) and -√E b (bit 0). The decision boundary is set at 0 . If -√E b was sent, an error occurs if noise r > √...

Design of CMOS Flip-Flops (SR, D, JK)

Design of CMOS Flip-Flops (SR, D, JK) A flip-flop or latch is a circuit with two stable states, used to store state information. It is the basic storage element in sequential logic and a fundamental building block in digital electronics systems, including computers and communication devices. Flip-flops and latches act as data storage elements for states, pulse counting, and synchronization of variably-timed input signals to a reference clock. Flip-flops can be transparent/opaque (latches) or clocked (synchronous, edge-triggered). Latches are level-sensitive, while flip-flops are edge-sensitive. In sequential logic, the output depends on current inputs and previous states. Fig.1 shows a sequential circuit combining a combinational block and a memory element. ...

Flat vs Frequency Selective Online Simulator

Flat vs Frequency Selective Online Simulator Channel Type Without Fading Flat Fading Multipaths Nakagami m SNR(dB) Run Simulation Input Signal Signal After Fading Constellation Diagram BER vs SNR Explore Advanced Flat vs Frequency-Selective Fading Simulator Want to see these equations in action? Visualize it. Launch Simulator Tool Interactive Rayleigh Fading Simulator Want to see Rayleigh fading in action? Visualize it. Launch Simulator Tool Return to DSP Simulations Main Page →

Online Simulator for ASK, FSK, and PSK Signal Generation

Interactive Digital Signal Processing (DSP) Tutorial and Simulator for ASK, FSK, and BPSK modulation techniques. Try our new Digital Signal Processing Simulator!   •   Interactive ASK, FSK, and BPSK tools updated for 2025. Start Now Digital Modulation Visualizer: ASK, FSK, & BPSK Simulator Learn and visualize binary modulation techniques (ASK, FSK, BPSK) in real-time with adjustable carrier and sampling parameters. Perfect for DSP students and engineers. ๐Ÿ“ก ASK Simulator ๐Ÿ“ถ FSK Simulator ๐ŸŽš️ BPSK Simulator ๐Ÿ“š More Topics ASK Modulator FSK Modulator BPSK Modulator Demodulation More Topics 1. ASK (Ampli...

Gaussian minimum shift keying (GMSK)

๐Ÿ“˜ Overview & Theory ๐Ÿงฎ Simulator for GMSK ๐Ÿงฎ MSK and GMSK: Understanding the Relationship ๐Ÿงฎ MATLAB Code for GMSK ๐Ÿ“š Simulation Results for GMSK ๐Ÿ“š Q & A and Summary ๐Ÿ“š Further Reading Dive into the fascinating world of GMSK modulation, where continuous phase modulation and spectral efficiency come together for robust communication systems! Core Process of GMSK Modulation Phase Accumulation (Integration of Filtered Signal) After applying Gaussian filtering to the Non-Return-to-Zero (NRZ) signal, we integrate the smoothed signal to produce a continuous phase signal. For GMSK, the modulation index is $h=0.5$, meaning a bit '1' results in a phase shift of $\pi/2$: ฮธ(t) = 2ฯ€h ∫ 0 t m filtered (ฯ„) dฯ„ This integration is crucial for avoiding abrupt phase transitions, ensuring smooth and continuous phase changes. Phase Mo...

Online Simulator for Frequency Modulatiuon and Demodulation

FM Modulation Simulator Frequency Modulation (FM) In Frequency Modulation, the frequency of the carrier signal varies in accordance with the message signal's amplitude. s FM (t) = A c cos(ฯ‰ c t + k f ∫m(t)dt) where ฯ‰ = 2ฯ€f & k f = Frequency Sensitivity Modulation index, ฮฒ = (k f * A m ) / f m Change the parameter values to see the effect. Message Freq (Hz) 1 Carrier Freq (Hz) Message Amplitude (Am) Kf (sensitivity): 50 Perform FM Demodulation ๐Ÿงช Experiment for Students: ...