% function analyza
clear all
close all
segment=1024;
Fvz_res=16000;
NN=2048;
prekryv=0;  %definovany od 0 do 1
n=5;        %rad filtru
fn=3000;     %mezni kmitocet
fn2=4800;
ind_count=50;    % pocet vzorku pro vyhodnoceni
hvizd=importdata('matlab.mat'); %nacteni neuronove site
nmax=1e3;
pom=1;
delka=30;

% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %
cd ('zvukové ukázky');      %skok do adresare
[FileName,PathName] = uigetfile('*.wav','Select any wav-file for analyze');
cesta=[PathName,FileName];
cd ..     %odskok od adresare

[signal,Fvz,wmode,fidx]=readwav(cesta,-1,1000000);
if (Fvz>Fvz_res || Fvz<Fvz_res )
    signal=resample(signal,Fvz_res,Fvz);
end

Fvz=Fvz_res;
x=1:1:length(signal);
x=x/Fvz;


% filtrování signálu nastavení filtru zvolím buter horní propust

[b,a]=butter(n,[fn/(Fvz/2) fn2/(Fvz/2)],'bandpass');
% signal=filter(b,a,signal);   %odfiltrovani na celem signalu
% sound(signal,Fvz);    %pouzito pro poslech odfiltrovanych vzorku

% rozdělení vstupního signálu do rámců s prekryvem

if(prekryv==0)
    f=enframe(signal,blackman(NN));
else
    f=enframe(signal,blackman(NN),prekryv*NN);       %vstup je signal velikost okna je 2048 a 1024 je prekryv
end

f=f';           %transponovani matice
% harm(ind_count,length(f(1,:)))=0;        %definvani rozmeru pro urychleni funkce programu
harm(ind_count,2)=0;

if (length(f(1,:))<30)
    result(3,30)=0;
else
    result(2,1:length(f(1,:)))=0;
    pom=1;
end
for i=1:length(f(1,:))
    if (i==1 || prekryv==0)
        result(2,i)=i*1/(Fvz/NN); %vypocteni casove osy
    else
        result(2,i)=i*1/(Fvz/NN)*prekryv;
    end
    [H1(:,1) F1(:,1)]=freqz(filter(b,a,f(:,i)),1,NN,Fvz);      %vytvoreni spektra
    H1(:,1)=20*log10(abs(H1(:,1)));               %komplexni cislo prevedeno na cele
    maximum=abs(max(H1(:,1)));          %nalezeni maxima v danem ramci
    if (maximum<10)
        maximum=100;
    end
    indexy=find(H1(:,1)>(maximum*0.6)*ones(length(H1(:,1)),1));  %zjisteni ktere prvky z ramce je vetsi nez 1/3 rozdilu minima a maxima
    if (length(indexy)<ind_count && length(indexy)>3)         % pokud je hodne frekvencnich slozek vetsich nez 1/3 zrejme se nejedna o piskot
        harm(1:length(indexy),1)=H1(indexy,1);   %ulozeni do promenne harm
        harm(1:length(indexy),2)=F1(indexy,1);
        f1d=harm(1,2);
        f1h=0;
        f2d=0;
        f2h=0;
        f3d=0;
        f3h=0;
        df1=0;
        df2=0;
        for j=1:length(indexy)-1
            if (abs(harm(j+1,2)-harm(j,2))>40)
                if(f1h==0)
                    f1h=harm(j,2);
                    f2d=harm(j+1,2);
                elseif(f2h==0 && f1h>0)
                    f2h=harm(j,2);
                    f3d=harm(j+1,2);
                elseif(f3h==0 && f2h>0 && f1h>0)
                    f3h=harm(j,2);
                end
            end
        end
        if (f3h==0)
            f3h=harm(length(indexy),2);
        end
        f1=(f1h+f1d)/2;
        f2=(f2h+f2d)/2;
        f3=(f3h+f3d)/2;
        df1=f2-f1;
        df2=f3-f2;
        if ((df1>150)&&(df1<350)&&(df2>250)&&(df2<500) && (f1h-f1d)<100 &&(f2h-f2d)<100 &&(f3h-f3d)<300) %podminka pokud je vse splneno pak je to piskot
            result(1,i)=1;
            disp([num2str(sum(result(1,:))),'. pískot = ',num2str(fix(result(2,i)/60)),':',num2str(result(2,i)-fix(result(2,i)/60)*60),' (s)'])
        end

        %         if (i>3 && result(1,i)==0 && result(1,i-1)==1 && result(1,i-2)==0)
        %             result(1,i-1)=0;
        %         end

    end
    if (i>30*pom || i==length(f(1,:)))
            if (length(f(1,:))<30)
                delka=length(f(1,:))-1;
            end
        if (result(1,i-delka)==1 || i==length(f(1,:)))
            [Y] = sim(hvizd,result(1,i-29:i)');
            disp(['Zacatek zapasu  =',num2str(Y(1)*100),' %'])%1.zacatek zapasu
            disp(['Konec polocasu  =',num2str(Y(2)*100),' %'])%2.konec polocasu
            disp(['konec zapasu    =',num2str(Y(3)*100),' %'])%3.konec zapasu
            disp(['faul            =',num2str(Y(4)*100),' %']) %4.faul
            disp(['gol nebo ofsajd =',num2str(Y(5)*100),' %'])%5.gool nebo ofsajd
            disp([' ']);
            pom=round(i/30)+1;
        end
    end
    if (length(f(1,:))<1)
        figure(2+i)
        bar(F1(:,1),H1(:,1));
        title(['df1 = ',num2str(df1), ' df2 = ',num2str(df2),'  t = '...
            ,num2str(fix(result(2,i)/60)),':',num2str(result(2,i)-fix(result(2,i)/60)*60) ],'Fontname','MS Sans Serif');
        if (maximum==100)
            set(gca,'ylim',[0 40]);
        else
            set(gca,'ylim',[maximum*0.6 maximum]);
        end

        set(gca,'xlim',[2500 5500])
        if (result(1,i)==0)
            legend('ne')
        else
            legend('ano')
        end
        grid on;
    end

    %     if (result(2,i)>3.45)
    %         result(2,i)=result(2,i);
    %     end
end



% zobrazení průběhu signálu
figure(2)
% subplot(3,1,1)
% plot(x,signal)
% xlabel('{\itt} (s) \rightarrow')
% ylabel('Amplituda (-) \rightarrow')
% legend(FileName )
% title('\bfZobrazení vyfiltrovaného signálu','FontName','MS Sans Serif')
% grid on

subplot(3,1,1)
plot(result(2,:),result(1,:))
grid on

subplot(3,1,2)
plot(result(2,:),result(4,:))
grid on

subplot(3,1,3)
bar(result(2,:),result(3,:))
grid on



% energie signalu, nevim  erframe delka segmentu, prevzorkova resample