close all
clear all

disp('Identifikace pauz v rušeném řečovém signálu');
[klip,Fvz,bits]=wavread('franco.wav');
klip_ascii=load('franco.ascii');

[ascii_radek, ascii_sloupec]=size(klip_ascii)
ramec=64; %delka ramce v ms

pocet=max(max(klip_ascii.*(Fvz/1000))); %zjištění délky označeného signálu
klip=klip(1:pocet,1); %zkrácení signálu a použití mono

%% vzorkovani

ramec=floor(ramec/1000*Fvz) %delka ramce - pocet vzorku
prekryv=floor(ramec/4) %delka prekryti ramce
posuv=ramec-prekryv % velikost posuvu následujícího rámce ve vzorcích
sloupec = floor(1+((pocet-ramec)/posuv)) % určení na kolik sloupců (rámců) bude signál rozdělen

%% vypocet potrebnych konstant

zero=[0; filter(ones(1,ramec)/ramec, 1,abs(diff(klip>0)))*(Fvz/2)]'; %vypocet pruchodu nulou
zero_stred=MEAN(zero) %stredni hodnota pruchodu nulou
klip=klip'; %převod do řádkového vektoru

klip_abs=abs(klip); %absolutni hodnota signalu
stred = mean(klip_abs) %střední hodnota
odchylka = std (klip); %směrodatná odchylka
odchylka = odchylka - stred %rozdil stredni hodnoty od odchylky
t=pocet/Fvz %doba trvání signálu v ms


%% idealVAD prepocet

idealVAD=ones(1,max(klip_ascii.*(Fvz/1000)));
for k=1:1:ascii_radek; % pro každý řádek
        for m=klip_ascii(k,1)*(Fvz/1000):1:klip_ascii(k,2)*(Fvz/1000);
            idealVAD(1,m)=0;
        end;
end;


%% cyklus, kde do každého sloupce uložím jeden rámec

mat = zeros(ramec,sloupec); % inicializace matice vzorku

klip=klip(:);
for k=1:sloupec; % pro kazdy sloupec
    l = 1 + posuv * (k-1) ;
    mat(:,k)= klip(l:(l+ramec-1),1) ;
    mat_vz(1,k)=mean(abs(mat(:,k)));
end;

mat_vz=mat_vz(ones(1,posuv+1),:);%kolikrat budu opakovat prvek, nez zacnu opakovat dalsi
mat_vz=mat_vz(:)'; % prevod na vektor

if length(mat_vz)<pocet;
    pocet=length(mat_vz);
end

mat_vz=mat_vz(1,1:pocet);

rec=zeros(1,pocet); %nulova matice

for i=1:1:pocet; %cyklus k zapisu reci a sumu do matic
    if abs(mat_vz(1,i))>stred; %pokud je signal vyssi nez stredni hodnota jde o rec
        rec(1,i)=1; %zapis do matice reci
    end;
    if abs(mat_vz(1,i))<odchylka; %pokud je signal nizsi nez rozdil odchylky a stredni hodnoty jde o pauzu
       rec(1,i)=0;
    end;
    if (abs(mat_vz(1,i))<stred) && (abs(mat_vz(1,i))>odchylka); %zbytek signalu v intervalu <odchylka,stred>
       if zero(1,i)>zero_stred; %pokud je aktuální hodnota pruchodu nulou vetsi nez stredni hodnota pruchodu nulou, jde o rec
         rec(1,i)=1; %zapis do matice reci
       else
          rec(1,i)=0;
       end
    end;
end;


%% ROC

realVAD=rec;
pocet_ideal=length(idealVAD);
pocet_real=length(realVAD);
if pocet_ideal<pocet_real
    p=pocet_ideal;
    realVAD=realVAD(1,1:p);
else
    p=pocet_real;
    idealVAD=idealVAD(1,1:p);
end

TP=(realVAD==1) & (idealVAD==1); % vypocet TP
TN=(realVAD==0) & (idealVAD==0); % vypocet TN

TP_pocet=length(find(TP)); %pocet spravne identifikovane reci
idealVAD_pocet=length(find(idealVAD)); % pocet idealni reci
TN_pocet=length(find(TN)); % pocet spravne identifikovanych pauz

TPR=TP_pocet/idealVAD_pocet % vypocet TPR
TNR=TN_pocet/(p-idealVAD_pocet) % vypocet TNR