## 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**

## 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