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
Copy the MATLAB Code above from here
Another Example
clc;
clear;
close all;
% Main script
bitsLength = 128;
subcarriers = 64;
cpLength = 8;
bits = generateRandomBits(bitsLength);
txSignal = OFDMTransmitter(bits, subcarriers, cpLength);
rxSignal = OFDMReceiver(txSignal, subcarriers, cpLength);
Fs = 100; % Sampling frequency
[transmittedSignal, transmittedTime] = representDigitalSignal(bits, Fs);
[receivedSignal, receivedTime] = representDigitalSignal(rxSignal, Fs);
plotSignal(transmittedTime, transmittedSignal, 'Transmitted Bits');
plotSignal(receivedTime, receivedSignal, 'Received Bits');
% Plot OFDM Modulated Signal
figure;
subplot(2,1,1);
plot(real(txSignal));
title('OFDM Modulated Signal - Real Part');
xlabel('Sample');
ylabel('Amplitude');
subplot(2,1,2);
plot(imag(txSignal));
title('OFDM Modulated Signal - Imaginary Part');
xlabel('Sample');
ylabel('Amplitude');
% Function to generate random bits
function bits = generateRandomBits(length)
bits = randi([0 1], 1, length);
end
% Function to perform FFT
function spectrum = myfft(signal)
N = length(signal);
if N <= 1
spectrum = signal;
return;
end
even = signal(1:2:end);
odd = signal(2:2:end);
evenFFT = myfft(even);
oddFFT = myfft(odd);
spectrum = zeros(1, N);
for k = 1:N/2
angle = -2 * pi * (k-1) / N;
cosAngle = cos(angle);
sinAngle = sin(angle);
oddPart = oddFFT(k) * (cosAngle - 1i * sinAngle);
spectrum(k) = evenFFT(k) + oddPart;
spectrum(k + N/2) = evenFFT(k) - oddPart;
end
end
% Function to perform IFFT
function signal = myifft(spectrum)
conjugateSignal = conj(spectrum);
fftResult = myfft(conjugateSignal);
signal = conj(fftResult) / length(conjugateSignal);
end
% Function for OFDM Transmitter
function txSignal = OFDMTransmitter(bits, N, cpLength)
symbols = zeros(1, length(bits)/2);
for i = 1:2:length(bits)
realPart = bits(i) * 2 - 1;
imagPart = bits(i+1) * 2 - 1;
symbols((i+1)/2) = realPart + 1i * imagPart;
end
parallelSymbols = reshape(symbols, N, []);
timeDomainSignal = zeros(size(parallelSymbols));
for i = 1:size(parallelSymbols, 2)
timeDomainSignal(:, i) = myifft(parallelSymbols(:, i));
end
txSignal = [];
for i = 1:size(timeDomainSignal, 2)
cp = timeDomainSignal(end-cpLength+1:end, i);
txSignal = [txSignal; cp; timeDomainSignal(:, i)];
end
end
% Function for OFDM Receiver
function receivedBits = OFDMReceiver(rxSignal, N, cpLength)
numSymbols = floor(length(rxSignal) / (N + cpLength));
removedCP = zeros(N, numSymbols);
for i = 1:numSymbols
symbolStart = (i-1) * (N + cpLength) + cpLength + 1;
removedCP(:, i) = rxSignal(symbolStart:symbolStart + N - 1);
end
frequencyDomainSignal = zeros(size(removedCP));
for i = 1:size(removedCP, 2)
frequencyDomainSignal(:, i) = myfft(removedCP(:, i));
end
receivedBits = zeros(1, numel(frequencyDomainSignal) * 2);
index = 1;
for i = 1:numel(frequencyDomainSignal)
realPart = real(frequencyDomainSignal(i));
imagPart = imag(frequencyDomainSignal(i));
receivedBits(index) = realPart >= 0;
receivedBits(index + 1) = imagPart >= 0;
index = index + 2;
end
end
% Function to represent digital signal for plotting
function [bitRepresentation, timeInstances] = representDigitalSignal(bits, Fs)
bitRepresentation = zeros(1, Fs * length(bits));
for n = 1:length(bits)
if bits(n) == 1
bitRepresentation((n-1)*Fs+1:n*Fs) = 1;
else
bitRepresentation((n-1)*Fs+1:n*Fs) = 0;
end
end
timeInstances = (0:Fs*length(bits)-1) / Fs;
end
% Function to plot the signal
function plotSignal(timeInstances, signal, label)
figure;
plot(timeInstances, signal);
title(label);
xlabel('Time');
ylabel('Amplitude');
end
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