Skip to main content

OFDM in MATLAB


 

MATLAB Script

% The code is written by SalimWireless.Com

1. Initialization

clc;
clear all;
close all;


2. Generate Random Bits

% Generate random bits
numBits = 100;
bits = randi([0, 1], 1, numBits);


3. Define Parameters

% Define parameters
numSubcarriers = 4; % Number of subcarriers
numPilotSymbols = 3; % Number of pilot symbols
cpLength = ceil(numBits / 4); % Length of cyclic prefix (one-fourth of the data length)


4. Add Cyclic Prefix

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


5. Insert Pilot Symbols

% Insert pilot symbols
pilotSymbols = ones(1, numPilotSymbols); % Example pilot symbols (could be any pattern)
dataWithPilots = [pilotSymbols, dataWithCP];

 

6. Perform OFDM Modulation (IFFT)

% Perform OFDM modulation (IFFT)
dataMatrix = reshape(dataWithPilots, numSubcarriers, []);
ofdmSignal = ifft(dataMatrix, numSubcarriers);
ofdmSignal = reshape(ofdmSignal, 1, []);


7. Display the Generated Data

% Display the generated data
disp("Original Bits:");
disp(bits);
disp("Data with Cyclic Prefix and Pilots:");
disp(dataWithPilots);
disp("OFDM Signal:");
disp(ofdmSignal);

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


8. Demodulation

% Perform FFT on the received signal
%ofdmSignal = awgn(ofdmSignal, 1000);
ofdmSignal = reshape(ofdmSignal, numSubcarriers, []);
rxSignal = fft(ofdmSignal, numSubcarriers);
%rxSignal = [rxSignal(1,:) rxSignal(2,:) rxSignal(3,:) rxSignal(4,:)];


9. Remove Cyclic Prefix

% Remove cyclic prefix
rxSignalNoCP = rxSignal(cpLength + 1:end);


10. Extract Data Symbols and Discard Pilot Symbols

% Extract data symbols and discard pilot symbols
dataSymbols = rxSignalNoCP(numPilotSymbols + 1:end);


11. Demodulate the Symbols Using Thresholding

% Demodulate the symbols using thresholding
threshold = 0;
demodulatedBits = (real(dataSymbols) > threshold);


12. Plot the Original and Received Bits

figure(1)
stem(bits);
legend("Original Information Bits")

figure(2)
stem(demodulatedBits);
legend("Received Bits")

Output

 

 
Fig 1: Original Information Bits
 
 
 
 
 
Fig 2: OFDM Signal
 
 
 
 
Fig 3: Received Demodulated Bits

 

Copy the MATLAB Code above from here

 

 

MATLAB Code for OFDM using 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);



Output

 
 
 
 
 
  
 
 
 

 

MATLAB Code for OFDM Subcarriers (using 16-QAM)

clc;
clear;
close all;

% OFDM System with 16-QAM and Cooley-Tukey FFT/IFFT

% 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 using Cooley-Tukey 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 using Cooley-Tukey 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');

 Output

 
















Copy the MATLAB code above from here

 

Read more about

[1] OFDM in details

[2] Structure of an OFDM packet

People are good at skipping over material they already know!

View Related Topics to







Contact Us

Name

Email *

Message *

Popular Posts

BER vs SNR for M-ary QAM, M-ary PSK, QPSK, BPSK, ...(MATLAB Code + Simulator)

📘 Overview of BER and SNR 🧮 Online Simulator for BER calculation 🧮 MATLAB Code for BER calculation 📚 Further Reading 📂 View Other Topics on M-ary QAM, M-ary PSK, QPSK ... 🧮 Online Simulator for Constellation Diagram of m-ary QAM 🧮 Online Simulator for Constellation Diagram of m-ary PSK 🧮 MATLAB Code for BER calculation of ASK, FSK, and PSK 🧮 MATLAB Code for BER calculation of Alamouti Scheme 🧮 Different approaches to calculate BER vs SNR What is Bit Error Rate (BER)? The abbreviation BER stands for Bit Error Rate, which indicates how many corrupted bits are received compared to the total number of bits sent. BER = (number of bits received in error) / (total number of transmitted bits) What is Signal-to-Noise Ratio (SNR)? SNR is the ratio of signal power to noise powe...

ASK, FSK, and PSK (with MATLAB + Online Simulator)

📘 Overview 📘 Amplitude Shift Keying (ASK) 📘 Frequency Shift Keying (FSK) 📘 Phase Shift Keying (PSK) 📘 Which of the modulation techniques—ASK, FSK, or PSK—can achieve higher bit rates? 🧮 MATLAB Codes 📘 Simulator for binary ASK, FSK, and PSK Modulation 📚 Further Reading ASK or OFF ON Keying ASK is a simple (less complex) Digital Modulation Scheme where we vary the modulation signal's amplitude or voltage by the message signal's amplitude or voltage. We select two levels (two different voltage levels) for transmitting modulated message signals. For example, "+5 Volt" (upper level) and "0 Volt" (lower level). To transmit binary bit "1", the transmitter sends "+5 Volts", and for bit "0", it sends no power. The receiver uses filters to detect whether a binary "1" or "0" was transmitted. ...

Comparing Baseband and Passband Implementations of ASK, FSK, and PSK

📘 Overview 🧮 Baseband and Passband Implementations of ASK, FSK, and PSK 🧮 Difference betwen baseband and passband 📚 Further Reading 📂 Other Topics on Baseband and Passband ... 🧮 Baseband modulation techniques 🧮 Passband modulation techniques   Baseband modulation techniques are methods used to encode information signals onto a baseband signal (a signal with frequencies close to zero). Passband techniques shift these signals to higher carrier frequencies for transmission. Here are the common implementations: Amplitude Shift Keying (ASK) [↗] : In ASK, the amplitude of the signal is varied to represent different symbols. Binary ASK (BASK) is a common implementation where two different amplitudes represent binary values (0 and 1). ASK is simple but susceptible to noise. ASK Baseband (Digital Bits) ASK Passband (Modulated Carrier)     Fig 1:  ASK Passband Modulation (...

Comparing Baseband and Passband Implementations of m-ary QAM

  Let's assume your original digital message bitstream is: 0, 0, 1, 0, 0, 0, 1, 0, 1, 1 In 4-QAM, we group them into pairs: (00), (10), (00), (10), (11). Your baseband symbols are: Symbol 1 (Bits 00): -1.00 - j1.00 Symbol 2 (Bits 10): 1.00 - j1.00 Symbol 3 (Bits 00): -1.00 - j1.00 Symbol 4 (Bits 10): 1.00 - j1.00 Symbol 5 (Bits 11): 1.00 + j1.00   To transmit these symbols over a wireless medium, we modulate this baseband signal onto a high-frequency carrier (e.g., 50 Hz). This process creates the passband signal , where the information is stored in the phase and amplitude of the sine wave. Fig 1: 4-QAM Baseband I and Q Components Fig 2: 4-QAM Passband Modulated Signal   In this example, the symbol rate is 5 symbols per second. Detailed Explanation 4-QAM Constellation Mapping In standard 4-QAM mapping, bits are converted to complex points on a grid: Bits...

Calculation of SNR from FFT bins in MATLAB

📘 Overview 🧮 MATLAB Code for Estimation of SNR from FFT bins 🧮 MATLAB Code for SNR from PSD using Kaiser Window 📚 Further Reading Here, you can find the SNR of a received signal from periodogram / FFT bins using the Kaiser operator. The beta (β) parameter characterizes the Kaiser window, which controls the trade-off between the main lobe width and the side lobe level. Steps Set up the sampling rate and time vector Compute the FFT and periodogram Calculate the frequency resolution and signal power Exclude the signal power from noise calculation Compute the noise power and SNR MATLAB Code for Estimation of SNR from FFT bins clc; clear; close all; % Parameters fs = 8000; f_tone = 1000; N = 8192; t = (0:N-1)/fs; % Generate signal + noise signal = sin(2*pi*f_tone*t); SNR_true_dB = 20; signal_power = mean(signal.^2); noise_power = signal_power / (10^(SNR_true_dB/10)); noisy_signal = signal + sqrt(noise_power) * randn(1, N); % Apply ...

Online Simulator for ASK, FSK, and PSK

Try our new Digital Signal Processing Simulator!   Start Simulator for binary ASK Modulation Message Bits (e.g. 1,0,1,0) Carrier Frequency (Hz) Sampling Frequency (Hz) Run Simulation Simulator for binary FSK Modulation Input Bits (e.g. 1,0,1,0) Freq for '1' (Hz) Freq for '0' (Hz) Sampling Rate (Hz) Visualize FSK Signal Simulator for BPSK Modulation ...

Amplitude, Frequency, and Phase Modulation Techniques (AM, FM, and PM)

📘 Overview 🧮 Amplitude Modulation (AM) 🧮 Online Amplitude Modulation Simulator 🧮 MATLAB Code for AM 🧮 Q & A and Summary 📚 Further Reading Amplitude Modulation (AM): The carrier signal's amplitude varies linearly with the amplitude of the message signal. An AM wave may thus be described, in the most general form, as a function of time as follows: When performing amplitude modulation (AM) with a carrier frequency of 100 Hz and a message frequency of 10 Hz, the resulting peak frequencies are as follows: 90 Hz (100 - 10 Hz), 100 Hz, and 110 Hz (100 + 10 Hz). Figure: Frequency Spectrums of AM Signal (Lower Sideband, Carrier, and Upper Sideband) A low-frequency message signal is modulated with a high-frequency carrier wave using a local oscillator to make communication possible. DSB, SSB, and VSB are common amplitude modulation techniques. We find a lot of bandwidth loss in DSB. The bandwidth of S...

Shannon Limit Explained: Negative SNR, Eb/No and Channel Capacity

Understanding Negative SNR and the Shannon Limit Understanding Negative SNR and the Shannon Limit An explanation of Signal-to-Noise Ratio (SNR), its behavior in decibels, and how Shannon's theorem defines the ultimate communication limit. Signal-to-Noise Ratio in Shannon’s Equation In Shannon's equation, the Signal-to-Noise Ratio (SNR) is defined as the signal power divided by the noise power: SNR = S / N Since both signal power and noise power are physical quantities, neither can be negative. Therefore, the SNR itself is always a positive number. However, engineers often express SNR in decibels: SNR(dB) When SNR = 1, the logarithmic value becomes: SNR(dB) = 0 When the noise power exceeds the signal power (SNR < 1), the decibel representation becomes negative. Behavior of Shannon's Capacity Equation Shannon’s channel capacity formula is: C = B log₂(1 + SNR) For SNR = 0: log₂(1 + SNR) = 0 When SNR becomes smaller (in...