clear all
nFFT = 16; % fft size
nDSC = 4; % number of data subcarriers
nBitPerSym = 4; % number of bits per OFDM symbol (same as the number of subcarriers for BPSK)
nSym = 10^4; % number of symbols
EbN0dB = [0:10]; % bit to noise ratio
EsN0dB = EbN0dB + 10*log10(nDSC/nFFT) + 10*log10(16/20); % converting to symbol to noise ratio
for ii = 1:length(EbN0dB)
% Transmitter
ipBit = rand(1,nBitPerSym*nSym) > 0.5; % random 1's and 0's
ipMod = 2*ipBit-1; % BPSK modulation 0 --> -1, 1 --> +1
ipMod = reshape(ipMod,nBitPerSym,nSym).'; % grouping into multiple symbolsa
% Assigning modulated symbols to subcarriers from [-26 to -1, +1 to +26]
xF = [ipMod(:,[1:nBitPerSym/4]) zeros(nSym,3) ipMod(:,[(nBitPerSym/4)+1]) zeros(nSym,3) ipMod(:,[(nBitPerSym/4)+2]) zeros(nSym,3) ipMod(:,[(nBitPerSym/4)+3]) zeros(nSym,3)];
% Taking FFT, the term (nFFT/sqrt(nDSC)) is for normalizing the power of transmit symbol to 1
xt = (nFFT/sqrt(nDSC))*ifft(fftshift(xF.')).';
% Appending cylic prefix
xu = [xt(:,[13:16]) xt];
% Concatenating multiple symbols to form a long vector
xv = reshape(xu.',1,nSym*20);
% Gaussian noise of unit variance, 0 mean
nt = 1/sqrt(2)*[randn(1,nSym*20) + j*randn(1,nSym*20)];
% Adding noise, the term sqrt(80/64) is to account for the wasted energy due to cyclic prefix
yt = sqrt(20/16)*xv + 10^(-EsN0dB(ii)/20)*nt;
% Receiver
yt = reshape(yt.',20,nSym).'; % formatting the received vector into symbols
yt = yt(:,[5:20]); % removing cyclic prefix
% converting to frequency domain
yF = (sqrt(nDSC)/nFFT)*fftshift(fft(yt.')).';
yMod = yF(:,[[1:nBitPerSym/4] 3+[nBitPerSym/4+1] 3+[nBitPerSym/4+2] 3+[nBitPerSym/4+3]]);
% BPSK demodulation
% +ve value --> 1, -ve value --> -1
ipModHat = 2*floor(real(yMod/2)) + 1;
ipModHat(find(ipModHat>1)) = +1;
ipModHat(find(ipModHat<-1)) = -1;
% converting modulated values into bits
ipBitHat = (ipModHat+1)/2;
ipBitHat = reshape(ipBitHat.',nBitPerSym*nSym,1).';
% counting the errors
nErr(ii) = size(find(ipBitHat - ipBit),2);
end
simBer = nErr/(nSym*nBitPerSym);
theoryBer = (1/2)*erfc(sqrt(10.^(EbN0dB/10)));
close all; figure
semilogy(EbN0dB,theoryBer,'bs-','LineWidth',2);
hold on
semilogy(EbN0dB,simBer,'mx-','LineWidth',2);
axis([0 10 10^-5 1])
grid on
legend('theory', 'simulation');
xlabel('Eb/No, dB')
ylabel('Bit Error Rate')
title('Bit error probability curve for BPSK using OFDM')