%--------------------------------------------------------------------------
% function SF=CstGetfrequencyFromSavedFile(CFileName,CUroven,Cpar,Cnum)
%
% Pouziti funkce:
% --------------
% Funkce se pouzije k vytazeni vysledku z programu CST. Funkce vraci
% hodnotu rezonancnich frekvenci a k tomu prislusnou hodnotu S parametru. K
% vytazeni vysledku je pouzit zvoleny soubor.
%
% Parametry funkce:
% ----------------
% CFileName - Jmeno docasneho souboru, vcetne cesty k souboru.
% CUroven - Rozhodovaci uroven S parametru. Interval pouziti je <0,1>
% priklad: CUroven = 0.5; -> -6 = 20*log10(0.5)-> rozhodovaci uroven je pa
% -6dB
% Cpar - Pozadovany parametr pr: s-parametr, muze byt pouzito male i velke
% pismeno
% Cnum - Cislo S parametru pr: S11,S12,S21,...
% SF - Navratovy parametr, ktery vraci nalezene rezonancni frekvence,
% parametr S, pocet vzorku z celkoveho poctu vzorku (1001), sirku pasma
% 2*delta f a sirku pasma Bm=2*delta f/f0
%
% Priklad pouziti funkce:
% ----------------------
% CFileName = 'c:/cst_temp/_BExportCst_S11.txt'; 
% SF=CstGetfrequencyFromSavedFile(CFileName,0.5,'S',[1 1])
%--------------------------------------------------------------------------
function SF=CstGetfrequencyFromSavedFile(CFileName,CUroven,Cpar,Cnum)
global mws
Cpar = upper(Cpar);
% Prime vykonani v programu CST
mws.invoke('SelectTreeItem',['1D Results\|',Cpar,'| dB\S',num2str(Cnum(1)),',',num2str(Cnum(2)),'']);

Export = mws.invoke('ASCIIExport');
Export.invoke('Reset');
Export.invoke('FileName',CFileName);
Export.invoke('Mode','FixedNumber');
Export.invoke('StepX',1001);
Export.invoke('StepY',1001);
Export.invoke('Execute');

% Ziskani nastavenych jednotek
unit = mws.invoke('Units');
FrUnit = unit.invoke('GetFrequencyUnitToSI');

% Otevreni a cteni souboru
fil = fopen(CFileName,'r');
c = fread(fil,'*char')';

% Cteni souboru po radcich
c = strread(c,'%s', 'whitespace', '\n');

fclose(fil);
fclose('all');

c = char(c);

% Nacteni hodnot souboru
f = zeros(1,length(c)-2);
S = zeros(length(c)-2,1);
    
for i = 1:length(c) - 2
    f(1,i) = str2double(c(i+2,1:20));
    S(i,1) = str2double(c(i+2,21:65));
end

% Priprava a uprava nekterych dale potrebnych parameru
nf = length(S);
f = f * FrUnit;
SFDBmin = -5;
SirVz = (f(1,nf) - f(1,1)) / nf;

% Prepocitani na zadanou hodnotu v dB
DBU = 20*log10(CUroven);
SDBU = S;
    
    % Nahrazeni mist grafu jednickou, dale bude odstraneno
    for i = 1:length(S)
        if ((SDBU(i,1)) > (DBU))
            S(i,1) = 1;
        end
    end

    j = 1;
    count = 0;
    SFDB(1,1:3) = ones(1,3);
    SF(1,1:5) = ones(1,5);
    
    % ziskani minima z laloku
    for i = 1:length(S)
        if (SDBU(i,1) < DBU)
            clear SF;
            count = count + 1;
            SFDB(j,3) = count;
            if SDBU(i,1) < SFDBmin
                SFDB(j,1) = SDBU(i,1);
                SFDBmin = SFDB(j,1);
                SFDB(j,2) = f(1,i);
            end
        else
            count = 0;
            SFDBmin = DBU + 1;
            j = j + 1;
        end 
    end

    % Ziskani pouze hodnot minim
    j = 1;
    [m,n] = size(SFDB);
    for i = 1:m
        if (SFDB(i,1) < 0)
            SF(j,2) = SFDB(i,1);
            SF(j,1) = SFDB(i,2);
            SF(j,3) = SFDB(i,3);
            SF(j,4) = SF(j,3) * SirVz;
            SF(j,5) = (SF(j,4)) / (SF(j,1));
            j = j + 1;
        end
    end
    
end