function [v,cas,pocet_ramcu]=vadenerg(y, Fvz,delka_ramce,init,p,alfa,graf1,graf2) 
 %% Soucast detektoru recove aktivity VAD
%funkce pro detekci recove aktivity na principu kratkodobe energie
%Priklad spusteni funkce:   vadenerg('psenice',256,10,0,0.2,1,1)
%vstupni parametry:
%vst_signal - zvukovy soubor ve formatu *.wav, ktery chceme analyzovat
%delka_ramce - pocet vzorku, vstupniho signalu, ktery se ulozi do jednoho ramce (segmentu)
%volitelne hodnoty(128, 256)
%init - pocet inicializacnich ramcu potrebnych k pocatecnimu nastaveni prahove hodnoty
%volitelne hodnoty(10 - 30)
%
%2008   Michal Adamec VUT Brno (v ramci Diplomove prace - Moderni rozpoznavace reci)

% [y,Fvz] = wavread(vst_sig);                            %y vraci vzorkova data. Amplitudove hodnoty jsou v rozsahu [-1,+1]

signal      = y;                             
delka_okna  = delka_ramce;                              %delka prislusneho typu vahovaciho okenka bez prekryti
prekryti    = delka_okna/2;                             %prekryti oken pri vypoctu
tvar_okna   = 'hamming';
alfa;       %=  0.2;                                    %konstanta, viz obnova prahu
p;          %=  0;                                      %casova konstanta exponencialniho prumerovani, nabyva hodnot 0 az 1
delka_sig   = length(signal);                            %delka vektoru signalu y
cas_delka_ramce = prekryti / Fvz * 1000;                %vypocet casove delky jednoho ramce v [ms] 

t           = (0:delka_sig-1)/Fvz;                      %vektor poctu vzorku signalu y. Je potrebny k vykresleni grafu.       
pocet_ramcu = floor((delka_sig-delka_okna)/prekryti);	%zjisteni poctu ramcu, ve kterych se pocita energie
   
%*********podminka pro volbu okenkove funkce***************
if strcmp(tvar_okna,'hamming')
    okno = hamming(delka_okna);
else    
    okno = ones(delka_okna);
end

%******inicializace - zjisteni prahove hodnoty energie z pocatecnich ramcu**
prah_ramcu   = init;                                    %zadavame pocet ramcu, kterych bude vyuzito pro vypocet prahove hodnoty
for i = 1:prah_ramcu 
    z  = (i-1) * prekryti + 1;  
    e  = signal(z:z+delka_okna-1).* okno;
                                            
    ex(i)  = e'*e;                                      %vypocet prahove hodnoty pro jednotlive ramce
end

en_prah = sum(ex) / prah_ramcu;                         %prumerna hodnota prahove energie

%*******vypocet pocatecni prahove energie ************************
for x = 1:prah_ramcu 
    var(x) = (ex(x) - en_prah)^2;
end

D   = sum(var);                                          %rozptyl
tl  = en_prah + alfa*sqrt(D);                            %pocatecni prahova hodnota energie

%******** pocitani v jednotlivych ramcich (oknech s prekrytim)****
for k = init:pocet_ramcu
    s           = (k-1) * prekryti + 1;    	            % zacatek okna
    cas(k)      = k * prekryti/Fvz;                     % nastaveni casove osy
    ramec       = signal(s:s+delka_okna-1).* okno;      %vyber hodnot ze signalu, ramec je vazen okenkem
    energ(k)    = ramec' * ramec;                       %vypocet energie pro jednotlive ramce
                                                        %energ(k)  = sum((signal(s:s+delka_okna-1).* okno).^2);
    deltaE(k) = (energ(k)-en_prah);                     %energie pozadi 
   
%******** podminka pro detekci reci. Porovnavame prahovou hodnotu energie, s energii pozadi **
 if deltaE(k) > tl
                vystup = 1;                             %detekovana rec
    else
                vystup = 0;                             %detekovana pauza
                en_prah = (p)*energ(k) + (1-p)*en_prah;       %obnova prahove energie v recovych pauzach
                tl = en_prah + alfa*sqrt(D);                  %prah tl pocitany z prahove energie
    end
    vv(k,1)=vystup;                                     % vektor vystupni hodnoty 0/1
    prah(k,1) = tl;    
    v(k,1) = median([vv(k-2) vv(k-1) vv(k)]);             %vyhlazeni prekmitu pomoci funkce median
   
end

%normalizce vektoru energ, aby nejvetsi hodnota energie byla rovna 1
Emax = max(energ);                                      %zjisteni max hodnoty y vektoru energ
deltaEmax = max(deltaE);
for j = 1:pocet_ramcu   
     normaliz(j) = energ(j)/Emax;                       %provedeni normalizace
     deltanorm(j)= deltaE(j)/deltaEmax;     
end




%********graficke vyjadreni****************************************
cara = init * cas_delka_ramce/1000;
konec_inicializace = [-1:0.01:1.1];

if (graf1==1)
figure(1)
plot(t,signal,cas,v,cara,konec_inicializace,'c'), title('signal a detekce')
xlabel('Cas (s)')
ylabel('Amplituda')
end
if graf2==1 
    figure(2)
subplot(211)     
plot(t,signal,cas,v,cas,normaliz,'r',cas,prah,'k',cara,konec_inicializace,'c')
xlabel('Cas (s)')
ylabel('')
legend('signal', 'detekce', 'energie', 'prahova en','konec inicializace') 

subplot(212)
plot(cas,normaliz,'r',cas,prah,'k',cas, deltanorm,'m', cara,konec_inicializace,'c'), title('energie a prahova energie')
xlabel('Cas (s)')
ylabel('')
legend('energie', 'prahova en','delta E','konec inicializace')
end
                                         
  
