www.gusucode.com > LTE仿真Matlab源码 > LTE_sim_main_par.m

    % LTE system simulator main simulator file. Check the LTE_sim_batch files
% to check how to launch the simulator.
% [] = LTE_sim_main()
% Author: Dagmar Bosanska, dbosansk@nt.tuwien.ac.at
% (c) 2008 by INTHFT
% www.nt.tuwien.ac.at
%
% date of creation: 2008/08/11
% last changes: 2008/09/02  Colom Ikuno HARQ is implemented
%               2008/09/04  Bosanska    changed to user_biterror and cell_biterrors...
%                                       for multi-user implementation
%               2008/09/08  Bosanska    added structure Results.UE_specific/CELL_specific
%               2008/09/10  Bosanska    HARQ adapted for multiple users
%               2008/09/15  Bosanska    changed structure of BS_output
%               2008/09/18  Bosanska    changed the name of chan_output -> ChanMod_output
%                                       added function [ChanMod_output] = LTE_channel_matrix(ChanMod);
%               2008/10/02  Bosanska    changed structure to multiple call of function LTE_RX
%                                       for multi-user scenario (parallel receivers)
%                                       changed function LTE_RX, new inputs -> [1x1]struct BS_UE_specific
%                                                                              [1x1]double uu
%               2008/10/21  Bosanska    changed function LTE_channel_matrix, new inputs -> [1xnUE]struct UE_output (also output)
%                                                                                          [1x1]double uu, [1x1]double SNR
%                                       prepared loop over number of users for LTE_channel_matrix
%                                       (multi-user scenario with different channels for users)
%               2008/12/04  Bosanska    commented loop over number of users for LTE_channel_matrix
%               2009/02/02  Simko       scheduler plot
%               2009/03/03  Simko       multi user channel- every user has different channel
%               2009/03/09  Jcolom      Added uplink delay
%               2009/16/09  Jcolom      Splitted tracing and plotting from the main simulation loop (better code readability)
%               2009/05/15  Jcolom      Public release of the simulator (r400).
%
%
%
% By using this simulator, you agree to the license terms stated in the license agreement included with this work.
% If you are using the simulator for your scientific work, please reference:
%
% BibTeX:
% @InProceedings{EUSIPCO2009,
%   author =        {Christian Mehlf\"uhrer and Martin Wrulich and Josep Colom Ikuno and Dagmar Bosanska and Markus Rupp},
%   title =         {Simulating the Long Term Evolution Physical Layer},
%   booktitle =     {Proc. of the 17th European Signal Processing Conference (EUSIPCO 2009)},
%   month =         aug,
%   year =          2009,
%   address =       {Glasgow, Scotland},
%   note =          {accepted for publication},
% }
%
% ASCII
% C. Mehlf黨rer, M. Wrulich, J. C. Ikuno, D. Bosanska and M. Rupp, "Simulating the Long Term Evolution Physical Layer,"
% in Proc. of the 17th European Signal Processing Conference (EUSIPCO 2009), Aug. 2008, Glasgow, Scotland

clear tmp_results;
clear filename_suffix;
clear SNR_vec2;
clear StartTime;
clear maxStreams;
clear maxi;
clear num;
% clear output_filename;
clear simulation_results;


maxStreams = 2;
simulation_results = results.simulationResults(...
    LTE_params.nBS,...
    LTE_params.nUE,...
    sum(N_subframes),...
    SNR_vec,...
    maxStreams,...
    max([UE.nRX]),...
    LTE_params.BS_config.nTx,...
    LTE_params.trace_subcarrier_SNR,...
    LTE_params.Ntot);

maxi = max([UE.nRX]);

% temporary result variables for parfor
UE_res =  struct(...
    'ACK',false(sum(N_subframes),maxStreams),...
    'rv_idx',zeros(sum(N_subframes),maxStreams,'uint8'),...
    'RBs_assigned',zeros(sum(N_subframes),'uint8'),...
    'biterrors_coded',zeros(sum(N_subframes),maxStreams,'uint32'),...
    'biterrors_uncoded',zeros(sum(N_subframes),maxStreams,'uint32'),...
    'blocksize_coded',zeros(sum(N_subframes),maxStreams,'uint32'),...
    'blocksize_uncoded',zeros(sum(N_subframes),maxStreams,'uint32'),...
    'throughput_coded',zeros(sum(N_subframes),maxStreams,'uint32'),...
    'throughput_uncoded',zeros(sum(N_subframes),maxStreams,'uint32'),...
    'throughput_useful',zeros(sum(N_subframes),maxStreams,'uint32'),...
    'FER_coded',zeros(sum(N_subframes),maxStreams,'uint16'),...
    'FER_uncoded',zeros(sum(N_subframes),maxStreams,'uint16'),...
    'used_codewords',zeros(sum(N_subframes),maxStreams,'uint16'),...
    'ACK_codeblocks',zeros(sum(N_subframes),maxStreams,'uint16'),...
    'C',zeros(sum(N_subframes),maxStreams,'uint8'),...
    'avg_CB_size',zeros(sum(N_subframes),maxStreams));

cell_res =  struct(...
    'biterrors_coded',zeros(sum(N_subframes),maxStreams,'uint32'),...
    'biterrors_uncoded',zeros(sum(N_subframes),maxStreams,'uint32'),...
    'blocksize_coded',zeros(sum(N_subframes),maxStreams,'uint32'),...
    'blocksize_uncoded',zeros(sum(N_subframes),maxStreams,'uint32'),...
    'throughput_coded',zeros(sum(N_subframes),maxStreams,'uint32'),...
    'throughput_uncoded',zeros(sum(N_subframes),maxStreams,'uint32'),...
    'throughput_useful',zeros(sum(N_subframes),maxStreams,'uint32'),...
    'FER_coded',zeros(sum(N_subframes),maxStreams,'uint16'),...
    'FER_uncoded',zeros(sum(N_subframes),maxStreams,'uint16'),...
    'used_codewords',zeros(sum(N_subframes),maxStreams,'uint16'),...
    'channel_error',zeros(sum(N_subframes),maxi,LTE_params.BS_config.nTx),...
    'SINR_SC_dB',zeros(LTE_params.Ntot,sum(N_subframes)),...
    'PE_signal_power',nan(N_subframes,LTE_params.Ntot),...
    'PE_noise_power',nan(N_subframes,LTE_params.Ntot),...
    'Signal_plus_noise_power',nan(N_subframes,LTE_params.UE_config.nRX),...
    'Noise_power',nan(N_subframes,LTE_params.UE_config.nRX,2));

tmp_results.UE_specific = repmat(UE_res,1,LTE_params.nUE);
tmp_results.cell_specific = cell_res;
tmp_results = repmat(tmp_results,1,size(SNR_vec,2));
clear UE_res cell_res;

%% Parallel toolbox
%yang add
if strcmp(LTE_params.simulation_type,'parallel') && isempty(gcp('nocreate')) %当需要并行并且池空
    parpool;
end
par_sched = parcluster;
%yang add end

%yang num = matlabpool('size');
%yang if strcmp(LTE_params.simulation_type,'parallel') && ~num
%yang      matlabpool('open');
%yang     %     matlabpool 1
%yang end
%yang par_sched = findResource();

%% SNR and frame loops
StartTime = clock;
% NOTE: changing this with a parfor does not change any functionality, but
% messes up the timer (it goes backwards), so if you really want parallel
% functionality, change the line below to a parfor
SNR_vec2 = SNR_vec;

%% File to save the progress through the SNR loop (necessary for estimation of remaining time - works only if all workers access the same harddisk)
fid = fopen('counter.m','w');
fprintf(fid,'%c','');
fclose(fid);

parfor SNR_i=1:size(SNR_vec,2)
    
    %% reset of the random generators
    if LTE_params.random_channel_param_seeding
        reset(LTE_params.channel_param_RandStream,LTE_params.channel_param_seed);
    end
    if LTE_params.random_noise_seeding
        reset(LTE_params.noise_RandStream,LTE_params.noise_seed);
    end
    if LTE_params.random_data_seeding
        reset(LTE_params.data_RandStream,LTE_params.data_seed);
    end
    
    UE_tmp = UE;
    BS_tmp = BS;
    out_tmp = out;
    LTE_params_tmp = LTE_params;
    task = getCurrentTask;
    task_ID = get(task,'ID');
    subframe_i = 1;
    delay_counter = 0;
    tmp_channel = channel;
    %     if LTE_params_tmp.UE_config.mode == 4
    delay = true;
    %     else delay = false;
    %     end
    
    % temporary result variables for parfor
    
    tmp_UE_ACK = false(sum(N_subframes),maxStreams,LTE_params_tmp.nUE);
    tmp_UE_rv_idx = zeros(sum(N_subframes),maxStreams,LTE_params_tmp.nUE,'uint8');
    tmp_UE_RBs_assigned = zeros(sum(N_subframes),LTE_params_tmp.nUE,'uint8');
    tmp_UE_biterrors_coded = zeros(sum(N_subframes),maxStreams,LTE_params_tmp.nUE,'uint32');
    tmp_UE_biterrors_uncoded = zeros(sum(N_subframes),maxStreams,LTE_params_tmp.nUE,'uint32');
    tmp_UE_blocksize_coded = zeros(sum(N_subframes),maxStreams,LTE_params_tmp.nUE,'uint32');
    tmp_UE_blocksize_uncoded = zeros(sum(N_subframes),maxStreams,LTE_params_tmp.nUE,'uint32');
    tmp_UE_throughput_coded = zeros(sum(N_subframes),maxStreams,LTE_params_tmp.nUE,'uint32');
    tmp_UE_throughput_uncoded = zeros(sum(N_subframes),maxStreams,LTE_params_tmp.nUE,'uint32');
    tmp_UE_throughput_useful = zeros(sum(N_subframes),maxStreams,LTE_params_tmp.nUE,'uint32');
    tmp_UE_FER_coded = zeros(sum(N_subframes),maxStreams,LTE_params_tmp.nUE,'uint16');
    tmp_UE_FER_uncoded = zeros(sum(N_subframes),maxStreams,LTE_params_tmp.nUE,'uint16');
    tmp_UE_used_codewords = zeros(sum(N_subframes),maxStreams,LTE_params_tmp.nUE,'uint16');
    tmp_UE_used_CQI = zeros(sum(N_subframes),maxStreams,LTE_params_tmp.nUE,'uint8');
    tmp_UE_ACK_codeblocks = zeros(sum(N_subframes),maxStreams,LTE_params_tmp.nUE,'uint16');
    tmp_UE_C = zeros(sum(N_subframes),maxStreams,LTE_params_tmp.nUE,'uint8');
    tmp_UE_avg_CB_size = zeros(sum(N_subframes),maxStreams,LTE_params_tmp.nUE);
    
    tmp_cell_biterrors_coded = zeros(sum(N_subframes),maxStreams,'uint32');
    tmp_cell_biterrors_uncoded = zeros(sum(N_subframes),maxStreams,'uint32');
    tmp_cell_blocksize_coded = zeros(sum(N_subframes),maxStreams,'uint32');
    tmp_cell_blocksize_uncoded = zeros(sum(N_subframes),maxStreams,'uint32');
    tmp_cell_throughput_coded = zeros(sum(N_subframes),maxStreams,'uint32');
    tmp_cell_throughput_uncoded = zeros(sum(N_subframes),maxStreams,'uint32');
    tmp_cell_throughput_useful = zeros(sum(N_subframes),maxStreams,'uint32');
    tmp_cell_FER_coded = zeros(sum(N_subframes),maxStreams,'uint16');
    tmp_cell_FER_uncoded = zeros(sum(N_subframes),maxStreams,'uint16');
    tmp_cell_used_codewords = zeros(sum(N_subframes),maxStreams,'uint16');
    tmp_cell_channel_error = zeros(sum(N_subframes),maxi,LTE_params_tmp.BS_config.nTx);
    tmp_SINR_SC_dB = zeros(LTE_params_tmp.Ntot,sum(N_subframes));
    tmp_PE_signal_power = nan(N_subframes,LTE_params_tmp.Ntot);
    tmp_PE_noise_power = nan(N_subframes,LTE_params_tmp.Ntot);
    tmp_Signal_plus_noise_power = nan(N_subframes,LTE_params_tmp.UE_config.nRX);
    tmp_Noise_power = nan(N_subframes,LTE_params_tmp.UE_config.nRX,2);
    
    % Initialize variables that will be reused, such as the BS_output
    BS_output = outputs.bsOutput(LTE_params_tmp.nUE,LTE_params_tmp.Nrb,2); % Hard-coded maximum of 2 streams (obvious for LTE)
    BS_output.cell_genie.SINR = zeros(LTE_params_tmp.nUE,LTE_params_tmp.Ntot);
    
    % Set network clock. It will tell every network element in which TTI we are right now.
    network_clock = network_elements.clock(LTE_params_tmp.FrameDur/10);
    
    % Attach the clock to each network element
    
    UE_tmp = LTE_setclock(UE_tmp,network_clock);
    BS_tmp = LTE_setclock(BS_tmp,network_clock);
    
    %     for u_=1:LTE_params.nUE
    %         UE(u_,SNR_i).clock = network_clock;
    %     end
    %     for b_=1:LTE_params.nBS
    %         BS(b_).setclock(network_clock);
    %     end
    
    % Some further initialization
    SNR = reshape(SNR_vec(:,SNR_i,:),size(SNR_vec,1),size(SNR_vec,3));
    network_clock.reset;
    BS_tmp.reset_HARQ_process_index;
    ChanMod_output = cell(LTE_params.nBS,LTE_params_tmp.nUE);
    UE_input = cell(1,LTE_params.nUE*LTE_params.nBS);
    
    %     UE(:).realization_num = 0;
    %reset number of channel realizations
    for uu = 1:LTE_params_tmp.nUE
        UE_tmp(uu).realization_num = 0;
    end
    % Initialize uplink channel
    uplinkChannel = channels.uplinkChannel(LTE_params_tmp.uplink_delay,LTE_params_tmp.nUE);
    
    if DEBUG_LEVEL > 0
        disp('');
        disp(['*************** SNR = ' num2str(SNR(1)) 'dB, value ' num2str(SNR_i) ' of ' num2str(size(SNR_vec,2)) ' ***************']);
    end
    
    % get channel estimation MSE
    for subs_i = 1:length(N_subframes)
        for uu=1:LTE_params.nUE
            %         UE(uu).MSE = LTE_channelestimator_MSE(sigma_n2,UE(uu).channel_autocorrelation_matrix,LTE_params,nAtPort,UE(uu).user_speed);
            UE_tmp(uu).MSE = LTE_channelestimator_MSE(10^(-SNR(uu,subs_i)/10),UE_tmp(uu).channel_autocorrelation_matrix,LTE_params,BS(1).nAtPort,UE_tmp(uu).user_speed);
        end
        
        while subframe_i <= sum(N_subframes(1:subs_i))
            if mod(subframe_i,50)==1 && ~delay
                if DEBUG_LEVEL > 0
                    if task_ID == 1
                        job = getCurrentJob;
                        task_nr = length(get(job,'Tasks'));
                        fid = fopen('counter.m','r+');
                        A = fscanf(fid,'%d');
                        done = numel(A);
                        fclose(fid);
                        if (task_nr > size(SNR_vec2,2) - done)
                            task_nr = size(SNR_vec2,2) - done;
                        end
                        disp(['   processing subframe #' num2str(subframe_i) ' of ' num2str(sum(N_subframes))])
                        %                     disp(['---> remaining simulation time: ' num2str(etime(clock,StartTime)/((SNR_i-1)*N_subframes+subframe_i-1)*((length(SNR_vec)/task_nr-SNR_i)*N_subframes+N_subframes-subframe_i)/60,'%5.3f') 'min']);
                        disp(['---> remaining simulation time: ' num2str(etime(clock,StartTime)/60*((sum(N_subframes)*size(SNR_vec2,2))-(subframe_i-1)*task_nr-sum(N_subframes)*done)/(sum(N_subframes)*done+(subframe_i-1)*task_nr),'%5.3f') 'min']);
                        %                     pause(0.05);
                    end
                end
            end
            
            if ~mod(subframe_i,LTE_params_tmp.N_seed_reset) && ~delay && ~strcmp(LTE_params_tmp.ChanMod_config.time_correlation,'independent') && LTE_params_tmp.use_seed_reset
                LTE_params_tmp.channel_param_RandStream = RandStream('mt19937ar','Seed',ceil(subframe_i*13/14));
                if ~strcmp(LTE_params.ChanMod_config.type,'flat Rayleigh') && ~strcmp(LTE_params.ChanMod_config.type,'AWGN')
                    for uu=1:LTE_params_tmp.nUE
                        number_of_taps = ChanMod.interpolator.num_faders;
                        UE_tmp(uu).channel_coef_rosa_zheng.theta = (rand(LTE_params_tmp.channel_param_RandStream,UE_tmp(uu).nRX,BS.nTX,number_of_taps)*2 -1) * pi;
                        UE_tmp(uu).channel_coef_rosa_zheng.phi = (rand(LTE_params_tmp.channel_param_RandStream,UE_tmp(uu).nRX,BS.nTX,number_of_taps,ChanMod.sin_num)*2 -1) * pi;
                        UE_tmp(uu).channel_coef_rosa_zheng.psi = (rand(LTE_params_tmp.channel_param_RandStream,UE_tmp(uu).nRX,BS.nTX,number_of_taps,ChanMod.sin_num)*2 -1) * pi;
                    end
                end
                %             if LTE_params_tmp.UE_config.mode == 4
                delay_counter = 0;
                delay = true;
                %             end
                for uu = 1:LTE_params_tmp.nUE   % previous channels are not usable anymore for channel prediction after seed reset
                    UE_tmp(uu).previous_channels = zeros(size(UE_tmp(uu).previous_channels));
                end
            end
            
            if delay_counter == LTE_params_tmp.uplink_delay;
                delay = false;
            end
            
            % First of all, advance the network clock
            network_clock.advance_1_TTI;
            
            % Receive feedback from the previous subframe
            
            UE_output = uplinkChannel.receive_feedback;
            
            % ACK of the previous frame. If this is the first frame, set the
            % ACK to correct so that the HARQ handling generates new data
            if subframe_i==1 %|| (mod(subframe_i,LTE_params_tmp.N_seed_reset) <= LTE_params_tmp.uplink_delay && ~strcmp(LTE_params_tmp.ChanMod_config.time_correlation,'independent') && LTE_params.use_seed_reset) % (number of max HARQ processes that will be used)
                for uu = 1:LTE_params_tmp.nUE
                    UE_output(uu).ACK    = true(1,2);
                    UE_output(uu).rv_idx = zeros(1,2);
                end
            end
            
            % Update current HARQ process index
            BS_tmp.update_current_HARQ_process(UE_output);
            
            % Generation of the channel matrix, for scheduler purposes, zero delay from RX
            switch ChanMod.type
                case 'winner_II'
                    for uu = 1:LTE_params_tmp.nUE % parallel channels for multi-user
                        % NOTE: every user should have a different MIMO channel matrix
                        switch ChanMod.filtering
                            case 'BlockFading'
                                [ChanMod_output{uu} BS_output.cell_genie.SINR(uu,:)] = LTE_channel_matrix(LTE_params_tmp, ChanMod, SNR(uu,subs_i), UE_output, UE_tmp(uu), uu, LTE_params_tmp.TxSymbols, subframe_i,tmp_channel{uu}(:,:,:,subframe_i),out_tmp);
                            case 'FastFading'
                                switch ChanMod.time_correlation
                                    case 'correlated'
                                        [tmp_channel, delays, out_tmp] = LTE_winner_channel_model(LTE_params_tmp.TxSymbols,LTE_params_tmp.Arrays,out_tmp);
                                    case 'independent'
                                        [tmp_channel, delays, out_tmp] = LTE_winner_channel_model(LTE_params_tmp.TxSymbols,LTE_params_tmp.Arrays);
                                end
                                [ChanMod_output{uu} BS_output.cell_genie.SINR(uu,:)] = LTE_channel_matrix(LTE_params_tmp, ChanMod, SNR(uu,subs_i), UE_output, UE_tmp(uu), uu, LTE_params_tmp.TxSymbols, subframe_i,tmp_channel{uu},out_tmp);
                        end
                    end
                otherwise
                    for uu = 1:LTE_params_tmp.nUE % parallel channels for multi-user
                        % NOTE: every user should have a different MIMO channel matrix
                        [ChanMod_output{uu} BS_output.cell_genie.SINR(uu,:)] = LTE_channel_matrix(LTE_params_tmp, ChanMod, SNR(uu,subs_i), UE_output, UE_tmp(uu), uu, LTE_params_tmp.TxSymbols, subframe_i);
                    end
            end
            if ~delay % necessary to have useful feedback values (PMI,RI) after seed reset
                %         if LTE_params_tmp.UE_config.mode == 4
                if ~LTE_params_tmp.uplink_delay     % works just for BlockFading
                    for uu = 1:LTE_params_tmp.nUE
                        %                     if subframe_i ~= 1
                        %                         alphabet = BS_output.UE_signaling(uu).MCS_and_scheduling(1).CQI_params(1).modulation_order(1);
                        %                     else
                        %                         alphabet = 2;
                        %                     end
                        %                     [RI_tmp,PMI_tmp]=LTE_feedback_precoding(BS(1).nAtPort,10^-(SNR/10),LTE_params_tmp,alphabet,ChanMod_output{uu}.genie.H_fft,UE_tmp(uu),uu);
                        %                     [RI_tmp,PMI_tmp,CQI_tmp]=feedback_test(BS(1).nAtPort,10^-(SNR/10),LTE_params,alphabet,ChanMod_output{uu}.genie.H_fft,UE_tmp(uu),uu);
                        [RI_tmp,PMI_tmp,CQI_tmp,CQI_bar]=LTE_feedback(BS(1).nAtPort,10^-(SNR(uu,subs_i)/10),LTE_params,ChanMod_output{uu}.genie.H_fft,UE_tmp(uu),uu,LTE_params.UE_config.mode,cqi_i);
                        UE_output(uu).RI = RI_tmp;
                        UE_output(uu).PMI = PMI_tmp-1;
                        UE_output(uu).CQI_bar = CQI_bar;
                        %                     UE_output(uu).CQI = CQI_tmp;
                        if ~isempty(CQI_tmp)
                            UE_output(uu).CQI = CQI_tmp;
                        else
                            UE_output(uu).CQI = cqi_i*ones(LTE_params.Nrb,2,LTE_params.scheduler.nCodewords(uu));
                        end
                    end
                end
                if delay_counter == 0 && LTE_params_tmp.uplink_delay ~= 0
                    for uu = 1:LTE_params.nUE
                        UE_output(uu).CQI = ones(LTE_params.Nrb,2,LTE_params.scheduler.nCodewords(uu)); % set some initial CQI values for mode 3
                    end
                end
                %         end
                % Generation of the transmit signal
                % NOTE: some day there should also be a loop over basestations
                LTE_TX(LTE_params_tmp,BS_tmp, UE_tmp, BS_tmp.AtPort, subframe_i,UE_output,BS_output); % ref and sync is repeating on slot basis
                % Convolution part
                [ChanMod_output UE_input] = LTE_channel_model(LTE_params_tmp, ChanMod, ChanMod_output, BS_output, SNR(uu,subs_i),UE_input);
                % Signal receive, demod, decode...
                for uu = 1:LTE_params_tmp.nUE % parallel receivers for multi-user
                    for stream_i = 1:BS_output.UE_signaling(uu).MCS_and_scheduling.nCodewords % NOTE: this should be the number of streams assigned to this user by the scheduler
                        UE_output(uu).rx_data_bits{stream_i} = [];
                        UE_output(uu).rx_coded_bits{stream_i} = [];
                    end
                    UE_output(uu).PE_noise_power_subframe = nan(LTE_params.Ntot,LTE_params.Nsub);
                    UE_output(uu).PE_signal_power_subframe = nan(LTE_params.Ntot,LTE_params.Nsub);
                    % Execute receiver
                    LTE_RX(LTE_params_tmp, ChanMod_output{uu}, UE_input{uu}, ChanMod, SNR(uu,subs_i), BS_tmp.AtPort, subframe_i, BS_tmp, UE_tmp, UE_output, BS_output, uu);
                    
                end
                % Put the feedback into the uplink channel (delay)
                uplinkChannel.insert_feedback(UE_output);
                % Process results for this TTI
                % simulation_results.process_TTI_results(BS_output,UE_output,subframe_i,SNR_i);
                if ~delay
                    [tmp_UE_ACK(subframe_i,:,:),tmp_UE_rv_idx(subframe_i,:,:),tmp_UE_RBs_assigned(subframe_i,:),tmp_UE_biterrors_coded(subframe_i,:,:),...
                        tmp_UE_biterrors_uncoded(subframe_i,:,:),tmp_UE_blocksize_coded(subframe_i,:,:),tmp_UE_blocksize_uncoded(subframe_i,:,:),tmp_UE_throughput_coded(subframe_i,:,:),...
                        tmp_UE_FER_coded(subframe_i,:,:),tmp_UE_throughput_uncoded(subframe_i,:,:),tmp_UE_throughput_useful(subframe_i,:,:),tmp_UE_FER_uncoded(subframe_i,:,:),tmp_UE_used_codewords(subframe_i,:,:),...
                        tmp_UE_used_CQI(subframe_i,:,:),tmp_UE_ACK_codeblocks(subframe_i,:,:),tmp_UE_C(subframe_i,:,:),tmp_UE_avg_CB_size(subframe_i,:,:),...
                        tmp_cell_biterrors_coded(subframe_i,:),tmp_cell_biterrors_uncoded(subframe_i,:),tmp_cell_blocksize_coded(subframe_i,:),tmp_cell_blocksize_uncoded(subframe_i,:),...
                        tmp_cell_throughput_coded(subframe_i,:),tmp_cell_throughput_uncoded(subframe_i,:),tmp_cell_throughput_useful(subframe_i,:),tmp_cell_FER_coded(subframe_i,:),tmp_cell_FER_uncoded(subframe_i,:),...
                        tmp_cell_used_codewords(subframe_i,:),tmp_cell_channel_error(subframe_i,:,:)...
                        ] = LTE_processTTI_results(BS_output,UE_output,subframe_i,SNR_i,LTE_params_tmp.nUE,tmp_cell_biterrors_coded(subframe_i,:),...
                        tmp_cell_biterrors_uncoded(subframe_i,:),tmp_cell_blocksize_coded(subframe_i,:),tmp_cell_blocksize_uncoded(subframe_i,:),tmp_cell_throughput_coded(subframe_i,:),...
                        tmp_cell_throughput_uncoded(subframe_i,:),tmp_cell_throughput_useful(subframe_i,:),tmp_cell_FER_coded(subframe_i,:),tmp_cell_FER_uncoded(subframe_i,:),tmp_cell_used_codewords(subframe_i,:),reshape(tmp_cell_channel_error(subframe_i,:,:),maxi,LTE_params_tmp.BS_config.nTx),maxStreams);
                end
                
                % Add SINR feedback (when configuration so says)
                if LTE_params_tmp.trace_subcarrier_SNR
                    % Add subcarrier SNR to the trace
                    % simulation_results.cell_specific.SINR_SC_dB(:,subframe_i,SNR_i) = BS_output.cell_genie.SINR;
                    tmp_SINR_SC_dB(:,subframe_i) = BS_output.cell_genie.SINR;
                end
                % Postequlazation SINR post processing
                
                PE_signal_power_temp = zeros(size(UE_output(1).PE_signal_power_subframe));
                PE_noise_power_temp = zeros(size(UE_output(1).PE_signal_power_subframe));
                for uu = 1:LTE_params_tmp.nUE
                    UE_output(uu).PE_signal_power_subframe(isnan(UE_output(uu).PE_signal_power_subframe)) = 0;
                    UE_output(uu).PE_noise_power_subframe(isnan(UE_output(uu).PE_noise_power_subframe)) = 0;
                    
                    PE_signal_power_temp = PE_signal_power_temp + UE_output(uu).PE_signal_power_subframe;
                    PE_noise_power_temp = PE_noise_power_temp + UE_output(uu).PE_noise_power_subframe;
                end
                
                tmp_PE_signal_power(subframe_i,:) = sum(PE_signal_power_temp,2);
                tmp_PE_noise_power(subframe_i,:) = sum(PE_noise_power_temp,2);
                
                % estimate SNR
                tmp_Signal_plus_noise_power(subframe_i,:) = UE_output(uu).Signal_plus_noise_power;
                tmp_Noise_power(subframe_i,:,:) = UE_output(uu).Noise_power.';
                
                
                if delay
                    delay_counter = delay_counter+1;
                    subframe_i = subframe_i-1;
                end
                
            else
                for uu = 1:LTE_params_tmp.nUE
                    if subframe_i ~= 1
                        alphabet = BS_output.UE_signaling(uu).MCS_and_scheduling(1).CQI_params(1).modulation_order(1);
                    else
                        alphabet = 2;
                    end
                    [RI_tmp,PMI_tmp,CQI_tmp]=LTE_feedback(BS(1).nAtPort,10^-(SNR(uu,subs_i)/10),LTE_params,ChanMod_output{uu}.genie.H_fft,UE_tmp(uu),uu,LTE_params.UE_config.mode);
                    UE_output(uu).RI = RI_tmp;
                    UE_output(uu).PMI = PMI_tmp-1;
                    if ~isempty(CQI_tmp)
                        UE_output(uu).CQI = CQI_tmp;
                    else
                        UE_output(uu).CQI = cqi_i*ones(LTE_params.Nrb,2,LTE_params.scheduler.nCodewords(uu));
                    end
                end
                uplinkChannel.insert_feedback(UE_output);
                delay_counter = delay_counter+1;
                subframe_i = subframe_i-1;
            end
            subframe_i = subframe_i+1;
            
        end
    end
    % Set a single output variable
    tmp_results(SNR_i) = LTE_set_results(tmp_UE_ACK,tmp_UE_rv_idx,tmp_UE_RBs_assigned,tmp_UE_biterrors_coded,tmp_UE_biterrors_uncoded,tmp_UE_blocksize_coded,tmp_UE_blocksize_uncoded,...
        tmp_UE_throughput_coded,tmp_UE_throughput_uncoded,tmp_UE_throughput_useful,tmp_UE_FER_coded,tmp_UE_FER_uncoded,tmp_UE_used_codewords,tmp_UE_used_CQI,...
        tmp_UE_ACK_codeblocks,tmp_UE_C,tmp_UE_avg_CB_size,...
        tmp_cell_biterrors_coded,tmp_cell_biterrors_uncoded,...
        tmp_cell_blocksize_coded,tmp_cell_blocksize_uncoded,tmp_cell_throughput_coded,tmp_cell_throughput_uncoded,tmp_cell_throughput_useful,tmp_cell_FER_coded,tmp_cell_FER_uncoded,tmp_cell_used_codewords,tmp_cell_channel_error,LTE_params_tmp.nUE,tmp_SINR_SC_dB,tmp_PE_signal_power,tmp_PE_noise_power,tmp_Signal_plus_noise_power,tmp_Noise_power);
    
    fid = fopen('counter.m','a');
    fprintf(fid,'%d\n',SNR_i);
    fclose(fid);
end

simulation_results.SNR_vector = SNR_vec2;
simulation_results.set_TTI_results(tmp_results);
clear tmp_results;
clear U_temp;
clear BS_temp;
clear LTE_params_tmp;
clear out_tmp;

%% Calculate simulation aggregates
if(strcmp(UE(1).autocorrelation_matrix_type,'estimated') && strcmp(UE(1).channel_estimation_method,'MMSE'))
    simulation_results.calculate_sim_aggregates(UE(1).realization_num_total/(UE(1).nRX * ChanMod.nTX));
else
    simulation_results.calculate_sim_aggregates(0);
end


%% Show plots at the end of the simulation
if LTE_params.show_plots
    LTE_sim_result_plots(simulation_results);
    LTE_sim_results_scheduler_plot(BS,BS_output,sum(N_subframes));
end
if strcmp(LTE_params.simulation_type,'parallel')
    delete(gcp('nocreate'));%yang add
%yang matlabpool close;
end

% To get rid of the warning when saving
clear par_sched