%% Help
% In this document, the problem of OFDMA multi-user resource allocation based
% on MMSE channel estimation is considered. Maximization of system capacity,
% based on available error-free instantaneous estimated channel state
% information at the transmitter, is the goal. Optimal power distribution
% between different subchannels is computed analytically, and it is shown that
% equal power allocation among subcarriers is almost near the optimum capacity.
% Furthermore, the optimum number of pilots and the amount of power allocated
% between pilot and data subcarriers is computed analytically. Moreover, it is
% shown, trough simulation, that numerical results absolutely coincides the
% analytical computations.
% People can use the results and the codes freely if they refer to this job.
% To download the report of this job please check the following link:
% http://ens.ewi.tudelft.nl/~ramezani/Errata01.pdf
% These Matlab codes are provided by Hamid Ramezani.
% Ver01 - 08-Dec-2011
%% ofdm parameters in each block
ofdm.N = 64; % number of total subcarrier for the pilots and data
ofdm.Np = 16; % number of subcarriers for pilots
ofdm.NpV = [8,16,32]; % vector of pilot number for simulation
ofdm.Ns = ofdm.N-ofdm.Np; % number of subcarriers for data pilots
ofdm.PI = ofdm.N/ofdm.Np; % pilot interval
ofdm.BW = 1e6; % system total avaiable bandwidth
ofdm.Ip = 1:ofdm.PI:ofdm.N; % pilot location
ofdm.Is = setxor((1:ofdm.N),ofdm.Ip); % data location
%% users' parameters
users.N = 5; % numder of users in system
%% noise related parameters
noise.N0 = 1;%1e-10; % noise spectral density
noise.sigma = noise.N0*ofdm.BW/ofdm.N; % noise power in each subchannel
%% power relate
if simulate.Stt ~= 1 % sweep over percentage of power between data and pilots
power.Alpha = ofdm.Ns/ofdm.N; % percentage of power for data subcarrier
end
power.AlphaV = 0:.05:1; % vector of percentage of power for data subcarrier for simulation only
if simulate.Stt ~= 2 % sweep over Average SNR , defined as Ptotal/(N0*B)
power.ASNRdB = 6; % in dB Ptotal/(N0*B)
end
power.ASNRdBV = 0:1:15; % vector of Average SNR , defined as Ptotal/(N0*B)
power.Total = 10^(.1*power.ASNRdB) * noise.N0 * ofdm.BW; % total avaiable power in each block
power.Pdatas = power.Total * power.Alpha; % total power allocated for data subcarriers
power.Ppilots = power.Total * (1 - power.Alpha); % total power for pilot data
% avarage SNR in db for data and pilots
power.ASNRdBdatas = 10*log10(power.Pdatas /(noise.sigma*ofdm.Ns)); % pilot SNR defined as Ppilot /(N0*B/N)
power.ASNRdBpilots = 10*log10(power.Ppilots/(noise.sigma*ofdm.Np)); % pilot SNR defined as Ppilot /(N0*B/N)
%% channel parameters
chan.L = 8; % number of channel taps in time domain
chan.PDPP = .1; % channel power delay profile parameter exp(-l * TabNumber)
% channel power delay profile and normalization
chan.PDP = exp(-chan.PDPP * (0:chan.L-1).');
chan.PDP = chan.PDP ./ sum(chan.PDP);
% variance of created noise due to channel estimation
chan.Est.SigmaMMSE = sum( (1./chan.PDP + ofdm.Np * 10.^(.1*power.ASNRdBpilots) ).^-1);
chan.Est.SigmaLSE = chan.L/ofdm.Np * 1/10^(.1*power.ASNRdBpilots);
% FFT MATRIX
chan.F = exp(sqrt(-1)*2*pi/ofdm.N).^ ...
(-repmat(1:ofdm.N,ofdm.N,1) .* repmat((1:ofdm.N).',1,ofdm.N));
%% Algorithm paramers
if simulate.Stt == 0
alg.MMSE.maxIterationNumber = 200; % for one run performance
else
alg.MMSE.maxIterationNumber = 20; % for loop performance,
% the number is reduced to increase the simulation speed
end
alg.MMSE.Threshold = 1e-10; % error below x % of the old computed data
alg.MMSE.ConvergeCoeff = .3; % updating coefficient
alg.MMSE.M = 1:ofdm.Ns; % series of all subchannels
alg.MMSE.Mz = []; % series of zero power subchannel
alg.MMSE.A = ones(1,ofdm.Ns); % Matrix A
%% analyze parameters
% maximum acheivable capacity given pilot position and power
analyze.FCSIMaxCapacityWithPdata = 0;
analyze.FCSIAllocPowWithPdata = zeros(ofdm.Ns,1);
% capacity with equal power allocation for data subchannels based on
% MMSE channel estimation
analyze.ECSIEqPowCapacityWithPdataMMSE = 0;
% capacity with equal power allocation for data subchannels based on
% LSE channel estimation
analyze.ECSIIterativeCapacityWithPdataMMSE = 0;
analyze.ECSIIterativeAllocPowWithPdata = zeros(ofdm.Ns,1);
% capacity with iterative power allocation for data subchannels based on
% LSE channel estimation
% under construction
%% display parameters
if simulate.Stt == 0
ifDo.ShowGraphInEachRun = 1;
ifDo.ShowResultsIneachRun = 1;
elseif simulate.Stt > 0
ifDo.ShowGraphInEachRun = 0;
ifDo.ShowResultsIneachRun = 0;
end
% graphical parameters
graph.OneRun.Stt = 0;
graph.Loop.Stt = 0;
% text display parameters
showResult.OneRun.Stt = 0;