%% ------------------------ FUNKCIJA: INTERPRETACIJA_ZVUKOVA ------------------------ %%

function [skala,s_max,f,kor_dec,SP,SP_W,imp,imp_tr,imp_trw,ym,ym_en,ym_en_c,cep,ym_out,raz]=interpretacija_zvukova(y,FS,M,BW_f,Nimp,CL,od_skala);

% GLAVNA FUNKCIJA PROGRAMA
% NACIN RADA:

% Na ulaz se dovodi zvuk kojeg ona prikazuje u odabranoj skali, koja
% aproksimira uho. Dovode se i podatci o filtrima - opisani u skripti
% 'projekt'.

% Za zadani ulazni zvucni signal funkcija radi pojasne selektivne filtre
% koji su ekvidistantni u odabranoj (MEL ili BARK) skali, i ovise o ulaznim
% parametrima, gore navedenim, ali razvuceni u frekvencijskoj skali. Kroz
% te filtre propusta ulazni signal, nakon sto im je skratila impulsne
% odzive sve na jednaku duljinu, i izgladila ih konvolucijom sa
% blackmannovim otvorom. Za izradu filtara koristi podfunkciju 'filtri'.
% Nakon konvolucije dobivamo ulazni signal rastavljen po kanalima koji
% predstavljaju zivcana vlakna koja putuju prema mozgu. Za slikovni prikaz,
% te daljnju obradu signala zanimljivije nam je signale dodatno
% "uljepsati". Stoga se redom primjenjuje estimacija prosjecne log-energije
% svakog kanala. Za to se koristi Firgaussov otvor za
% usrednjavanje zeljene sirine u vremenu. On je duzine oko 1000 uzoraka,
% sto nam je dovoljno da bi dobili najmanju frekvenciju u signalu (anvelopu).
% Logaritmiranje se provodi tek nakon usrednjavanja energije. Sve to radi
% funkcija 'log_anvelopa_en'.
% Na kraju se primjenom funkcije 'skraceni_kepstar' napravi IDFT energije
% svakog uzorka i time se dobiva kepstar. Uzimanjem prvih CL uzoraka kepstra i
% vracanjem DFT-om, dobivamo izgladjenu promjenu energije po kanalima. Takav
% glatki signal, decimiran korakom kor_dec, pogodan nam je za daljnju odradu te
% prikaz. Izracuna se i razlika prije i nakon primjene kepstara.


% Na pocetku, funkcija odabire broj uzoraka za prikaz u ovisnosti o
% frekvenciji otipkavanja.

if FS<=1e4;
    K=2^12;
elseif FS<=3e4;
    K=2^13;
else
    K=2^14;
end;

% Isto tako odabire decimaciju na temelju duzine ulaznog signala, tako da
% nebude na kraju, nakon decimacije, vise od 10000 uzoraka.

if length(y)>=1e7;
    kor_dec=1e4;
elseif length(y)>=1e6;
    kor_dec=1e3;
elseif length(y)>=1e5;
    kor_dec=1e2;
elseif length(y)>=1e4;
    kor_dec=1e1;
end;

% Korak i frekvencijska os.

k=[0:K/2];
f=k/K*FS;

% U ovisnosti o odabiru racuna se mel ili bark skala. Te maksimalni iznos.
% Bark skala ima tri matematicke formule od kojih je svejedno koja se
% odabire. Takodjer ima i ogranicenja koja su uvrstena u formulu.

if od_skala;
    skala = log(1+f/700)*1127.01048;
    s_max = log(1+(FS/2)/700)*1127.01048;
else
    skala=13*atan(0.00076*f)+3.5*atan((f/7500).^2);
    %skala=26.81*f./(1960+f)-0.53;
    %skala=26.28-52547.6*(1960+f).^(-1);
    skala=skala+0.15*(2-skala).*(skala<2)+0.22*(skala-20.1).*(skala>20.1);
    s_max=skala(1,K/2+1);
end;


% Poziva se podfunkcija 'filtri', koja projektira filtre.

[SP,SP_W,imp,imp_tr,imp_trw]=filtri(M,s_max,BW_f,skala,K,Nimp);


% Konvolucija ulaznog signala sa svim filtrima.

for i=1:M+1,
ym(:,i)=conv(y,imp_trw(:,i));
end;
ym=ym(Nimp+1:length(ym)-Nimp,:);


% Racunanje logaritma anvelope energije po svakom kanalu.

[ym_en]=log_anvelopa_en(M,ym);


% Primjena kratkog kepstra na svaki uzorak.

[cep,ym_en_c]=skraceni_kepstar(CL,M,ym_en);


% Racunanje razlike signala prije i poslije izgladjivanja kepstrima. Ovo se
% radi zbog kasnije usporedbe.

raz=ym_en_c-ym_en;

% Decimacija

ym_out=ym_en_c(1:kor_dec:end,:);