% final_simulator.m
%This is a standard ofdm simulator
% Input Bit Stream is normally Distributed
input_bit_stream = sign(randn(1,BPS*NS));
input_bit_stream(input_bit_stream == -1) = 0;
% PERFORM SERIAL TO PARALLEL CONVERSION
% work on whole data stream at once
disp('Serial to Parallerl Conversion')
parallel_data = StoP(input_bit_stream, log2(M));
% PERFORM MODULATION
% using indicated modulation type and M-ary alphabet
disp(['Modulating with ' modulation ' and ' num2str(M) '-ary Alphabet'])
modulated_data = dmodce(parallel_data, 1, 1, modulation, M);
% CREATE OFDM SYMBOLS
disp('Transmitting OFDM symbols')
%Normalize
%modulated_data = (modulated_data/max(abs(modulated_data)));
for ll= 1:length(ep)
for l=1:length(EsNo)
k = 1;
for n = 1:NS
ofdm_symbol = zeros(1,ifftsize);
% Map modulated data to FFT bins in OFDM symbol
ofdm_symbol(carriers) = modulated_data(k:k+51);
% Time Signal to transmit
tx_signal = ifft(ofdm_symbol,ifftsize);
% DOPPLER SHIFT
rx_signal = tx_signal.*exp((j*pi*ep(ll)/ifftsize)*(0:ifftsize-1));
noise = sqrt(1/(2*log2(M)*10^(EsNo(l)/10)))*(randn(1,64)+j*randn(1,64));
rx_signal = rx_signal + noise;
% FFT
received_ofdm = fft(rx_signal, ifftsize);
% Extract data from carriers in OFDM symbol
received_symbols(k:k+51) = received_ofdm(carriers);
k = k + 52;
end
% PERFROM DEMODULATION
disp('Performing Demodulation')
received_data = ddemodce(received_symbols, 1, 1, modulation, M);
%PERFORM PARALLEL TO SERIAL CONVERSION
disp('Performing Parallel to Serial Converion')
output_bit_stream = PtoS(received_data, log2(M));
% CALCULATE BER
disp('Calculating BER ')
BER(ll,l)= sum(xor(input_bit_stream, output_bit_stream))/length(input_bit_stream);
end
end