clc;
clear all
close all
nFFT = 256; % fft size
nDSC = 256; % number of data subcarriers
nBitPerSym = 256; % number of bits per OFDM symbol (same as the number of subcarriers for BPSK)
nSym = 10^3; % number of symbols
carriers = (1:nBitPerSym) ;
ep =0;
EbN0dB = [1:10]; % bit to noise ratio
% Transmitter
ipBit = rand(1,nBitPerSym*nSym) > 0.5; % random 1's and 0's
modulated_data = 2*ipBit-1; % BPSK modulation 0 --> -1, 1 --> +1
%for ll= 1:length(ep)
for iii=EbN0dB,
k = 1;
for n = 1:nSym
ofdm_symbol = zeros(1,nFFT);
% Map modulated data to FFT bins in OFDM symbol
ofdm_symbol(carriers) = modulated_data(k:k+nBitPerSym-1);
% Time Signal to transmit
tx_signal = (nFFT/sqrt(nDSC))*ifft(ofdm_symbol,nFFT);
% DOPPLER SHIFT
%rx_signal1= tx_signal.*exp((2*j*pi*ep(ll)/nFFT ).*(0:length(tx_signal) -1));
rx_signal = awgn(tx_signal, EbN0dB(iii),'measured');
% FFT
received_ofdm = (sqrt(nDSC)/nFFT)*fft(rx_signal, nFFT);
% Extract data from carriers in OFDM symbol
received_symbols(k:k+nBitPerSym-1) = received_ofdm(carriers);
k = k + nBitPerSym;
end
% PERFROM DEMODULATION
yF=received_symbols;
yF = reshape(yF,nBitPerSym,nSym).'; % formatting the received vector into symbo
ipModHat = 2*floor(real(yF/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(iii) = size(find(ipBitHat - ipBit),2)/(nSym*nBitPerSym);
end
BPSK =berawgn(EbN0dB,'psk',2,'nondiff');
figure(1)
semilogy(EbN0dB,BPSK,'-bo');
hold on
semilogy(EbN0dB,nErr,'-R*');
grid on
xlabel('EbNo (dB)');
ylabel('BER')