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

CMOS Logic Gates: Inverter, NAND, and NOR

CMOS Logic Gates: Inverter, NAND, and NOR Complementary metal–oxide–semiconductor (CMOS) technology forms the backbone of modern digital IC design. Patented by Frank Wanlass in 1963 ( US patent 3,356,858 ), CMOS enables low-power, high-speed, and noise-immune logic circuits. CMOS gates, including inverters, NAND, and NOR, are widely used in both large-scale and small-scale integrated circuits due to their efficiency and versatility. CMOS Inverter A CMOS inverter consists of a complementary pair of PMOS and NMOS transistors. The PMOS transistor connects to the supply voltage V DD , while the NMOS connects to ground. The input voltage V IN controls both gates, and the output voltage V OUT is taken from the connected drains. CMOS inverters are highly energy-efficient and produce minimal heat due to their comple...

UGC NET Electronic Science Previous Year Question Papers with Solutions

Download Papers and Solutions Exam Pattern Preparation Tips FAQs More Home / Engineering & Other Exams / UGC NET 2026 PYQ ๐Ÿ“Š Exam Highlights: Electronic Science (88) Feature Details Junior Research Fellowship (JRF) ₹37,000 + HRA per month Eligibility M.Sc/M.Tech in Electronics (55%) Validity of Certificate JRF (3 Years) | Lectureship (Lifetime) ๐Ÿ“ฅ Download UGC NET Electronics PDFs Complete collection of previous year question papers, answer keys and explanations for Subject Code 88. Start Downloading ๐Ÿ“‚ View All Question Papers June 2026 - Question Paper Download PDF June 202...

OFDM Symbols and Subcarriers Explained

This article explains how OFDM (Orthogonal Frequency Division Multiplexing) symbols and subcarriers work. It covers modulation, mapping symbols to subcarriers, subcarrier frequency spacing, IFFT synthesis, cyclic prefix, and transmission. Step 1: Modulation First, modulate the input bitstream. For example, with 16-QAM , each group of 4 bits maps to one QAM symbol. Suppose we generate a sequence of QAM symbols: s0, s1, s2, s3, s4, s5, …, s63 Step 2: Mapping Symbols to Subcarriers Assume N sub = 8 subcarriers. Each OFDM symbol in the frequency domain contains 8 QAM symbols (one per subcarrier): Mapping (example) OFDM symbol 1 → s0, s1, s2, s3, s4, s5, s6, s7 OFDM symbol 2 → s8, s9, s10, s11, s12, s13, s14, s15 … OFDM sym...

Coherent vs. Non-Coherent Demodulation

  For demodulation In general: 1. Synchronous (coherent) demodulation Receiver generates a local carrier/oscillator . It combines/multiplies the received signal with that carrier. Then a filter extracts the message. Received signal ↓ × Local oscillator ↓ Low-pass filter ↓ Message So yes, carrier multiplication is a common implementation of synchronous demodulation . 2. Asynchronous (non-coherent) demodulation Receiver doesn't need a phase-synchronized local carrier . It uses properties of the received signal itself to recover the information. For ASK , an envelope detector is the classic example: ASK signal ↓ Diode + RC ↓ Envelope ↓ Comparator ↓ Data Modulation Synchronous demodulation Non-coherent/asynchronous demodulation ASK/OOK Local carrier + multiplier Envelope detector AM Product detector Envelope detector FSK Coherent correlator/mixer Frequency discriminator, filters, etc. PSK Local synchronized carrier + multiplier Differential/n...

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: ...

IIR Filter Simulation

IIR Filter & Feedback Lab IIR Filter & Feedback Lab Exploring Recursive Systems: Where Output depends on Output 1 Input Signal $x[n]$ Signal Type Unit Impulse ฮด[n] Sine Wave Unit Step u[n] Frequency (for Sine) Notice: With an Impulse input, the output of an IIR filter can ring forever (Infinite response). 2 Feedback Coefficients Numerator $b$ (Feed-forward) Denominator $a$ (Feedback - $a_0$ is always 1) System Stable Try setting $a$ to 1.0, -1.1 to see an unstable system! ...

(Filters) Free MATLAB alternative for signal analysis

Advanced Signal Filters Upload CSV (1st Col) or Audio (WAV, MP3, etc.) Generate Messy Signal (20Hz + 50Hz + 150Hz) No Operation FFT (Spectrum) Amplitude Modulation (AM) Double Sideband Supressed Carrier (DSBSC) Pulse Amplitude Modulation (PAM) Flat Top PAM Filters - LPF, HPF, BPF, Notch Principal Component Analysis (PCA) Cross Spectrum Filter Type: Signal Cleaner ...

The electric field of a monochromatic plane wave travelling in a lossless isotropic and homogenous medium is given by E(z, t) = ...

  Q. The electric field of a monochromatic plane wave travelling in a lossless isotropic and homogenous medium is given by E(z, t) = E₀ [x̂ cos(ฯ‰t − kz) + ลท sin(ฯ‰t − kz)] in a right-handed orthogonal co-ordinate system. Which of the following is the correct polarization of the electromagnetic wave? (A) Right-handed circularly polarized Correct answer under the IEEE convention. (B) Left-handed circularly polarized (C) Linearly polarized (D) Linearly polarized at −45° to x̂ Solution 1. Identify the electric-field components Let ฯˆ = ฯ‰t − kz. The components along the x and y directions are: Eโ‚“ = E₀ cos ฯˆ Eแตง = E₀ sin ฯˆ Both components have equal amplitudes, the same frequency, and a phase difference of 90°. These are the conditions for circular polarization. ...