%% ------------------------ FUNKCIJA: SKRACENI KEPSTAR ---------------------------- %%

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


% Log-spektar u odabranoj skali se primjenom IDFT-a
% vraca u vremensku domenu cime se dobiva kepstar. Ova operacija
% se provodi matricnim mnozenjem i to tako da se odmah racunaju
% samo oni kepstralni uzorci koji se ne odbacuju. Time se
% dobiva kepstralna matrica, koja se zatim primjenom DFT matrice
% nazad vraca u Mel (Bark) log-spektralnu domenu. Pri tome, ova
% kombinacija IDFT-a i DFT-a zapravo simulira efekt odsjecanja
% kepstralne sekvence na CL uzoraka (npr. CL=12).


% rade se dvije matrice: idft_mtx i dft_mtx.

% matrica idft_mtx je dimenzija (CL+1)x(2*M) i sadrzi clan
% exp(j*2*pi/(2*M)*m*n). idft_mtx od 2 do M postaje zbroj njih samih i
% idft_mtt-a na indeksima od 2*M do M+2. uzimamo samo realni dio (cos) i
% dijelimo ga s 2*M, te uzimamo idft_mtx na indeksima od 1 do M+1.

n=[0:CL];
m=[0:2*M-1]';
idft_mtx=exp(sqrt(-1)*m*n*2*pi/(2*M));
idft_mtx(2:M,:)=idft_mtx(2:M,:)+idft_mtx(2*M:-1:M+2,:);
idft_mtx=real(idft_mtx(1:M+1,:))/(2*M);

% dft_mtx je matrica sa exp(-j*2*pi/(2*M)*m*n), i dimenzija je (2*M)x(M+1).
% Nakon slicnog postupka kao gore, dobivamo matricu (CL+1)x(M+1).

n=[0:2*M-1]';
m=[0:M];
dft_mtx=exp(-sqrt(-1)*n*m*2*pi/(2*M));
dft_mtx(2:M,:)=dft_mtx(2:M,:)+dft_mtx(2*M:-1:M+2,:);
dft_mtx=real(dft_mtx(1:CL+1,:));

% Te dvije matrice nam sluze za racunanje kratkog (brzog) kepstra, koji je
% vrlo korisan za operacije na dugim signalima s vise kanala. On operira
% samo s prvih CL komponrnti kepstra, a ne svih 2*M.

% Kao provjeru tocnosti mozemo pomnoziti te matrice na sljedeci nacin:
% disp(max(max(abs(dft_mtx*idft_mtx-eye(CL+1)))))

% Te dvije matrice moraju biti pseudo-inverz jedna drugoj.

% Racunanje skracenog kepstra matricnim mnozenjem, te izgladjenog spektra
% pomocu kepstra.

cep=ym_en*idft_mtx;

ym_en_c=cep*dft_mtx;