function varargout = GUI(varargin)
%% GUI, Hlavní grafické rozhraní pro model fyzické vrstvy systému LTE
% GUI je grafické rozhraní, které pomáhá obsluhovat model fyzické vrstvy
% systému LTE. Tlačítkem 'Start' na tomto rozhraní se spouští simulace.
%
% Modelovaný směr vybírá mezi Uplinkem a Downlinkem.
%
% Vstupní posloupnost volí mezi třemi typy dat, které je možné použít jako
% vstupní posloupnost. Typy jsou Testovací obrázek, Náhodně generovaná
% data a Soubor.
%
% Parametry rádiového prostředí, zde se volí typ rádiového kanálu a poměr
% S/N(C/I). 
%
% Výslekdy simulace je oblast, pro zobrazení výsledků simulace. Hlavním
% výstupem je údaj o chybovosti.
%
% Nejspodnější část okna slouží k vypisování údajů o stavu simulace.
%
%   Vytvořil: Milan Kounek, jako součást diplomové práce Model fyzické
%   vrstvy systému LTE.
%   $Revize: 1 $  $Date: 2012/04/07 20:25:47 $


% GUI MATLAB code for GUI.fig
%      GUI, by itself, creates a new GUI or raises the existing
%      singleton*.
%
%      H = GUI returns the handle to a new GUI or the handle to
%      the existing singleton*.
%
%      GUI('CALLBACK',hObject,eventData,handles,...) calls the local
%      function named CALLBACK in GUI.M with the given input arguments.
%
%      GUI('Property','Value',...) creates a new GUI or raises the
%      existing singleton*.  Starting from the left, property value pairs are
%      applied to the GUI before GUI_OpeningFcn gets called.  An
%      unrecognized property name or invalid value makes property application
%      stop.  All inputs are passed to GUI_OpeningFcn via varargin.
%
%      *See GUI Options on GUIDE's Tools menu.  Choose "GUI allows only one
%      instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES

% Edit the above text to modify the response to help GUI

% Last Modified by GUIDE v2.5 07-Apr-2013 20:25:47

% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @GUI_OpeningFcn, ...
                   'gui_OutputFcn',  @GUI_OutputFcn, ...
                   'gui_LayoutFcn',  [] , ...
                   'gui_Callback',   []);
if nargin && ischar(varargin{1})
    gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT


% --- Executes just before GUI is made visible.
function GUI_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% varargin   command line arguments to GUI (see VARARGIN)

%% Opening Fcn
% Nastaveni pocatecniho zobrazeni
handles.start = false;
handles.cmd_index = 1;
handles.cmd_message = cell(20,1);
if(true)
    handles.cmd_message{handles.cmd_index} = 'Model fyzické vrstvy systému LTE';
    handles.cmd_index = handles.cmd_index + 1;
    handles.cmd_message{handles.cmd_index} = 'Physical layer model of LTE system.';
    handles.cmd_index = handles.cmd_index + 2;
    handles.cmd_message{handles.cmd_index} = 'Autor/Author: Kounek Milan';
    handles.cmd_index = handles.cmd_index + 2;
    handles.cmd_message{handles.cmd_index} = 'Vedoucí práce/Supervisor: prof. Ing. Stanislav Hanus, CSc.';
    handles.cmd_index = handles.cmd_index + 2;
    handles.cmd_message{handles.cmd_index} = 'Vysoké učení technické v Brně, Fakulta elektrotechniky a komunikačních technologií';
    handles.cmd_index = handles.cmd_index + 1;
    handles.cmd_message{handles.cmd_index} = 'Brno University of Technology, The Faculty of Electrical Engineering and Communication';
    handles.cmd_index = handles.cmd_index + 2;
    handles.cmd_message{handles.cmd_index} = 'Hlavní odkazy:';
    handles.cmd_index = handles.cmd_index + 1;
    handles.cmd_message{handles.cmd_index} = 'Main References:';
    handles.cmd_index = handles.cmd_index + 2;
    handles.cmd_message{handles.cmd_index} = '[1]   C. Mehlführer, M. Wrulich, J. C. Ikuno, D. Bosanska and M. Rupp,';
    handles.cmd_index = handles.cmd_index + 1;
    handles.cmd_message{handles.cmd_index} = '"Simulating the Long Term Evolution Physical Layer," in Proc. of the 17th European Signal Processing Conference (EUSIPCO 2009),';
    handles.cmd_index = handles.cmd_index + 1;
    handles.cmd_message{handles.cmd_index} = 'Aug. 2009, Glasgow, Scotland. [Online]. Available: http://publik.tuwien.ac.at/files/PubDat_175708.pdf';
    handles.cmd_index = handles.cmd_index + 2;
    handles.cmd_message{handles.cmd_index} = '[2]   C. Mehlführer, M. Wrulich, J. C. Ikuno, M. Simko, S. Schwarz and M. Rupp,';
    handles.cmd_index = handles.cmd_index + 1;
    handles.cmd_message{handles.cmd_index} = '"The Vienna {LTE} Simulators - Enabling Reproducibility in Wireless Communications Research," in EURASIP Journal on Advances in Signal Processing,';
    handles.cmd_index = handles.cmd_index + 1;
    handles.cmd_message{handles.cmd_index} = 'Vol. 2011. [Online]. Available: http://publik.tuwien.ac.at/files/PubDat_199104.pdf';
    set(handles.edit_cmd,'String',handles.cmd_message);
end

% Nastaveni vstupu
handles.res = [];
set(handles.fig1,'Visible','on'); 
axes(handles.fig1);
handles.obr = round(double(rgb2gray(imread('lenna_100.png')))/255);
imshow(handles.obr*255);
set(handles.fig2,'Visible','off'); 
set(handles.button_IQ, 'Enable', 'off');
set(handles.button_MapRB, 'Enable', 'off');
set(handles.text_chybovost_hodnota, 'String', '---');
set(handles.text_doba_simulace_hodnota, 'String', '---');
set(handles.label_delkaVstupnichDat,'Visible','off');
set(handles.edit_delkaVstupnichDat,'Visible','off');
set(handles.text_delkaVstupnichDat_bitu,'Visible','off');
set(handles.button_VyberSouboru, 'Visible', 'off');
set(handles.edit_VyberSouboru, 'Visible', 'off');
set(handles.checkbox_VelikostSouboru, 'Visible', 'off');
% Nastaveni C/I,S/N
set(handles.checkbox_IntervalCI,'Value',0);
set(handles.label_hodnota,'Visible','on');
set(handles.edit_HodnotaPomeruCISN,'Visible','on');
set(handles.label_dB,'Visible','on');
set(handles.label_Pocatecni,'Visible','off');
set(handles.edit_Pocatecni,'Visible','off');
set(handles.label_Koncova,'Visible','off');
set(handles.edit_Koncova,'Visible','off');
set(handles.label_Krok,'Visible','off');
set(handles.edit_Krok,'Visible','off');
set(handles.button_GrafCISN, 'Enable', 'off');
set(handles.button_GrafCISN, 'Visible', 'off');
set(handles.popupmenu_VlivKanalu, 'Value', 4);
set(handles.popupmenu_VlivKanalu, 'Visible', 'off');
set(handles.label_VlivKanalu, 'Visible', 'off');
set(handles.label_hodnota, 'Visible', 'off');
set(handles.edit_HodnotaPomeruCISN, 'Visible', 'off');
set(handles.checkbox_IntervalCI, 'Visible', 'off');
set(handles.label_dB, 'Visible', 'off');
% Choose default command line output for GUI
handles.output = hObject;
if(exist('parameters.mat'))
    load('parameters.mat');
else
    par = init_parameters('parameters');
end
if(exist('display.mat'))
    load('display.mat');
else
    dis = init_disp('display');
end
handles.par = par;
handles.dis = dis;

% Update handles structure
guidata(hObject, handles);

% if(false) % Druhý způsob zobrazení informací o autorovi
%     helpdlg(sprintf(['Model fyzické vrstvy systému LTE \n\nAutor: Milan Kounek\n\n' ...
%         'Model je součástí Diplomové práce: Model fyzické vrstvy systému LTE; Physical layer model of LTE system.\n' ...
%         '2013 Vysoké učení technické v Brně, fakulta Elektrotechniky a komunikací\n\n'...
%         'Součástí práce je model Rádiového kanálu, který je zhotoven za pomoci funkcí, \n' ...
%         'které byly vytvořeny jinými autory.\nNázvy funkcí jsou: "LTE_channel_model.m", "LTE_channel_matrix.m", ' ...
%         '"LTE_common_calculate_SC_SNR.m" a "nearestNeighborInterpolator.m"\n' ...
%         'Tyto m-file jsou součástí děl: \n\nC. Mehlführer, M. Wrulich, J. C. Ikuno, D. Bosanska and M. Rupp, \n' ...
%         '"Simulating the Long Term Evolution Physical Layer," in Proc. of the 17th European Signal Processing Conference (EUSIPCO 2009),' ...
%         'Aug. 2009, Glasgow, Scotland. [Online]. Available: \nhttp://publik.tuwien.ac.at/files/PubDat_175708.pdf\n\n' ...
%         'C. Mehlführer, M. Wrulich, J. C. Ikuno, M. Simko, S. Schwarz and M. Rupp,\n' ...
%         '"The Vienna {LTE} Simulators - Enabling Reproducibility in Wireless Communications Research," in EURASIP Journal on Advances in Signal Processing, Vol. 2011. ' ...
%         ' [Online]. Available: \nhttp://publik.tuwien.ac.at/files/PubDat_199104.pdf']),'Model Systému LTE');
% end
% UIWAIT makes GUI wait for user response (see UIRESUME)
% uiwait(handles.figure1);


% --- Outputs from this function are returned to the command line.
function varargout = GUI_OutputFcn(hObject, eventdata, handles) 
% varargout  cell array for returning output args (see VARARGOUT);
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Get default command line output from handles structure
varargout{1} = handles.output;


% --------------------------------------------------------------------
function Simulation_Callback(hObject, eventdata, handles)
% hObject    handle to Simulation (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)


% --------------------------------------------------------------------
function OneSimulation_Callback(hObject, eventdata, handles)
% hObject    handle to OneSimulation (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)


% --------------------------------------------------------------------
function StepSimulation_Callback(hObject, eventdata, handles)
% hObject    handle to StepSimulation (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)


% --- Executes on selection change in vstup_popup.
function vstup_popup_Callback(hObject, eventdata, handles)
% hObject    handle to vstup_popup (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Nastaveni Vstupnich dat
switch (get(handles.vstup_popup,'Value')) % Vstupni data 1-obrazek, 2-generovana 3-soubor
    case(1) % Vstupni data: Obrazek
        set(handles.fig1,'Visible','on');
        axes(handles.fig1);
        handles.obr = round(double(rgb2gray(imread('lenna_100.png')))/255);
        imshow(handles.obr*255);
        set(handles.fig2,'Visible','off');
        set(handles.text_fig2,'Visible','on');
        set(handles.label_delkaVstupnichDat,'Visible','off');
        set(handles.edit_delkaVstupnichDat,'Visible','off');
        set(handles.text_delkaVstupnichDat_bitu,'Visible','off');
        set(handles.button_VyberSouboru, 'Visible', 'off');
        set(handles.edit_VyberSouboru, 'Visible', 'off');
        set(handles.checkbox_VelikostSouboru, 'Visible', 'off');
    case(2) % Vstupni data: Nahodne generovana data
        set(handles.fig1,'Visible','off');
        set(handles.fig1,'UserData','[]');
        set(handles.fig2,'Visible','off');
        set(handles.text_fig2,'Visible','off');
        axes(handles.fig1);
        gray(1,1,1) = 212/255;gray(1,1,2) = 208/255;
        gray(1,1,3) = 200/255;
        imshow(gray)
        axes(handles.fig2);
        imshow(gray)
        set(handles.label_delkaVstupnichDat,'Visible','on');
        set(handles.label_delkaVstupnichDat,'String','Délka generované posloupnosti');
        set(handles.edit_delkaVstupnichDat,'Visible','on');
        set(handles.text_delkaVstupnichDat_bitu,'Visible','on');
        set(handles.button_VyberSouboru, 'Visible', 'off');
        set(handles.edit_VyberSouboru, 'Visible', 'off');
        set(handles.checkbox_VelikostSouboru, 'Visible', 'off');
    case(3) % Vstupni data: Soubor
        set(handles.fig1,'Visible','off');
        set(handles.fig1,'UserData','[]');
        set(handles.fig2,'Visible','off');
        set(handles.text_fig2,'Visible','off');
        axes(handles.fig1);
        gray(1,1,1) = 212/255;gray(1,1,2) = 208/255;
        gray(1,1,3) = 200/255;
        imshow(gray)
        axes(handles.fig2);
        imshow(gray)
        set(handles.label_delkaVstupnichDat,'Visible','off');
        set(handles.edit_delkaVstupnichDat,'Visible','off');
        set(handles.text_delkaVstupnichDat_bitu,'Visible','off');
        set(handles.button_VyberSouboru, 'Visible', 'on');
        set(handles.edit_VyberSouboru, 'Visible', 'on');
        set(handles.checkbox_VelikostSouboru, 'Visible', 'on');
        set(handles.checkbox_VelikostSouboru,'Value',0.0);

end
% Hints: contents = cellstr(get(hObject,'String')) returns vstup_popup contents as cell array
%        contents{get(hObject,'Value')} returns selected item from vstup_popup


% --- Executes during object creation, after setting all properties.
function vstup_popup_CreateFcn(hObject, eventdata, handles)
% hObject    handle to vstup_popup (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called

% Hint: popupmenu controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end



% --- If Enable == 'on', executes on mouse press in 5 pixel border.
% --- Otherwise, executes on mouse press in 5 pixel border or over vstup_popup.
function vstup_popup_ButtonDownFcn(hObject, eventdata, handles)
% hObject    handle to vstup_popup (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)


% --- Executes on button press in button_Rozmitani.
function button_Rozmitani_Callback(hObject, eventdata, handles)
% hObject    handle to button_Rozmitani (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)


% --- Executes on button press in button_sim.
function button_sim_Callback(hObject, eventdata, handles)
% hObject    handle to button_sim (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)


% --- Executes on button press in button_display.
function button_display_Callback(hObject, eventdata, handles)
% hObject    handle to button_display (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
Form_dispaly(handles, hObject);

% --- Executes on button press in button_MapRB.
function button_MapRB_Callback(hObject, eventdata, handles)
% hObject    handle to button_MapRB (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

if((handles.start))
    Graf_mapovani(handles.res);
else
    helpdlg('Chyba: Pravděpodobně bylo změněno nastvení, ale nebyla provdena simulace, prosím proveďte simulaci znovu.', 'Chyba zobrazení výsledků');
end

% --- Executes on button press in button_param.
function button_param_Callback(hObject, eventdata, handles)
% hObject    handle to button_param (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
Form_parameters(handles, hObject);

% --- Executes on button press in button_IQ.
function button_IQ_Callback(hObject, eventdata, handles)
% hObject    handle to button_IQ (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
if((handles.start))
    Graf_IQ(handles.res);
else
    helpdlg('Chyba: Pravděpodobně bylo změněno nastvení, ale nebyla provdena simulace, prosím proveďte simulaci znovu.', 'Chyba zobrazení výsledků');
end

% --- Executes on button press in button_Start_Simulace.
function button_Start_Simulace_Callback(hObject, eventdata, handles)
% hObject    handle to button_Start_Simulace (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
CelkovyCasSimulace = tic;
%% Hlavni program - simulace
clc;
dis = handles.dis;
par = handles.par;
handles.cmd_index = 1;
handles.cmd_message = cell(65,1);

% Edit %%%%%%%%%%%%%%%%%%%%%%%% Ošetření zadávání vstupních hodnot
if(get(handles.vstup_popup,'Value') > 1 || get(handles.checkbox_VelikostSouboru, 'Value') == 1)
    [L_delka_vstupu err_L_delka_vstupu] = str2num(get(handles.edit_delkaVstupnichDat, 'string'));
    if(~err_L_delka_vstupu)
        errordlg(sprintf('Nesprávně zadaná hodnota délky posloupnosti\nHodnota musí být celé číslo.'));
        set(handles.edit_delkaVstupnichDat,'BackgroundColor','red');
        return;
    else
        L_delka_vstupu = round(L_delka_vstupu);
        set(handles.edit_delkaVstupnichDat,'BackgroundColor','white');
    end
end
if(get(handles.vstup_popup,'Value') > 2)
    Nazev_souboru = get(handles.edit_VyberSouboru, 'string');
    err_Nazev_souboru = exist(Nazev_souboru);
    if(err_Nazev_souboru==0)
        errordlg(sprintf('Nesprávně zadaný název souboru.\nProsím použijte tlačítko "Vybrat soubor".'));
        set(handles.edit_VyberSouboru,'BackgroundColor','red');
        return;
    else
        set(handles.edit_VyberSouboru,'BackgroundColor','white');
    end
end
if(get(handles.popupmenu_TypKanalu,'Value') > 1)
    if(get(handles.checkbox_IntervalCI, 'Value') == 0 )
        [CISN_single err_CISN_single] = str2num(get(handles.edit_HodnotaPomeruCISN, 'string'));
        if(~err_CISN_single)
            errordlg(sprintf('Nesprávně zadaná hodnota poměru C/I (resp. C/N)\nHodnota musí být číslo, desetinný oddělovač je tečka.'));
            set(handles.edit_HodnotaPomeruCISN,'BackgroundColor','red');
            return;
        else
            set(handles.edit_HodnotaPomeruCISN,'BackgroundColor','white');
        end
    else
        [CISN_pocatek err_CISN_pocatek] = str2num(get(handles.edit_Pocatecni, 'string'));
        if(~err_CISN_pocatek)
            errordlg(sprintf('Nesprávně zadaná počáteční hodnota poměru C/I (resp. C/N)\nHodnota musí být číslo, desetinný oddělovač je tečka.'));
            set(handles.edit_Pocatecni,'BackgroundColor','red');
            return;
        else
            set(handles.edit_Pocatecni,'BackgroundColor','white');
        end

        [CISN_konec err_CISN_konec] = str2num(get(handles.edit_Koncova, 'string'));
        if(~err_CISN_konec)
            errordlg(sprintf('Nesprávně zadaná koncová hodnota C/I (resp. C/N)\nHodnota musí být číslo, desetinný oddělovač je tečka.'));
            set(handles.edit_Koncova,'BackgroundColor','red');
            return;
        else
            set(handles.edit_Koncova,'BackgroundColor','white');
        end
        [CISN_krok err_CISN_krok] = str2num(get(handles.edit_Krok, 'string'));
        if(~err_CISN_krok)
            errordlg(sprintf('Nesprávně zadaná hodnota kroku C/I (resp. C/N)\nHodnota musí být číslo, desetinný oddělovač je tečka.'));
            set(handles.edit_Krok,'BackgroundColor','red');
            return;
        else
            set(handles.edit_Krok,'BackgroundColor','white');
        end
    end
else
    CISN_single = 1;
    CISN_pocatek = 1;
    CISN_konec = 1;
    CISN_krok = 1;
end



% Nastaveni nemoznosti zmacknout tlacitko Start
set(handles.button_Start_Simulace, 'Enable', 'off');
postupCelkem = 16;
postup = 0;
i_chybovost = 1;
res.time_celkem = 0;
set(handles.button_Start_Simulace, 'String', sprintf('%d/%d', postup, postupCelkem));
drawnow;
% Update handles structure
guidata(hObject, handles);
% Popup %%%%%%%%%%%%%%%%%%%%%%
switch (get(handles.DLUL_popup,'Value')) % Vstupni data 1-obrazek, 2-generovana 3-soubor
    case (1) % DL
        res.model_sys = 'DL';
    case (2) % UL
        res.model_sys = 'UL';
end

switch (get(handles.vstup_popup,'Value')) % Vstupni data 1-obrazek, 2-generovana 3-soubor
    case (1) % Obr
        vstup = 'Obr';
    case (2) % Gen
        vstup = 'Gen';
    case (3) % Soubor
        vstup = 'Sou';
end

switch (get(handles.popupmenu_TypKanalu, 'Value')) % 1-none, 2-flatRayleigh
    case (1) % žádný
        res.typKanalu = 'žádný';
    case (2) % Interferenční
        res.typKanalu = 'interferenční';
    case (3) % AWGN
        res.typKanalu = 'AWGN';
    case (4) % flat Rayleigh
        res.typKanalu = 'flatRayleigh';
    case (5) % PedA
        res.typKanalu = 'PedA';
    case (6) % PedB
        res.typKanalu = 'PedB';
end

% Checkbox %%%%%%%%%%%%%%%%%%%
if (get(handles.checkbox_VelikostSouboru, 'Value') == 1)
    omez_vel_souboru = true;
else
    omez_vel_souboru = false;
end

if (get(handles.checkbox_IntervalCI, 'Value') == 1)
    IntervalCI = true;
else
    IntervalCI = false;
end

% Pocatek Simulace

% Nastavení souboru, kam budou uloženy výsledky
res.label = 'results';
% Nastavení zobrazování výsledků
dis.label = 'display';
% Nastavení parametrů komunikace, mpování zdrojů, nastavení zařízení,
% kategorie zařízení atd.
par.label = 'parameters';

% Ukladani informaci o cese
res.time = zeros(20,1);

%% Načtení nastavení ze souboru
% Provede načtení nastavení simulátoru LTE ze souboru, který je uveden v 
% parametru fce.
% load(dis.label); load(par.label);

if(IntervalCI) % Je pozadovano promereni intervalu CI nebo SN
    res.RadioveProstreci.CISN.pocatek   = CISN_pocatek;
    res.RadioveProstreci.CISN.konec     = CISN_konec;
    res.RadioveProstreci.CISN.krok      = CISN_krok;
    N_kroku = floor((CISN_konec - CISN_pocatek) / CISN_krok)+1;
    res.graf_chybovost = zeros(1,N_kroku);
    res.graf_CISN = zeros(1,N_kroku);
    postupCelkem = postupCelkem*(N_kroku);
else
    if(CISN_single == 0),
        CISN_single = 1e-10;
    end
    res.RadioveProstreci.CISN.pocatek   = CISN_single;
    res.RadioveProstreci.CISN.konec     = CISN_single;
    res.RadioveProstreci.CISN.krok      = CISN_single;
end
for CISN = res.RadioveProstreci.CISN.pocatek:res.RadioveProstreci.CISN.krok:...
        res.RadioveProstreci.CISN.konec

    %% Načtení/vytvoření dat pro zpracování a přenos za pomoci modelu systému LTE
    % Vygeneruje/načte ze souboru data, která budou přenášena
    % nastavení zda budou data generována či načtena probíhá dle zvoleného
    % nastavení v souboru s nastavením, dála pak je v nastavení uvedena i délka
    % načítaných dat.
    tic;
    %% Načtení/vygenerování dat pro přenos systémem LTE
    % Vygeneruje nebo načte data ze souboru. Počet bitů bude L

    % Generování posloupnosti zadané délky
    switch (vstup)
        case 'Gen'
            res.a = randi([0,1],[L_delka_vstupu,1]);
        case 'Sou'
            if(omez_vel_souboru)
                res.a = fread(fopen(Nazev_souboru),inf, 'bit1')*(-1);
                if(length(res.a) > L_delka_vstupu)
                    res.a = res.a(1:L_delka_vstupu);
                else          
                    s = sprintf('Požadovaný soubor nelze omezit na požadovanou velikost, neboť je kratší. Pro simulaci je použita jeho celá délka, tedy %d bitů', length(res.a));
                    helpdlg(s, 'Chyba při omezení velikosti souboru');
                end
            else
                res.a = fread(fopen(Nazev_souboru),inf, 'bit1')*(-1);
                L_delka_vstupu = length(res.a);
            end
            fclose('all');
        case 'Obr'
            obr = rgb2gray(imread('lenna_100.png'));
            obr = round(double(obr)/255);
            res.a = reshape(obr,1, size(obr,1)*size(obr,2))';
            L_delka_vstupu = length(res.a);
    end
    % Kontrola délky vstupni posloupnosti, pokud překračuje 1e6 bitů, tak
    % je zkrácena
    if(length(res.a) >1e6)
        res.a = res.a(1:1e6);
        helpdlg('Maximální délka vstupní posloupnosti je 1 000 000 bitů. Posloupnost byla zkrácena na tuto délku.');
    end
    
    
    res.time(1) = toc;
    if(dis.STATUS),
        if(dis.dataMAC),
            a = clock;
            handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> Data z MAC vrstvy jsou připravena.',a(4), a(5),round(a(6)));
            handles.cmd_index = handles.cmd_index + 1;
        end 
    end;
    if(dis.DETAIL),
        if(dis.dataMACd),
            switch(vstup)
                case 'Gen'
                    a = clock;
                    handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> Bylo vygenerováno %1.2G bitů.',a(4), a(5),round(a(6)),L_delka_vstupu);
                    handles.cmd_index = handles.cmd_index + 1;             set(handles.edit_cmd,'Value', handles.cmd_index);
                case 'Obr'
                    a = clock;
                    handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> Obrázek představuje %1.2G bitů.',a(4), a(5),round(a(6)),L_delka_vstupu);
                    handles.cmd_index = handles.cmd_index + 1;
                case 'Sou'
                    a = clock;
                    handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> Bylo načteno %1.2G bitů.',a(4), a(5),round(a(6)),L_delka_vstupu);
                    handles.cmd_index = handles.cmd_index + 1;
            end
        end
        if(dis.PAUSE),
            display('Zmáčkněte libovolnou klávesu pro pokračování...');
            pause;
        end 
    end 
    if(dis.TIME),
        if(dis.dataMACt),
            a = clock;
            handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> Proces načtení/generování dat proběhl za: %1.2f s',a(4), a(5),round(a(6)),res.time(1));
            handles.cmd_index = handles.cmd_index + 1;
        end 
    end
    % Vypis dokonceneho kroku
    postup = postup + 1;
    display_progress(handles, postup, postupCelkem);
    set(handles.button_Start_Simulace, 'String', sprintf('%d/%d', postup, postupCelkem));
    %% ========  Kodér  ========

    %% Připojení CRC k datové posloupnosti
    % K datům z MAC se připojí CRC ochrana.
    % Možné generátory jsou: gCRC24A, gCRC24B, gCRC18, gCRC8. V názvu
    % generátoru je i délka L 24, 16 nebo 8 bitů.
    tic; 
    res.b = add_CRC('gCRC24A', res.a); 
    res.time(2) = toc;
    if(dis.STATUS),
        if(dis.addCRC),
            a = clock;
            handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> K datům z MAC vrstvy byla přidána ochrana CRC.',a(4), a(5),round(a(6)));
            handles.cmd_index = handles.cmd_index + 1;
        end, 
    end;
    if(dis.DETAIL),
        if(dis.addCRCd),
            a = clock;
            handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> Ke generováí CRC byl použit kodér %s.',a(4), a(5),round(a(6)),'gCRC24A');
            handles.cmd_index = handles.cmd_index + 1;
        end, 
        if(dis.PAUSE),
            display('Zmáčkněte libovolnou klávesu pro pokračování...');
            pause;
        end, 
    end; 
    if(dis.TIME),
        if(dis.addCRCt),
            a = clock;
            handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> Proces přidání ochrany CRC k proudu dat proběhl za: %1.2f s.',a(4), a(5),round(a(6)), res.time(2));
            handles.cmd_index = handles.cmd_index + 1;
        end,
    end;
    
    % Vypis dokonceneho kroku
    postup = postup + 1;
    display_progress(handles, postup, postupCelkem);
    set(handles.button_Start_Simulace, 'String', sprintf('%d/%d', postup, postupCelkem));

    %% Přeskupení dat do bloku
    % Pokud je dat málo, přidá bity, pokud je dat moc rozdělí je do bloku a
    % přidá dodatečnou ochranu CRC
    % res.c - výsledné bloky dat s CRC, res.c.F - počet přidaných plnících bitů
    % res.c.C - počet bloků, res.c.B_ - počet dat s CRC, res.c.K_m/C_m - počet
    % bitů v menším bloku/počet menších bloků, res.c.K_p/C_p - počet bitů ve
    % větším bolku/počet větších bolků
    tic; 
    [res.c res.c_F res.c_l] = cbSegmentation(res.b); 
    res.time(3) = toc;
    pocet = 0; 
    for i=1:length(res.c_l),
        if(res.c_l(i)==res.c_l(1)),
            pocet = pocet+1;
        end;
    end;
    if(dis.STATUS),
        if(dis.segment),
            if(length(res.c_l)>1),
                a = clock;
                handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> Data byla rozdělena do %d bloků. Ke každému bloku byla přidána ochrana CRC.',a(4), a(5),round(a(6)),length(res.c_l));
                handles.cmd_index = handles.cmd_index + 1;
            else
                a = clock;
                handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> Data byla uzavřena do jednoho bloku.',a(4), a(5),round(a(6)));
                handles.cmd_index = handles.cmd_index + 1;
            end,
        end, 
    end;
    if(dis.DETAIL),
        if(dis.segmentd),
            if(sum(res.c_l)/length(res.c_l) == res.c_l(1))
                tt = sprintf('Počet bloků velikosti %d bitů je %d. ',res.c_l(1),pocet);
            else
                tt = sprintf('Počet bloků velikosti %d bitů je %d. Počet bloků velikosti %d bitů je %d.', res.c_l(1),pocet,res.c_l(length(res.c_l)),length(res.c_l)-pocet);
            end
            
            a = clock;
            handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)), tt);
            handles.cmd_index = handles.cmd_index + 1;
        end, 
        if(dis.PAUSE),
            display('Zmáčkněte libovolnou klávesu pro pokračování...');
            pause;
        end, 
    end; 
    if(dis.TIME),
        if(dis.segmentt),
            a = clock;
            handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> Proces rozdělení dat do bloků proběhl za: %1.2f s.',a(4), a(5),round(a(6)),res.time(3));
            handles.cmd_index = handles.cmd_index + 1; 
        end, 
    end;
    
    % Vypis dokonceneho kroku
    postup = postup + 1;
    display_progress(handles, postup, postupCelkem);
    set(handles.button_Start_Simulace, 'String', sprintf('%d/%d', postup, postupCelkem));
    % Update handles structure
    guidata(hObject, handles);
    %% Kanálové kódování
    % K blokům dat je přidána dodatečn ochrana proti ztrátě informace. Dále
    % jsou data přerovnána, aby se zvýšila účinnost kódování.
    tic; 
    [res.w res.w_l] = chCoding(res.c, res.c_F, res.c_l); 
    res.time(4) = toc;
    if(dis.STATUS),
        if(dis.chCode),
            text_temp = (sprintf('Bloky dat byly zabezpečeny kanálovým kódováním.'));
            a = clock;
            handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),text_temp);
            handles.cmd_index = handles.cmd_index + 1; 
        end, 
    end;
    if(dis.DETAIL),
        if(dis.chCoded),
            text_temp = (sprintf('Počet vstupních bitů je %d. \nPočet výstupních bitů je %d. \nKódovací poměr je 1/%d',sum(res.c_l),sum(res.w_l),round(sum(res.w_l)/sum(res.c_l)*10)/10));           
            a = clock;
            handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),text_temp);
            handles.cmd_index = handles.cmd_index + 1;
        end, 
        if(dis.PAUSE),
            display('Zmáčkněte libovolnou klávesu pro pokračování...');
            pause;
        end, 
    end; 
    if(dis.TIME),
        if(dis.chCodet),
            tt = (sprintf('Proces kanálového kódování trval: %1.2f s', res.time(4)));
            a = clock;
            handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
            handles.cmd_index = handles.cmd_index + 1;
        end, 
    end;
    % Vypis dokonceneho kroku
    postup = postup + 1;
    display_progress(handles, postup, postupCelkem);
    set(handles.button_Start_Simulace, 'String', sprintf('%d/%d', postup, postupCelkem));

    %% Rate matching 
    % ...
    % type : 'downlink' or 'uplink'
    % tic; [res.e res.e_l] = rateMatching(res.w, res.w_l, 'downlink', par.RateMatch); res.time(9) = toc;
    % if(dis.STATUS),if(dis.rateMatch),display(sprintf('Datový tok byl redukován pomocí rate matchingu.')),end, end;if(dis.DETAIL),if(dis.rateMatchd),display(sprintf('Datový tok byl redukován na... ')),end, if(dis.PAUSE),display('Zmáčkněte libovolnou klávesu pro pokračování...');pause;end, end; if(dis.TIME),if(dis.rateMatcht),display(sprintf('Proces rate matchingu trval: %1.2f s', res.time(9))), end, end;

    %% Code block concatention
    % data z kodéru jsou zpracovávána postupně po blocích, ale nakonec jsou
    % spojena v jeden proud, tak jak je předepsáno, code block concatention
    % probíhá v bolku kanálového kódování

    switch(res.model_sys)
        case 'DL'
            %% ========  Downlink - physical channels  - modulace  ========

            %% Scrambling
            tic; 
            [res.b__ ] = scrambling_dl(res.w, par.dSchVec, par.dmodBit, par.dc_init); 
            res.time(10) = toc;
            if(dis.STATUS),
                if(dis.dscrambling),
                    tt = (sprintf('Skramblování datové poslopnosti problěho.'));
                    a = clock;
                    handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
                    handles.cmd_index = handles.cmd_index + 1;
                end, 
            end;
            if(dis.DETAIL),
                if(dis.dscramblingd),
                    tt = (sprintf('Ke skramblování bylo použito inicializační číslo: %d', par.dc_init));
                    a = clock;
                    handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
                    handles.cmd_index = handles.cmd_index + 1;
                end, 
                if(dis.PAUSE),
                    display('Zmáčkněte libovolnou klávesu pro pokračování...');
                    pause;
                end, 
            end; 
            if(dis.TIME),
                if(dis.dscramblingt),
                    tt = (sprintf('Proces skramblování trval: %1.2f s', res.time(10)));
                    a = clock;
                    handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
                    handles.cmd_index = handles.cmd_index + 1;
                end, 
            end;
            % Vypis dokonceneho kroku
            postup = postup + 1;
            display_progress(handles, postup, postupCelkem);
            set(handles.button_Start_Simulace, 'String', sprintf('%d/%d', postup, postupCelkem));

            %% Modulace
            % modType = BPSK_, QPSK_, 16QAM, 64QAM

            tic; 
            [res.d] = modulace(res.b__, par.dmodType); 
            res.time(12) = toc;
            if(dis.STATUS),
                if(dis.dmodulace),
                    tt =(sprintf('Mapování bitů do symbolů (vnitřní modulace) proběhla.'));
                    a = clock;
                    handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
                    handles.cmd_index = handles.cmd_index + 1;
                end, 
            end;
            if(dis.DETAIL),
                if(dis.dmodulaced),
                    tt =(sprintf('Jako modulace byla použita technika: %s', par.dmodType));
                    a = clock;
                    handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
                    handles.cmd_index = handles.cmd_index + 1;
                end, 
                if(dis.PAUSE),
                    display('Zmáčkněte libovolnou klávesu pro pokračování...');
                    pause;
                end,
            end; 
            if(dis.TIME),
                if(dis.dmodulacet),
                    tt =(sprintf('Proces modulace trval: %1.2f s', res.time(12)));
                    a = clock;
                    handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
                    handles.cmd_index = handles.cmd_index + 1;
                end, 
            end;
            % Vypis dokonceneho kroku
            postup = postup + 1;
            display_progress(handles, postup, postupCelkem);
            set(handles.button_Start_Simulace, 'String', sprintf('%d/%d', postup, postupCelkem));

            %% Mapovani

            tic;
            [res.B res.BMAP] = mapper_dl(res.d, par.SchMAX, par.dSchVec, par.N_cell_ID, dis.dmapper);
            res.time(9) = toc;
            if(dis.STATUS),
                if(dis.dmapper),
                    tt =(sprintf('Mapování symbolů do struktury rádioveho rámce proběhlo.'));
                    a = clock;
                    handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
                    handles.cmd_index = handles.cmd_index + 1;
                end, 
            end;
            if(dis.DETAIL),
                if(dis.dmapperd),
                    tt =(sprintf('Rádiový rámec obsahuje %d subrámců.', size(res.B,2)/14));
                    a = clock;
                    handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
                    handles.cmd_index = handles.cmd_index + 1;
                end, 
                if(dis.PAUSE),
                    display('Zmáčkněte libovolnou klávesu pro pokračování...');
                    pause;
                end,
            end; 
            if(dis.TIME),
                if(dis.dmappert),
                    tt =(sprintf('Proces mapování trval: %1.2f s', res.time(9)));
                    a = clock;
                    handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
                    handles.cmd_index = handles.cmd_index + 1;
                end, 
            end;
            % Vypis dokonceneho kroku
            postup = postup + 1;
            set(handles.button_Start_Simulace, 'String', sprintf('%d/%d', postup, postupCelkem));

            %% OFDM modulator
            tic;
            [res.sig] = OFDMMod_dl(res.B);
            res.time(13) = toc;
            if(dis.STATUS),
                if(dis.dOFDM),
                    tt =(sprintf('OFDM modulace proběhla.'));
                    a = clock;
                    handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
                    handles.cmd_index = handles.cmd_index + 1;
                end, 
            end;
            if(dis.DETAIL),
                if(dis.dOFDMd),
                    tt =(sprintf('Z celkového počtu %d RB bylo využito %d RB pro uživatele', par.SchMAX, sum(par.dSchVec)));
                    a = clock;
                    handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
                    handles.cmd_index = handles.cmd_index + 1;
                end, 
                if(dis.PAUSE),
                    display('Zmáčkněte libovolnou klávesu pro pokračování...');
                    pause;
                end,
            end; 
            if(dis.TIME),
                if(dis.dOFDMt),
                    tt =(sprintf('Proces OFDM modulace trval: %1.2f s', res.time(13)));
                    a = clock;
                    handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
                    handles.cmd_index = handles.cmd_index + 1;
                end, 
            end;
            % Vypis dokonceneho kroku
            postup = postup + 1;
            display_progress(handles, postup, postupCelkem);
            set(handles.button_Start_Simulace, 'String', sprintf('%d/%d', postup, postupCelkem));

        case 'UL'
            %% ========  Uplink - physical channels  - modulace  ========
            %% Scrambling
            tic; 
            [res.b__ ] = scrambling_ul(res.w,par.uSchVec, par.umodBit, par.uc_init); 
            res.time(10) = toc;
            if(dis.STATUS),
                if(dis.uscrambling),
                    tt =(sprintf('Skramblování datové poslopnoti problěho.'));
                    a = clock;
                    handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
                    handles.cmd_index = handles.cmd_index + 1;
                end, 
            end;
            if(dis.DETAIL),
                if(dis.uscramblingd),
                    tt =(sprintf('Ke skramblování bylo použito inicializační číslo: %d', par.uc_init));
                    a = clock;
                    handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
                    handles.cmd_index = handles.cmd_index + 1;
                end, 
                if(dis.PAUSE),
                    display('Zmáčkněte libovolnou klávesu pro pokračování...');
                    pause;
                end, 
            end; 
            if(dis.TIME),
                if(dis.uscramblingt),
                    tt = (sprintf('Proces skramblování trval: %1.2f s', res.time(10)));
                    a = clock;
                    handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
                    handles.cmd_index = handles.cmd_index + 1;
                end, 
            end;
            % Vypis dokonceneho kroku
            postup = postup + 1;
            display_progress(handles, postup, postupCelkem);
            set(handles.button_Start_Simulace, 'String', sprintf('%d/%d', postup, postupCelkem));

            %% Modulace
            % modType = BPSK_, QPSK_, 16QAM, 64QAM

            tic; 
            [res.d] = modulace(res.b__, par.umodType); 
            res.time(12) = toc;
            if(dis.STATUS),
                if(dis.umodulace),
                    tt = (sprintf('Mapování bitů do symbolů (vnitřní modulace) proběhla.'));
                    a = clock;
                    handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
                    handles.cmd_index = handles.cmd_index + 1;
                end, 
            end;
            if(dis.DETAIL),
                if(dis.umodulaced),
                    tt = (sprintf('Jako modulace byla použita technika: %s', par.umodType));
                    a = clock;
                    handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
                    handles.cmd_index = handles.cmd_index + 1;
                end, 
                if(dis.PAUSE),
                    display('Zmáčkněte libovolnou klávesu pro pokračování...');
                    pause;
                end, 
            end; 
            if(dis.TIME),
                if(dis.umodulacet),
                    tt = (sprintf('Proces modulace trval: %1.2f s', res.time(12))); 
                    a = clock;
                    handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
                    handles.cmd_index = handles.cmd_index + 1;
                end, 
            end;
            % Vypis dokonceneho kroku
            postup = postup + 1;
            display_progress(handles, postup, postupCelkem);
            set(handles.button_Start_Simulace, 'String', sprintf('%d/%d', postup, postupCelkem));

            %% Mapování elementů
            tic; 
            [res.B res.BMAP] = mapovani_uplink(res.d, par.uSchVec, true, par.N_cell_ID);

            res.time(9) = toc;
            if(dis.STATUS),
                if(dis.umapper),
                    tt = (sprintf('Mapování dat do resource elementů proběhlo.'));
                    a = clock;
                    handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
                    handles.cmd_index = handles.cmd_index + 1;
                end
            end
            if(dis.DETAIL)
                if(dis.umodulaced)
                    tt = (sprintf('Celkem bylo vytvořeno %d subrámců.', size(res.B,2)/14));
                    a = clock;
                    handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
                    handles.cmd_index = handles.cmd_index + 1;
                end 
                if(dis.PAUSE),display('Zmáčkněte libovolnou klávesu pro pokračování...');
                    pause;
                end
            end
            if(dis.TIME),
                if(dis.umappert),
                    tt = (sprintf('Proces mapování trval: %1.2f s', res.time(9)));
                    a = clock;
                    handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
                    handles.cmd_index = handles.cmd_index + 1;
                end
            end
            % Vypis dokonceneho kroku
            postup = postup + 1;
            display_progress(handles, postup, postupCelkem);
            set(handles.button_Start_Simulace, 'String', sprintf('%d/%d', postup, postupCelkem));

            %% SCFDMA modulator
            tic; 
            [res.sig] = SCFDMAmod_ul(res.B); 
            res.time(13) = toc;
            if(dis.STATUS),
                if(dis.uSCFDMA),
                    tt =(sprintf('Modulace SCFDMA proběhla.'));
                    a = clock;
                    handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
                    handles.cmd_index = handles.cmd_index + 1;
                end, 
            end;
            if(dis.DETAIL),
                if(dis.uSCFDMAd),
                    tt = (sprintf('Z celkového počtu %d RB bylo využito %d RB pro uživatele', par.SchMAX, sum(par.uSchVec)));
                    a = clock;
                    handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
                    handles.cmd_index = handles.cmd_index + 1;
                end, 
                if(dis.PAUSE),
                    display('Zmáčkněte libovolnou klávesu pro pokračování...');
                    pause;
                end, 
            end; 
            if(dis.TIME),
                if(dis.uSCFDMAt),
                    tt = sprintf('Proces vytvářrní SCFDMA symbolů trval: %1.2f s', res.time(13));
                    a = clock;
                    handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
                    handles.cmd_index = handles.cmd_index + 1;
                end, 
            end;
            % Vypis dokonceneho kroku
            postup = postup + 1;
            display_progress(handles, postup, postupCelkem);
            set(handles.button_Start_Simulace, 'String', sprintf('%d/%d', postup, postupCelkem));

    end

    %% =================== Rádiové prostředí =======================
    
    tic;
    % Konstanty a inicializace proměných
    res.VlivKanalu = get(handles.popupmenu_VlivKanalu,'Value')*0.25;
    n_samples = 1920;
    res.sig2 = zeros(1,length(res.sig));
    % load('F:\modelViden.mat'); % načtení perapetrů modelu
    val = get(handles.popupmenu_TypKanalu,'value');
    if(val == 1)
        res.typRad = '';
    elseif(val == 2)
        res.typRad = 'C/I';
    else
        res.typRad = 'S/N';
    end
    uu = 1; 
    bb = 1;
    subs_i = 1;
    LTE_params.connection_table(bb,uu) = true;
    LTE_params.introduce_timing_offset = 0;
    LTE_params.Ntot = 72;
    LTE_params.Nfft = 128;
    LTE_params.Nsub = 14;
    LTE_params.store_channel_trace = false;
    LTE_params.read_channel_from_trace = false;
    LTE_params.TxSymbols = n_samples;
    LTE_params.nUE = 1; 
    LTE_params.nBS = 1;
    LTE_params.Fs = 1920000;
    LTE_params.SNR_estimation = false;
    LTE_params.channel_param_RandStream = RandStream.create('mt19937ar','NumStreams',1, 'Seed', par.channel_rand_seed, 'NormalTransform', 'Ziggurat');
    LTE_params.noise_RandStream = RandStream.create('mt19937ar','NumStreams',1, 'Seed', par.noise_rand_seed, 'NormalTransform', 'Ziggurat');
    % reset náhodného generátoru
    reset(LTE_params.channel_param_RandStream);
    reset(LTE_params.noise_RandStream);
    ChanMod.nRX = 1;
    ChanMod.nTX = 1;
    ChanMod.Fs = 1920000;
    ChanMod.corrTX = 0.3;
    ChanMod.corrRX = 0.3;
    ChanMod.time_correlation = 'independent';
    ChanMod.filtering = 'BlockFading';  %'BlockFading','FastFading'
    UE_output = [ 3707764736; 2; 1; 1; 22; 7]; UE = UE_output;
    switch res.typKanalu
        case 'žádný' % žádný
            %% žádný
            res.sig2 = res.sig;
        case 'interferenční'
            %% Interferenční
            res.sig2 = interfer(res.sig,CISN, res.model_sys);
        case 'AWGN'
            %% AWGN
            ChanMod.type = 'AWGN'; % 'PedA', 'PedB', 'PedBcorr', 'AWGN', 'flat Rayleigh','VehA','VehB','TU','RA','HT','winner_II'
            I = size(res.sig,2)/n_samples;
            for i = 1:I,
                SNR(uu,subs_i) = CISN;
                subframe_i = i;
                [ChanMod_output{bb,uu} BS_output(bb).cell_genie.SINR(uu,:)] = LTE_channel_matrix(LTE_params, ChanMod, SNR(uu,subs_i), UE_output, UE(uu), uu, LTE_params.TxSymbols, subframe_i);
                BS_output(bb).y_tx = (res.sig(1+(i-1)*n_samples:(i)*n_samples))';
                UE_input = cell(1);UE_input{1} = [];

                [ChanMod_output UE_input] = LTE_channel_model(LTE_params, ChanMod, ChanMod_output, BS_output, SNR(:,subs_i), UE_input, subframe_i);
                res.sig2(1+(i-1)*n_samples:(i)*n_samples) = UE_input{1}.input';
            end
        case 'flatRayleigh'
            %% flat Rayleigh
            ChanMod.type = 'flat Rayleigh'; % 'PedA', 'PedB', 'PedBcorr', 'AWGN', 'flat Rayleigh','VehA','VehB','TU','RA','HT','winner_II'
            I = size(res.sig,2)/n_samples;
            for i = 1:I,
                SNR(uu,subs_i) = (CISN - 20*log10(1/res.VlivKanalu)); % korekce zvyraznění šumu při potlačení vlivu kanálu
                subframe_i = i;
                [ChanMod_output{bb,uu} BS_output(bb).cell_genie.SINR(uu,:)] = LTE_channel_matrix(LTE_params, ChanMod, SNR(uu,subs_i), UE_output, UE(uu), uu, LTE_params.TxSymbols, subframe_i);
                BS_output(bb).y_tx = (res.sig(1+(i-1)*n_samples:(i)*n_samples))';
                UE_input = cell(1);UE_input{1} = [];

                [ChanMod_output UE_input] = LTE_channel_model(LTE_params, ChanMod, ChanMod_output, BS_output, SNR(:,subs_i), UE_input, subframe_i);
                res.sig2(1+(i-1)*n_samples:(i)*n_samples) = (res.VlivKanalu * UE_input{1}.input' + (1 - res.VlivKanalu) * res.sig(1+(i-1)*n_samples:(i)*n_samples));
            end
        case 'PedA'
            %% PedA
            ChanMod.tap_delays = [0 0.11 0.19 0.41]*1e-6;
            ChanMod.tap_delays_samples = round(ChanMod.Fs*ChanMod.tap_delays);
            ChanMod.PDP_dB = [0 -9.7 -19.2 -22.8;  % Average power [dB]
                              0 110*10^-9 190*10^-9 410*10^-9]; % delay (s)
            ChanMod.normH = sqrt(sum(10.^(ChanMod.PDP_dB(1,:)/10)));
            ChanMod.num_faders = length(unique(ChanMod.tap_delays_samples));
            for i = 1:ChanMod.num_faders
                ChanMod.corrTX(i,:,:) = 0.3;
                ChanMod.corrRX(i,:,:) = 0.3;
            end
            ChanMod.interpolator = channel_resampling.nearestNeighborInterpolator(...
                    LTE_params.Fs,...                  % Sampling frequency (Hz)
                    size(ChanMod.PDP_dB,2),...         % Number of Taps
                    ChanMod.PDP_dB(2,:,:),...          % delay (s)
                    ChanMod.PDP_dB(1,:,:),...          % Average power [dB]
                    ChanMod.nTX,ChanMod.nRX);
            

            ChanMod.relative_power_dB = [0 -9.7 -19.2 -22.8];
            ChanMod.type = 'PedA'; % 'PedA', 'PedB', 'PedBcorr', 'AWGN', 'flat Rayleigh','VehA','VehB','TU','RA','HT','winner_II'
            I = size(res.sig,2)/n_samples;
            for i = 1:I,
                SNR(uu,subs_i) = (CISN - 20*log10(1/res.VlivKanalu)); % korekce zvyraznění šumu při potlačení vlivu kanálu
                subframe_i = i;
                [ChanMod_output{bb,uu} BS_output(bb).cell_genie.SINR(uu,:)] = LTE_channel_matrix(LTE_params, ChanMod, SNR(uu,subs_i), UE_output, UE(uu), uu, LTE_params.TxSymbols, subframe_i);
                BS_output(bb).y_tx = (res.sig(1+(i-1)*n_samples:(i)*n_samples))';
                UE_input = cell(1);UE_input{1} = [];

                [ChanMod_output UE_input] = LTE_channel_model(LTE_params, ChanMod, ChanMod_output, BS_output, SNR(:,subs_i), UE_input, subframe_i);
                res.sig2(1+(i-1)*n_samples:(i)*n_samples) = (res.VlivKanalu * UE_input{1}.input' + (1 - res.VlivKanalu) * res.sig(1+(i-1)*n_samples:(i)*n_samples));
            end
        case 'PedB'
            %% PedB
            ChanMod.tap_delays = [0 0.02 0.08 0.12 0.23 0.3700]*1e-5;
            ChanMod.tap_delays_samples = round(ChanMod.Fs*ChanMod.tap_delays);
            ChanMod.num_faders = length(unique(ChanMod.tap_delays_samples));
            ChanMod.PDP_dB = [0   -0.9  -4.9  -8    -7.8  -23.9; % Average power [dB]
                          0 200*10^-9 800*10^-9 1200*10^-9 2300*10^-9 3700*10^-9]; % delay (s)
            ChanMod.normH = sqrt(sum(10.^(ChanMod.PDP_dB(1,:)/10)));
            for i = 1:ChanMod.num_faders
                ChanMod.corrTX(i,:,:) = 0.3;
                ChanMod.corrRX(i,:,:) = 0.3;
            end
            ChanMod.interpolator = channel_resampling.nearestNeighborInterpolator(...
                    LTE_params.Fs,...                  % Sampling frequency (Hz)
                    size(ChanMod.PDP_dB,2),...         % Number of Taps
                    ChanMod.PDP_dB(2,:,:),...          % delay (s)
                    ChanMod.PDP_dB(1,:,:),...          % Average power [dB]
                    ChanMod.nTX,ChanMod.nRX);
            ChanMod.relative_power_dB = [0   -0.9  -4.9  -8    -7.8  -23.9];
            ChanMod.type = 'PedB'; % 'PedA', 'PedB', 'PedBcorr', 'AWGN', 'flat Rayleigh','VehA','VehB','TU','RA','HT','winner_II'
            I = size(res.sig,2)/n_samples;
            for i = 1:I,
                SNR(uu,subs_i) = (CISN - 20*log10(1/res.VlivKanalu)); % korekce zvyraznění šumu při potlačení vlivu kanálu
                subframe_i = i;
                [ChanMod_output{bb,uu} BS_output(bb).cell_genie.SINR(uu,:)] = LTE_channel_matrix(LTE_params, ChanMod, SNR(uu,subs_i), UE_output, UE(uu), uu, LTE_params.TxSymbols, subframe_i);
                BS_output(bb).y_tx = (res.sig(1+(i-1)*n_samples:(i)*n_samples))';
                UE_input = cell(1);UE_input{1} = [];

                [ChanMod_output UE_input] = LTE_channel_model(LTE_params, ChanMod, ChanMod_output, BS_output, SNR(:,subs_i), UE_input, subframe_i);
                res.sig2(1+(i-1)*n_samples:(i)*n_samples) = (res.VlivKanalu * UE_input{1}.input' + (1 - res.VlivKanalu) * res.sig(1+(i-1)*n_samples:(i)*n_samples));
            end
    end
    res.time(14) = toc;
    if(dis.STATUS),
        if(dis.rad),
            tt =(sprintf('Zpracování signálu v modelu rádiového kanálu proběhlo.'));
            a = clock;
            handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
            handles.cmd_index = handles.cmd_index + 1;
        end, 
    end;
    if(dis.DETAIL),
        if(dis.radd),
            if(strcmp(res.typRad,'')), 
                tt = (sprintf('Použitý typ kanálu: "%s".', res.typKanalu));
            else
                tt = (sprintf('Použitý typ kanálu: "%s". Poměr %s %d', res.typKanalu, res.typRad, CISN));
            end
            a = clock;
            handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
            handles.cmd_index = handles.cmd_index + 1;
        end, 
        if(dis.PAUSE),
            display('Zmáčkněte libovolnou klávesu pro pokračování...');
            pause;
        end, 
    end; 
    if(dis.TIME),
        if(dis.radt),
            tt = sprintf('Proces zpracování signálu v modelu rádiového kanálu trval: %1.2f s', res.time(14));
            a = clock;
            handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
            handles.cmd_index = handles.cmd_index + 1;
        end, 
    end;
    % Vypis dokonceneho kroku
    postup = postup + 1;
    display_progress(handles, postup, postupCelkem);
    set(handles.button_Start_Simulace, 'String', sprintf('%d/%d', postup, postupCelkem));

    switch (res.model_sys)
        case 'DL'
            %% ========  Downlink - physical channels - demodulace  ========
            %% OFDM demodulator
            tic;
            [res.B_] = OFDMDeMod_dl(res.sig2);
            res.time(16) = toc;
            if(dis.STATUS),
                if(dis.dOFDM),
                    tt =(sprintf('OFDM demodulace proběhla.'));
                    a = clock;
                    handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
                    handles.cmd_index = handles.cmd_index + 1;
                end, 
            end;
            if(dis.DETAIL),
                if(dis.dOFDMd),
                    tt =(sprintf('Z celkového počtu %d RB bylo využito %d RB pro uživatele', par.SchMAX, sum(par.dSchVec)));
                    a = clock;
                    handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
                    handles.cmd_index = handles.cmd_index + 1;
                end, 
                if(dis.PAUSE),
                    display('Zmáčkněte libovolnou klávesu pro pokračování...');
                    pause;
                end,
            end; 
            if(dis.TIME),
                if(dis.dOFDMt),
                    tt =(sprintf('Proces OFDM demodulace trval: %1.2f s', res.time(16)));
                    a = clock;
                    handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
                    handles.cmd_index = handles.cmd_index + 1;
                end, 
            end;
            % Vypis dokonceneho kroku
            postup = postup + 1;
            display_progress(handles, postup, postupCelkem);
            set(handles.button_Start_Simulace, 'String', sprintf('%d/%d', postup, postupCelkem));

            %% Vyrovnani kanalu
            tic;
            if(par.vyrovKanal)
                [res.B_] = vyrovnani_Kanalu_dl(res.B_, res.model_sys, par.N_cell_ID);
            end
            res.time(18) = toc;
            if(dis.STATUS),
                if(dis.vyrk),
                    tt =(sprintf('Ekvalizace kanálu proběhla.'));
                    a = clock;
                    handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
                    handles.cmd_index = handles.cmd_index + 1;
                end, 
            end;
            if(dis.DETAIL),
                if(dis.vyrkd),
                    tt =(sprintf('Proces ekvalizace napravuje poškození signálu způsobené rádiovým kanálem.'));
                    a = clock;
                    handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
                    handles.cmd_index = handles.cmd_index + 1;
                end, 
                if(dis.PAUSE),
                    display('Zmáčkněte libovolnou klávesu pro pokračování...');
                    pause;
                end,
            end; 
            if(dis.TIME),
                if(dis.vyrkt),
                    tt =(sprintf('Proces ekvalizace trval: %1.2f s', res.time(18)));
                    a = clock;
                    handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
                    handles.cmd_index = handles.cmd_index + 1;
                end, 
            end;
            %% Demapovani
            if(false) %% Detail Rádiového kanálu
                I = size(res.B,2)/14;
                tt = 'PedB';

                fig0 = figure('Name', 'Struktura rádiového rámce před vysíláním');
                axes0 = axes('Parent',fig0, 'YTickLabel',{'0','12','24','36','28','60','71'},...
                    'YTick',[1 13 25 37 49 61 72],'XTickLabel',0:1:I,...
                    'XTick',1:14:14*(I));
                xlim(axes0,[1 14*(I)]);
                ylim(axes0,[1 72]);
                grid(axes0,'on');
                xlabel('Subrámec [-]');
                ylabel('Subnosná [-]');
                zlabel('Normovaný výkon [-]');
                title('Struktura rádiového rámce před vysíláním, B = 1.4MHz (6x12 subnosných)');
                hold(axes0,'all');
                view(axes0,[-20 20]);
                surf(abs(res.B),'Parent',axes0, 'MarkerSize',0.5,'Marker','.','LineStyle','none',...
                    'FaceColor','texturemap');
                
                
                fig1 = figure('Name', ['Poškození kanálu - ' tt]);
                axes1 = axes('Parent',fig1, 'YTickLabel',{'0','12','24','36','28','60','71'},...
                    'YTick',[1 13 25 37 49 61 72],'XTickLabel',0:1:I,...
                    'XTick',1:14:14*(I));
                xlim(axes1,[1 14*(I)]);
                ylim(axes1,[1 72]);
                grid(axes1,'on');
                xlabel('Subrámec [-]');
                ylabel('Subnosná [-]');
                zlabel('Normovaný výkon [-]');
                title(['Poškození kanálu - ' tt ', B = 1.4MHz (6x12 subnosných)']);
                view(axes1,[-20 20]);
                hold(axes1,'all');
                surf(abs(res.B_ - res.B),'Parent',axes1, 'MarkerSize',0.5,'Marker','.','LineStyle','none',...
                    'FaceColor','texturemap');
                
                I =3;
                fig2 = figure('Name', ['Poškození kanálu - ' tt ', detail: subrámec číslo 1 a 2']);
                axes2 = axes('Parent',fig2, 'YTickLabel',{'0','12','24','36','28','60','71'},...
                    'YTick',[1 13 25 37 49 61 72],'XTickLabel',1:1:I,...
                    'XTick',1:14:14*(I));
                xlim(axes2,[1 (14*(I-1)+1)]);
                ylim(axes2,[1 72]);
                grid(axes2,'on');
                xlabel('Subrámec [-]');
                ylabel('Subnosná [-]');
                zlabel('Normovaný výkon [-]');
                title(['Poškození kanálu - ' tt ', detail: subrámec číslo 1 a 2']);
                view(axes2,[-20 20]);
                hold(axes2,'all');
                surf(abs(res.B_(:,15:42) - res.B(:,15:42)),'Parent',axes2, 'MarkerSize',0.5,'Marker','.','LineStyle','none',...
                    'FaceColor','texturemap');
            end
            tic;
            [res.d_] = Demapper_dl(res.B_, res.BMAP);
            res.time(17) = toc;
            if(dis.STATUS),
                if(dis.ddemapper),
                    tt =(sprintf('Demapování symbolů ze struktury rádioveho rámce proběhlo.'));
                    a = clock;
                    handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
                    handles.cmd_index = handles.cmd_index + 1;
                end, 
            end;
            if(dis.DETAIL),
                if(dis.ddemapperd),
                    tt =(sprintf('Bylo demapováno %d symbolů.', size(res.d_,1)));
                    a = clock;
                    handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
                    handles.cmd_index = handles.cmd_index + 1;
                end, 
                if(dis.PAUSE),
                    display('Zmáčkněte libovolnou klávesu pro pokračování...');
                    pause;
                end,
            end; 
            if(dis.TIME),
                if(dis.ddemappert),
                    tt =(sprintf('Proces demapování trval: %1.2f s', res.time(17)));
                    a = clock;
                    handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
                    handles.cmd_index = handles.cmd_index + 1;
                end, 
            end;
            % Vypis dokonceneho kroku
            postup = postup + 1;
            display_progress(handles, postup, postupCelkem);
            set(handles.button_Start_Simulace, 'String', sprintf('%d/%d', postup, postupCelkem));

            % tic; [res.d_] = OFDMdemod(res.sig, par.SchMAX, par.dSchVec,length(res.d)); res.time(14) = toc;
            % if(dis.STATUS),if(dis.ddeOFDM),display(sprintf('OFDM demodulace proběhla.')),end, end;if(dis.DETAIL),if(dis.ddeOFDMd),display(sprintf('_')),end, if(dis.PAUSE),display('Zmáčkněte libovolnou klávesu pro pokračování...');pause;end, end; if(dis.TIME),if(dis.ddeOFDMt),display(sprintf('Proces OFDM demodulace trval: %1.2f s', res.time(14))), end, end;

            %% Demodulace
            tic; 
            [res.b_m] = demodulace(res.d_, par.dmodType, res.w_l); 
            res.time(15) = toc;
            if(dis.STATUS),
                if(dis.ddemod),
                    tt = (sprintf('Demapování symbolů do bitů (vnitřní demodulace) proběhla.'));
                    a = clock;
                    handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
                    handles.cmd_index = handles.cmd_index + 1;
                end, 
            end;
            if(dis.DETAIL),
                if(dis.ddemodd),
                    tt = (sprintf('Pro demodulaci byla použita technika: %s', par.dmodType));
                    a = clock;
                    handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
                    handles.cmd_index = handles.cmd_index + 1;
                end, 
                if(dis.PAUSE),
                    display('Zmáčkněte libovolnou klávesu pro pokračování...');
                    pause;
                end, 
            end; 
            if(dis.TIME),
                if(dis.dmodulacet),
                    tt =(sprintf('Proces demodulace trval: %1.2f s', res.time(15)));
                    a = clock;
                    handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
                    handles.cmd_index = handles.cmd_index + 1;
                end, 
            end;
            % Vypis dokonceneho kroku
            postup = postup + 1;
            display_progress(handles, postup, postupCelkem);
            set(handles.button_Start_Simulace, 'String', sprintf('%d/%d', postup, postupCelkem));

            %% Descrambling
            tic; 
            [res.b__d ] = scrambling_dl(res.b_m, par.dSchVec, par.dmodBit, par.dc_init); 
            res.time(11) = toc;
            if(dis.STATUS),
                if(dis.ddescram),
                    tt = (sprintf('Deskramblování datové poslopnoti problěho.'));
                    a = clock;
                    handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
                    handles.cmd_index = handles.cmd_index + 1;
                end, 
            end;
            if(dis.DETAIL),
                if(dis.ddescramd),
                    tt = (sprintf('Ke deskramblování bylo použito inicializační číslo: %d', par.dc_init));
                    a = clock;
                    handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
                    handles.cmd_index = handles.cmd_index + 1;
                end, 
                if(dis.PAUSE),
                    display('Zmáčkněte libovolnou klávesu pro pokračování...');
                    pause;
                end, 
            end; 
            if(dis.TIME),
                if(dis.ddescramt),
                    tt = (sprintf('Proces deskramblování trval: %1.2f s', res.time(11)));
                    a = clock;
                    handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
                    handles.cmd_index = handles.cmd_index + 1;
                end, 
            end;
            % Vypis dokonceneho kroku
            postup = postup + 1;
            display_progress(handles, postup, postupCelkem);
            set(handles.button_Start_Simulace, 'String', sprintf('%d/%d', postup, postupCelkem));
        case 'UL'
            %% ========  Uplink - physical channels - demodulace  ========
            %% SCFDMA demodulator
            tic; 
            [res.B_] = SCFDMAdemod_ul(res.sig2); 
            res.time(16) = toc;
            if(dis.STATUS),
                if(dis.udeSCFDMA),
                    tt =(sprintf('SCFDMA demodulace proběhla.'));
                    a = clock;
                    handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
                    handles.cmd_index = handles.cmd_index + 1;
                end, 
            end;
            if(dis.DETAIL),
                if(dis.udeSCFDMAd),
                    tt = (sprintf('Přijatá posloupnost obsahuje %d subrámců', size(res.B_,2)/14));
                    a = clock;
                    handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
                    handles.cmd_index = handles.cmd_index + 1;
                end, 
                if(dis.PAUSE),
                    display('Zmáčkněte libovolnou klávesu pro pokračování...');
                    pause;
                end, 
            end; 
            if(dis.TIME),
                if(dis.udeSCFDMAt),
                    tt = (sprintf('Proces SCFDMA demodulace trval: %1.2f s', res.time(16)));
                    a = clock;
                    handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
                    handles.cmd_index = handles.cmd_index + 1;
                end, 
            end;
            % Vypis dokonceneho kroku
            postup = postup + 1;
            display_progress(handles, postup, postupCelkem);
            set(handles.button_Start_Simulace, 'String', sprintf('%d/%d', postup, postupCelkem));

            %% Vyrovnani Kanalu
            tic;
            if(par.vyrovKanal)
                [res.B_] = vyrovnani_Kanalu_ul(res.B_, par.uSchVec , par.N_cell_ID);
            end
            res.time(18) = toc;
            if(dis.STATUS),
                if(dis.vyrk),
                    tt =(sprintf('Ekvalizace kanálu proběhla.'));
                    a = clock;
                    handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
                    handles.cmd_index = handles.cmd_index + 1;
                end, 
            end;
            if(dis.DETAIL),
                if(dis.vyrkd),
                    tt =(sprintf('Proces ekvalizace napravuje poškození signálu způsobené rádiovým kanálem.'));
                    a = clock;
                    handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
                    handles.cmd_index = handles.cmd_index + 1;
                end, 
                if(dis.PAUSE),
                    display('Zmáčkněte libovolnou klávesu pro pokračování...');
                    pause;
                end,
            end; 
            if(dis.TIME),
                if(dis.vyrkt),
                    tt =(sprintf('Proces ekvalizace trval: %1.2f s', res.time(18)));
                    a = clock;
                    handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
                    handles.cmd_index = handles.cmd_index + 1;
                end, 
            end;
            %% Demapovani
            tic;
            [res.d_] = demapovani_uplink(res.B_, res.BMAP, par.uSchVec);
            res.time(17) = toc;
            if(dis.STATUS),
                if(dis.udemapper),
                    tt =(sprintf('Demapování symbolů ze struktury rádioveho rámce proběhlo.'));
                    a = clock;
                    handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
                    handles.cmd_index = handles.cmd_index + 1;
                end, 
            end;
            if(dis.DETAIL),
                if(dis.udemapperd),
                    tt =(sprintf('Bylo demapováno %d symbolů.', size(res.d_,1)));
                    a = clock;
                    handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
                    handles.cmd_index = handles.cmd_index + 1;
                end, 
                if(dis.PAUSE),
                    display('Zmáčkněte libovolnou klávesu pro pokračování...');
                    pause;
                end,
            end; 
            if(dis.TIME),
                if(dis.udemappert),
                    tt =(sprintf('Proces demapování trval: %1.2f s', res.time(17)));
                    a = clock;
                    handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
                    handles.cmd_index = handles.cmd_index + 1;
                end, 
            end;
            % Vypis dokonceneho kroku
            postup = postup + 1;
            display_progress(handles, postup, postupCelkem);
            set(handles.button_Start_Simulace, 'String', sprintf('%d/%d', postup, postupCelkem));

            %% Demodulace
            tic; 
            [res.b_m] = demodulace(res.d_, par.umodType, res.w_l); 
            res.time(15) = toc;
            if(dis.STATUS),
                if(dis.udemod),
                    tt =(sprintf('Demapování symbolů do bitů (vnitřní demodulace) proběhla.'));
                    a = clock;
                    handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
                    handles.cmd_index = handles.cmd_index + 1;
                end, 
            end;
            if(dis.DETAIL),
                if(dis.udemodd),
                    tt = (sprintf('Pro demodulaci byla použita technika: %s', par.umodType));
                    a = clock;
                    handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
                    handles.cmd_index = handles.cmd_index + 1;
                end,
                if(dis.PAUSE),display('Zmáčkněte libovolnou klávesu pro pokračování...');
                    pause;
                end, 
            end; 
            if(dis.TIME),
                if(dis.umodulacet),
                    tt = (sprintf('Proces demodulace trval: %1.2f s', res.time(15)));
                    a = clock;
                    handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
                    handles.cmd_index = handles.cmd_index + 1;
                end, 
            end;
            % Vypis dokonceneho kroku
            postup = postup + 1;
            display_progress(handles, postup, postupCelkem);
            set(handles.button_Start_Simulace, 'String', sprintf('%d/%d', postup, postupCelkem));

            %% Descrambling
            tic; 
            [res.b__d ] = scrambling_ul(res.b_m,par.uSchVec, par.umodBit, par.uc_init); 
            res.time(11) = toc;
            if(dis.STATUS),
                if(dis.udescram),
                    tt = (sprintf('Deskramblování datové poslopnoti problěho.'));
                    a = clock;
                    handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
                    handles.cmd_index = handles.cmd_index + 1;
                end, 
            end;
            if(dis.DETAIL),
                if(dis.udescramd),
                    tt = (sprintf('Ke deskramblování bylo použito inicializační číslo: %d', par.uc_init));
                    a = clock;
                    handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
                    handles.cmd_index = handles.cmd_index + 1;
                end, 
                if(dis.PAUSE),
                    display('Zmáčkněte libovolnou klávesu pro pokračování...');
                    pause;
                end, 
            end; 
            if(dis.TIME),
                if(dis.udescramt),
                    tt = (sprintf('Proces deskramblování trval: %1.2f s', res.time(11)));
                    a = clock;
                    handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
                    handles.cmd_index = handles.cmd_index + 1;
                end, 
            end;
            % Vypis dokonceneho kroku
            postup = postup + 1;
            display_progress(handles, postup, postupCelkem);
            set(handles.button_Start_Simulace, 'String', sprintf('%d/%d', postup, postupCelkem));

    end

    %% ========  Dekodér  ========

    %% Kanálové dekódování
    % Bloky jsou dekódovány, pokud došlo k chybě a bylo li to možné byla chyba
    % opravena.
    tic; 
    [res.c_ res.tErr] = chDeCoding(res.b__d, res.c_l, res.w_l); 
    res.time(5) = toc;
    if(dis.STATUS),
        if(dis.chdeCode),
            tt = (sprintf('Kanálové dekódování proběhlo.'));
            a = clock;
            handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
            handles.cmd_index = handles.cmd_index + 1;
        end, 
    end;
    if(dis.DETAIL),
        if(dis.chdeCoded),
            tt = (sprintf('Celkem bylo obnoveno %d bitů.', length(res.c_)));
            a = clock;
            handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
            handles.cmd_index = handles.cmd_index + 1;
        end, 
        if(dis.PAUSE),
            display('Zmáčkněte libovolnou klávesu pro pokračování...');
            pause;
        end, 
    end; 
    if(dis.TIME),
        if(dis.chdeCodet),
            tt = (sprintf('Proces kanálového dekódování trval: %1.2f s', res.time(5)));
            a = clock;
            handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
            handles.cmd_index = handles.cmd_index + 1;
        end, 
    end;
    % Vypis dokonceneho kroku
    postup = postup + 1;
    display_progress(handles, postup, postupCelkem);
    set(handles.button_Start_Simulace, 'String', sprintf('%d/%d', postup, postupCelkem));

    %% Přeskupení dat z bloků do původního vstupního celku
    % Z původních bloků zkontroluje a odebere CRC, vyhodnocení chyb uloží do
    % vektoru b_err a odstraní přidané plnící bity. Výstupem jsou tedy vstupní
    % data s CRC
    tic; 
    [res.b_ res.b_err] = cbDeSegmentation(res.c_, res.c_F, res.c_l); 
    res.time(6) = toc;
    if(dis.STATUS),
        if(dis.desegment),
            tt = (sprintf('Data byly přeskupeny zpět do jediného toku dat.'));
            a = clock;
            handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
            handles.cmd_index = handles.cmd_index + 1;
        end, 
    end;
    if(dis.DETAIL),
        if(dis.desegmentd),
            tt = (sprintf('Bylo sjednoceno %d bloků',length(res.c_l)));
            a = clock;
            handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
            handles.cmd_index = handles.cmd_index + 1;
        end, 
        if(dis.PAUSE),
            display('Zmáčkněte libovolnou klávesu pro pokračování...');
            pause;
        end, 
    end; 
    if(dis.TIME),
        if(dis.desegmentt),
            tt = (sprintf('Proces přeskupení bloků do původního toku trval: %1.2f s', res.time(6)));
            a = clock;
            handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
            handles.cmd_index = handles.cmd_index + 1;
        end, 
    end;
    % Vypis dokonceneho kroku
    postup = postup + 1;
    display_progress(handles, postup, postupCelkem);
    set(handles.button_Start_Simulace, 'String', sprintf('%d/%d', postup, postupCelkem));

    %% Odebrání CRC
    tic; 
    [res.a_ res.a_errCRC] = det_CRC('gCRC24A', res.b_); 
    res.time(7) = toc;

    % Vypis dokonceneho kroku
    postup = postup + 1;
    display_progress(handles, postup, postupCelkem);
    set(handles.button_Start_Simulace, 'String', sprintf('%d/%d', postup, postupCelkem));

    %% Zobrazení Rekontruovaného obrázku
    if((strcmp(vstup,'Obr'))), 
        set(handles.fig2,'Visible','on');
        set(handles.text_fig2, 'Visible', 'off');
        axes(handles.fig2);
        res.a__ = reshape(res.a_,sqrt(size(res.a_,1)),sqrt(size(res.a_,1)));
        imshow(res.a__*255);
    end
    

    %% ========  Závěr  ========

    %% vyhodnocení chyb
    tic; 
    [res.a_err res.a_nErr] = noOfErr(res.a, res.a_); 
    res.time(8) = toc;
    if(dis.STATUS),
        if(dis.remCRC),
            tt = (sprintf('Byla odebrána ochrana CRC od transportního bloku dat.'));
            a = clock;
            handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
            handles.cmd_index = handles.cmd_index + 1;
        end, 
    end;
    if(dis.DETAIL),
        if(dis.remCRCd),
            tt = (sprintf('Bylo tak dosaženo původní informace.'));
            a = clock;
            handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
            handles.cmd_index = handles.cmd_index + 1;
        end, 
        if(dis.PAUSE),
            display('Zmáčkněte libovolnou klávesu pro pokračování...');
            pause;
        end, 
    end; 
    if(dis.TIME),
        if(dis.remCRCt),
            tt = (sprintf('Proces odebrání CRC trval: %1.2f s', res.time(7)));
            a = clock;
            handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
            handles.cmd_index = handles.cmd_index + 1;
        end, 
    end; 
    if(dis.TIME),
        if(dis.errRest),
            tt = (sprintf('Proces Vyhodnocení chyb trval: %1.2f s', res.time(8)));
            a = clock;
            handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
            handles.cmd_index = handles.cmd_index + 1;
        end, 
    end;
    if(dis.SumErrt),
        tt = (sprintf('Celkový čas simulace je: %1.2f s', sum(res.time)));
        a = clock;
        handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
        handles.cmd_index = handles.cmd_index + 1;
    end;
    
    %% Zobrazení výpisu o výsledcích simulace
    % Zobrazuje informace o výsledcích simulace modelu LTE. Nastavení
    % podrobnisti, či konkrétnícho zobrazení určitých informací se řídí
    % nastavením v souboru, který funkce přijimá jako vstupní proměnou.

    %% Informace týkající se chyb
    % Zobrazení výsledků kontroly CRC vstupních dat, chybového poměru a počtu chyb
    if(dis.ERR),
        % Počáteční hlavička
        % slouží k uvedení a oddělení zobrazení výsledků od celku
        if(dis.oddel)
            tt = (sprintf('******************* Vyhodnocení procesu modelu LTE *******************'));       
            a = clock;
            handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
            handles.cmd_index = handles.cmd_index + 1;
        end

        % Zobrazení vyhodnocení CRC u bloků, které byly segmentovány
        if(dis.errBlokCRC),
            if(length(res.c_l) == 1),
                tt= ('Data nebyly segmentovány.');
                a = clock;
                handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
                handles.cmd_index = handles.cmd_index + 1;
            else
                e = 0;
                for i = 1:length(res.b_err),
                    if(res.b_err(i) == 1),
                        tt = (sprintf('Kontrola CRC v bloku %d neproběhla v pořádku.',i));
                        a = clock;
                        handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
                        handles.cmd_index = handles.cmd_index + 1;
                        e = 1;
                    end
                end
                if( e == 0)
                    tt = ('Kontrola CRC u všech bloků proběhla v pořádku.');
                    a = clock;
                    handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
                    handles.cmd_index = handles.cmd_index + 1;
                end
            end
        end

        % Zobrazení výsledků kontroly CRC
        if(dis.errCRC),
            if(res.a_errCRC == 1),
                tt = ('Kontrola CRC neproběhla v pořádku. Data obsahují chyby.');
                a = clock;
                handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
                handles.cmd_index = handles.cmd_index + 1;
            elseif(res.a_errCRC == 0),
                tt = ('Kontrola CRC proběhla v pořádku. Data neobsahují chyby.');
                a = clock;
                handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
                handles.cmd_index = handles.cmd_index + 1;
            end
        end

        % Zobrazení chybového poměru
        if(dis.err),
            tt =(sprintf('Chybový poměr: %1.0e', res.a_err));
            a = clock;
            handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
            handles.cmd_index = handles.cmd_index + 1;
        end

        % Zobrazení počtu chyb
        if(dis.nErr),
            tt = (sprintf('Počet chyb: %d', res.a_nErr));
            a = clock;
            handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
            handles.cmd_index = handles.cmd_index + 1;
        end

        % Zobrazení počtu chyb v Turbodekodéru
%         if(dis.tErr),
%             display(sprintf('Počet chyb v dekódování turbo dekóderem: %d', sum(res.tErr)));
%         end
    end
    set(handles.text_chybovost_hodnota, 'String', sprintf('%1.0e', res.a_err));
    res.time_celkem = res.time_celkem + sum(res.time);
    res.graf_chybovost(i_chybovost) = res.a_err;
    res.graf_CISN(i_chybovost) = CISN;
    i_chybovost = i_chybovost + 1;

    %% Uložení výsledků
    % Uloží výsledky simulace spolu se všemi simulovanými daty
    save(sprintf('%s.mat', res.label), 'res');
    handles.res = res;
    
    
    if(dis.timeplan), % Kontrolní výpis progressu 
        if(dis.oddel)
            tt= (sprintf('*************************************'));
            a = clock;
            handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
            handles.cmd_index = handles.cmd_index + 1;
        end
        casOdStartu = toc(CelkovyCasSimulace);
        hotovo = postup/postupCelkem;
        Zbyva_cas = casOdStartu*(hotovo)^-1;
        tt= (sprintf('Postup: %d/%d ', postup, postupCelkem));
        a = clock;
        handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
        handles.cmd_index = handles.cmd_index + 1;
        tt = sprintf('Uplynuly cas: %5.0d s.', round(casOdStartu));
        a = clock;
        handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
        handles.cmd_index = handles.cmd_index + 1;
        tt = sprintf('Odhadovany cas: %5.0d s.', round(Zbyva_cas));
        a = clock;
        handles.cmd_message{handles.cmd_index} = sprintf('%02d:%02d:%02d >> %s',a(4), a(5),round(a(6)),tt);
        handles.cmd_index = handles.cmd_index + 1;
    end
    if(handles.cmd_index == 1)
        % do nothing
    else
        set(handles.edit_cmd,'String',handles.cmd_message);
        set(handles.edit_cmd,'Value', handles.cmd_index - 1);
    end
end
helpdlg('Simulace proběhla úspěšně.', 'Konec simulace');
set(handles.button_Start_Simulace, 'String', 'Start');
set(handles.button_Start_Simulace, 'Enable', 'on');
set(handles.button_GrafCISN, 'Enable', 'on');
set(handles.button_MapRB, 'Enable', 'on');
set(handles.button_IQ, 'Enable', 'on');
CelkovyCasSimulace_time = toc(CelkovyCasSimulace);
set(handles.text_doba_simulace_hodnota, 'String', sprintf('%1.2f s',CelkovyCasSimulace_time));
handles.start = true;

c = true;
limit = 10/length(res.a);
for i23 = length(res.graf_chybovost):-1:2;
    if(res.graf_chybovost(i23-1) > limit) && (res.graf_chybovost(i23) < limit) && c == true;
        res.graf_chybovost(i23) = limit;
        c = false;
    end
    if(res.graf_chybovost(i23) < limit && c == false)
        res.graf_chybovost(i23) = limit;
    end
end
%% Uložení výsledků
% Uloží výsledky simulace spolu se všemi simulovanými daty
save(sprintf('%s.mat', res.label), 'res');
handles.res = res;
% Save the change you made to the structure
guidata(hObject,handles)


function edit_HodnotaPomeruCISN_Callback(hObject, eventdata, handles)
% hObject    handle to edit_HodnotaPomeruCISN (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'String') returns contents of edit_HodnotaPomeruCISN as text
%        str2double(get(hObject,'String')) returns contents of edit_HodnotaPomeruCISN as a double


% --- Executes during object creation, after setting all properties.
function edit_HodnotaPomeruCISN_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit_HodnotaPomeruCISN (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called

% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end


% % --- Executes on selection change in popupmenu_CISN.
% function popupmenu_CISN_Callback(hObject, eventdata, handles)
% % hObject    handle to popupmenu_CISN (see GCBO)
% % eventdata  reserved - to be defined in a future version of MATLAB
% % handles    structure with handles and user data (see GUIDATA)
% 
% % Hints: contents = cellstr(get(hObject,'String')) returns popupmenu_CISN contents as cell array
% %        contents{get(hObject,'Value')} returns selected item from popupmenu_CISN
% switch (get(handles.popupmenu_CISN, 'Value')) % 1-C/I, 2-S/N
%     case(1)
%         set(handles.label_hodnota, 'String', 'Hodnota C/I');
%         set(handles.button_GrafCISN, 'String', 'Graf C/I, BER');
%         set(handles.checkbox_IntervalCI, 'Visible', 'on');
%         switch (get(handles.checkbox_IntervalCI,'Value'))
%             case (0)  
%                 set(handles.label_hodnota,'Visible','on');
%                 set(handles.edit_HodnotaPomeruCISN,'Visible','on');
%                 set(handles.label_dB,'Visible','on');
%                 set(handles.label_Pocatecni,'Visible','off');
%                 set(handles.edit_Pocatecni,'Visible','off');
%                 set(handles.label_Koncova,'Visible','off');
%                 set(handles.edit_Koncova,'Visible','off');
%                 set(handles.label_Krok,'Visible','off');
%                 set(handles.edit_Krok,'Visible','off');
%                 set(handles.button_GrafCISN, 'Visible', 'off');
%             case (1) 
%                 set(handles.label_hodnota,'Visible','on');
%                 set(handles.edit_HodnotaPomeruCISN,'Visible','off');
%                 set(handles.label_dB,'Visible','off');
%                 set(handles.label_Pocatecni,'Visible','on');
%                 set(handles.edit_Pocatecni,'Visible','on');
%                 set(handles.label_Koncova,'Visible','on');
%                 set(handles.edit_Koncova,'Visible','on');
%                 set(handles.label_Krok,'Visible','on');
%                 set(handles.edit_Krok,'Visible','on');
%                 set(handles.button_GrafCISN, 'Visible', 'on');
%         end
%     case(2)
%         set(handles.label_hodnota, 'String', 'Hodnota C/N');
%         set(handles.button_GrafCISN, 'String', 'Graf C/N, BER');
%         set(handles.checkbox_IntervalCI, 'Visible', 'on');
%         switch (get(handles.checkbox_IntervalCI,'Value'))
%             case (0)  
%                 set(handles.label_hodnota,'Visible','on');
%                 set(handles.edit_HodnotaPomeruCISN,'Visible','on');
%                 set(handles.label_dB,'Visible','on');
%                 set(handles.label_Pocatecni,'Visible','off');
%                 set(handles.edit_Pocatecni,'Visible','off');
%                 set(handles.label_Koncova,'Visible','off');
%                 set(handles.edit_Koncova,'Visible','off');
%                 set(handles.label_Krok,'Visible','off');
%                 set(handles.edit_Krok,'Visible','off');
%                 set(handles.button_GrafCISN, 'Visible', 'off');
%             case (1) 
%                 set(handles.label_hodnota,'Visible','on');
%                 set(handles.edit_HodnotaPomeruCISN,'Visible','off');
%                 set(handles.label_dB,'Visible','off');
%                 set(handles.label_Pocatecni,'Visible','on');
%                 set(handles.edit_Pocatecni,'Visible','on');
%                 set(handles.label_Koncova,'Visible','on');
%                 set(handles.edit_Koncova,'Visible','on');
%                 set(handles.label_Krok,'Visible','on');
%                 set(handles.edit_Krok,'Visible','on');
%                 set(handles.button_GrafCISN, 'Visible', 'on');
%         end
%     case(3)
%         set(handles.button_GrafCISN, 'Visible', 'off');
%         set(handles.label_hodnota, 'Visible', 'off');
%         set(handles.edit_HodnotaPomeruCISN, 'Visible', 'off');
%         set(handles.label_Pocatecni, 'Visible', 'off');
%         set(handles.label_Koncova, 'Visible', 'off');
%         set(handles.label_Krok, 'Visible', 'off');
%         set(handles.edit_Pocatecni, 'Visible', 'off');
%         set(handles.edit_Koncova, 'Visible', 'off');
%         set(handles.edit_Krok, 'Visible', 'off');
%         set(handles.checkbox_IntervalCI, 'Visible', 'off');
%         set(handles.label_dB, 'Visible', 'off');
% end

% % --- Executes during object creation, after setting all properties.
% function popupmenu_CISN_CreateFcn(hObject, eventdata, handles)
% % hObject    handle to popupmenu_CISN (see GCBO)
% % eventdata  reserved - to be defined in a future version of MATLAB
% % handles    empty - handles not created until after all CreateFcns called
% 
% % Hint: popupmenu controls usually have a white background on Windows.
% %       See ISPC and COMPUTER.
% if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
%     set(hObject,'BackgroundColor','white');
% end



function edit_delkaVstupnichDat_Callback(hObject, eventdata, handles)
% hObject    handle to edit_delkaVstupnichDat (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'String') returns contents of edit_delkaVstupnichDat as text
%        str2double(get(hObject,'String')) returns contents of edit_delkaVstupnichDat as a double


% --- Executes during object creation, after setting all properties.
function edit_delkaVstupnichDat_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit_delkaVstupnichDat (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called

% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end


% --- Executes on button press in button_VyberSouboru.
function button_VyberSouboru_Callback(hObject, eventdata, handles)
% hObject    handle to button_VyberSouboru (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
[handles.filename,handles.pathName,handles.FilterIndex] = uigetfile;
set(handles.edit_VyberSouboru, 'String', [handles.pathName handles.filename]);


function edit_VyberSouboru_Callback(hObject, eventdata, handles)
% hObject    handle to edit_VyberSouboru (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'String') returns contents of edit_VyberSouboru as text
%        str2double(get(hObject,'String')) returns contents of edit_VyberSouboru as a double


% --- Executes during object creation, after setting all properties.
function edit_VyberSouboru_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit_VyberSouboru (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called

% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end


% --- Executes on button press in checkbox_VelikostSouboru.
function checkbox_VelikostSouboru_Callback(hObject, eventdata, handles)
% hObject    handle to checkbox_VelikostSouboru (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hint: get(hObject,'Value') returns toggle state of checkbox_VelikostSouboru
switch (get(handles.checkbox_VelikostSouboru,'Value'))
    case (0) % Neomezovat velikost 
        set(handles.label_delkaVstupnichDat,'Visible','off');
        set(handles.edit_delkaVstupnichDat,'Visible','off');
        set(handles.text_delkaVstupnichDat_bitu,'Visible','off');
    case (1) % Omezit velikost souboru
        set(handles.label_delkaVstupnichDat,'Visible','on');
        set(handles.label_delkaVstupnichDat,'String','Délka vstupní posloupnosti');
        set(handles.edit_delkaVstupnichDat,'Visible','on');
        set(handles.text_delkaVstupnichDat_bitu,'Visible','on');
end


% --- Executes on button press in checkbox_IntervalCI.
function checkbox_IntervalCI_Callback(hObject, eventdata, handles)
% hObject    handle to checkbox_IntervalCI (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hint: get(hObject,'Value') returns toggle state of checkbox_IntervalCI
switch (get(handles.checkbox_IntervalCI,'Value'))
    case (0) % Neomezovat velikost 
        set(handles.label_hodnota,'Visible','on');
        set(handles.edit_HodnotaPomeruCISN,'Visible','on');
        set(handles.label_dB,'Visible','on');
        set(handles.label_Pocatecni,'Visible','off');
        set(handles.edit_Pocatecni,'Visible','off');
        set(handles.label_Koncova,'Visible','off');
        set(handles.edit_Koncova,'Visible','off');
        set(handles.label_Krok,'Visible','off');
        set(handles.edit_Krok,'Visible','off');
        set(handles.button_GrafCISN, 'Visible', 'off');
    case (1) % Omezit velikost souboru
        set(handles.label_hodnota,'Visible','on');
        set(handles.edit_HodnotaPomeruCISN,'Visible','off');
        set(handles.label_dB,'Visible','off');
        set(handles.label_Pocatecni,'Visible','on');
        set(handles.edit_Pocatecni,'Visible','on');
        set(handles.label_Koncova,'Visible','on');
        set(handles.edit_Koncova,'Visible','on');
        set(handles.label_Krok,'Visible','on');
        set(handles.edit_Krok,'Visible','on');
        set(handles.button_GrafCISN, 'Visible', 'on');
end



function edit_Pocatecni_Callback(hObject, eventdata, handles)
% hObject    handle to edit_Pocatecni (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'String') returns contents of edit_Pocatecni as text
%        str2double(get(hObject,'String')) returns contents of edit_Pocatecni as a double


% --- Executes during object creation, after setting all properties.
function edit_Pocatecni_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit_Pocatecni (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called

% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end



function edit_Koncova_Callback(hObject, eventdata, handles)
% hObject    handle to edit_Koncova (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'String') returns contents of edit_Koncova as text
%        str2double(get(hObject,'String')) returns contents of edit_Koncova as a double


% --- Executes during object creation, after setting all properties.
function edit_Koncova_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit_Koncova (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called

% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end



function edit_Krok_Callback(hObject, eventdata, handles)
% hObject    handle to edit_Krok (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'String') returns contents of edit_Krok as text
%        str2double(get(hObject,'String')) returns contents of edit_Krok as a double


% --- Executes during object creation, after setting all properties.
function edit_Krok_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit_Krok (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called

% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end


% --- Executes on button press in button_GrafCISN.
function button_GrafCISN_Callback(hObject, eventdata, handles)
% hObject    handle to button_GrafCISN (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

if(handles.start)
    Graf_CISN(handles.res);
else
    helpdlg('Chyba: Pravděpodobně bylo změněno nastvení, ale nebyla provdena simulace, prosím proveďte simulaci znovu.', 'Chyba zobrazení výsledků');
end

function display_progress(handles, postup, postup_celkem)
konstanta_poctu = 31;
x = konstanta_poctu/postup_celkem;
display_string = [];

Znak_progress = 'I';

for i = 1:ceil(postup*x),
    display_string = [display_string Znak_progress];
end
if(postup == postup_celkem)
    set(handles.edit_progress,'ForegroundColor', [rand() rand() rand()] );
else
    set(handles.edit_progress,'ForegroundColor', [0 0 0] );
end
set(handles.edit_progress, 'String', display_string);

drawnow;

function edit_progress_Callback(hObject, eventdata, handles)
% hObject    handle to edit_progress (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'String') returns contents of edit_progress as text
%        str2double(get(hObject,'String')) returns contents of edit_progress as a double


% --- Executes during object creation, after setting all properties.
function edit_progress_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit_progress (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called

% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end


% --- Executes on selection change in DLUL_popup.
function DLUL_popup_Callback(hObject, eventdata, handles)
% hObject    handle to DLUL_popup (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: contents = cellstr(get(hObject,'String')) returns DLUL_popup contents as cell array
%        contents{get(hObject,'Value')} returns selected item from DLUL_popup


% --- Executes during object creation, after setting all properties.
function DLUL_popup_CreateFcn(hObject, eventdata, handles)
% hObject    handle to DLUL_popup (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called

% Hint: popupmenu controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end


% --- Executes on selection change in popupmenu_TypKanalu.
function popupmenu_TypKanalu_Callback(hObject, eventdata, handles)
% hObject    handle to popupmenu_TypKanalu (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: contents = cellstr(get(hObject,'String')) returns popupmenu_TypKanalu contents as cell array
%        contents{get(hObject,'Value')} returns selected item from popupmenu_TypKanalu
val = get(handles.popupmenu_TypKanalu,'value');
if(val>3)
    set(handles.label_VlivKanalu,'Visible', 'on');
    set(handles.popupmenu_VlivKanalu,'Visible', 'on');
else
    set(handles.label_VlivKanalu,'Visible', 'off');
    set(handles.popupmenu_VlivKanalu,'Visible', 'off');
end

if(val == 1)
    res.typRad = '';
elseif(val == 2)
    res.typRad = 'C/I';
else
    res.typRad = 'S/N';
end

switch (get(handles.popupmenu_TypKanalu,'value')) % 
    % žádný, Interferenční, AWGN, flat Rayleigh, PedA, PedB
    case(1)
        set(handles.button_GrafCISN, 'Visible', 'off');
        set(handles.label_hodnota, 'Visible', 'off');
        set(handles.edit_HodnotaPomeruCISN, 'Visible', 'off');
        set(handles.label_Pocatecni, 'Visible', 'off');
        set(handles.label_Koncova, 'Visible', 'off');
        set(handles.label_Krok, 'Visible', 'off');
        set(handles.edit_Pocatecni, 'Visible', 'off');
        set(handles.edit_Koncova, 'Visible', 'off');
        set(handles.edit_Krok, 'Visible', 'off');
        set(handles.checkbox_IntervalCI, 'Visible', 'off');
        set(handles.label_dB, 'Visible', 'off');
    otherwise
        set(handles.checkbox_IntervalCI, 'Visible', 'on');
        set(handles.label_hodnota,'String', sprintf('Poměr %s', res.typRad));
        set(handles.button_GrafCISN,'String', sprintf('Závislost BER, %s', res.typRad));
        switch (get(handles.checkbox_IntervalCI,'Value'))
            case (0)  
                set(handles.label_hodnota,'Visible','on');
                set(handles.edit_HodnotaPomeruCISN,'Visible','on');
                set(handles.label_dB,'Visible','on');
                set(handles.label_Pocatecni,'Visible','off');
                set(handles.edit_Pocatecni,'Visible','off');
                set(handles.label_Koncova,'Visible','off');
                set(handles.edit_Koncova,'Visible','off');
                set(handles.label_Krok,'Visible','off');
                set(handles.edit_Krok,'Visible','off');
                set(handles.button_GrafCISN, 'Visible', 'off');
            case (1) 
                set(handles.label_hodnota,'Visible','on');
                set(handles.edit_HodnotaPomeruCISN,'Visible','off');
                set(handles.label_dB,'Visible','off');
                set(handles.label_Pocatecni,'Visible','on');
                set(handles.edit_Pocatecni,'Visible','on');
                set(handles.label_Koncova,'Visible','on');
                set(handles.edit_Koncova,'Visible','on');
                set(handles.label_Krok,'Visible','on');
                set(handles.edit_Krok,'Visible','on');
                set(handles.button_GrafCISN, 'Visible', 'on');
        end

end

% --- Executes during object creation, after setting all properties.
function popupmenu_TypKanalu_CreateFcn(hObject, eventdata, handles)
% hObject    handle to popupmenu_TypKanalu (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called

% Hint: popupmenu controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end


% --- Executes on selection change in popupmenu_VlivKanalu.
function popupmenu_VlivKanalu_Callback(hObject, eventdata, handles)
% hObject    handle to popupmenu_VlivKanalu (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: contents = cellstr(get(hObject,'String')) returns popupmenu_VlivKanalu contents as cell array
%        contents{get(hObject,'Value')} returns selected item from popupmenu_VlivKanalu


% --- Executes during object creation, after setting all properties.
function popupmenu_VlivKanalu_CreateFcn(hObject, eventdata, handles)
% hObject    handle to popupmenu_VlivKanalu (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called

% Hint: popupmenu controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end



function edit_cmd_Callback(hObject, eventdata, handles)
% hObject    handle to edit_cmd (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'String') returns contents of edit_cmd as text
%        str2double(get(hObject,'String')) returns contents of edit_cmd as a double


% --- Executes during object creation, after setting all properties.
function edit_cmd_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit_cmd (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called

% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end
