%% -------------------------------- FUNKCIJA: FILTRI ------------------------------- %%


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

% Funkcija koja na temelju odredjenih parametara projektira filtre, i
% njihove impulsne odzive.
% Projektirani filtri su ekvidistantni u odabranoj skali i proizvoljnih
% sirina.

% Prvo se postave centri filtara u jednolikom rasponu do maksimalne
% frekvencije skale.

cen=[0:M]'/M*s_max;

% BW_nom se namjesta jednak za sve.
% Ako smo odabrali BW_f=1, ondasu filtri takvi da prvi zavrsava tamo
% di je iduci u maksimumu. Time se postize da je njihov zbroj jednak jedan.
% Ako je pak BW_f=2 onda prvi zavrsava di je treci u maksimumu, sada je zbroj jednak
% dva. Dakle, namjesta se tako da zbroj bude jednak BW_f.

BW_nom=s_max/M;
BW=BW_nom*BW_f;

skala_m=ones(M+1,1)*skala;
cen_m=cen*ones(1,K/2+1);

% Projektiranje filtara

SP=1-abs((skala_m-cen_m)/BW);
SP=SP.*(SP>0);
SP=[SP fliplr(SP(:,2:K/2))]';

% Impulsni odziv simetricnog spektra ima fazu nula ali zbog numericke
% pogreske matlaba rucno to namjestamo.

imp=real(ifft(SP));
SP=SP(1:K/2+1,:);

% Impulsni odzivi se sad skracuju svi na duzinu 2*Nimp+1 i izgladjuju
% blackmannovim filtrom iste duzine. Na kraju imamo impulsni odziv imp_trw
% i pripadni spektar SP_W.

imp=[imp(K/2+1:K,:); imp(1:K/2,:)];
imp_tr=imp(K/2+1+[-Nimp:Nimp],:);

wi=blackman(2*Nimp+1);
wi=wi(:)*ones(1,M+1);
imp_trw=imp_tr.*wi;

SP_W=fft(imp_trw,K);
SP_W=SP_W(1:K/2+1,:);