function [ y, h ] = FIRlowpass( x, N,f, fs, window, order, symmetry )
%[y,h] = FIRLOWPASS( x, N,f, fs, window, order, exactendmatch )
%FIRLOWPASS vykoná filtráciu dát LOWPASS filtrom s konečnou impulznou
%odozvou, ktorý sa navrhne z príslušných parametrov
% Vstupy:   x - vstupný signál filtru, môže byť viac vo forme matice, kde
%           jednotlivé signály odpovedajú riadkom
%           N - dĺžka základnej impulznej odozvy
%           f - ideálna prechodová frekvencia
%           fs - vzorkovacia frekvencia
%           window - 'char' typ okna
%               'R' obdĺžnikové
%               'H' Hammingovo
%               'B' Blackmanovo
%           order - počet kaskád pre zlepšenie výkonnosti filtru,
%           frekvenčné odozvy sa navzájom prenásobia
%           symmetry - pokiaľ chceme použiť symetrické predĺženie signálu
%           na krajoch, treba použiť číslo 1
% Výstupy:  y - výstupný signál filtru
%           h - impulzná odozva

if nargin < 7
    symmetry = 0;
end

if nargin < 6
   order = 1; 
end

N = N(:); N = N(1);
fs = fs(:); fs = fs(1);
f = f(:); f = f(1);
order = order(:); order = order(1);

assert(checkN(N)==1,'N musí byť prirodzené číslo, jedná sa o dĺžku impulznej odozvy');
assert(isnumeric(fs)==1 && fs>0 && real(fs)==fs,'Vzorkovacia frekvencia fs musí byť kladné reálne číslo');
assert(isnumeric(f)==1 && f>0 && real(f)==f,'prechodová frekvencia musí byť kladné reálne číslo');
assert(f<fs/2,'prechodová frekvencia musí spĺňať vzorkovací teorém a patriť do intervalu <0;fs/2>');
assert(isnumeric(order)==1 && order==floor(order) && order>0 && real(order)==order,'order musí byť prirodzené číslo, jedná sa o počet kaskád filtru');


if mod(N,2)==0
    N=N+1;
end

fc = f/fs;

%% TVORBA IMPULZNEJ ODOZVY

h = getlowpassresponse(N,fc,window);
hn = h;
for i = 2:order
   h = convolution(h,hn); 
end

%% FILTRACIA

[a,b] = size(x);
y = zeros(a,b);
for i = 1:a
    y(i,:) = FIRfilt(x(i,:),h,symmetry);
end

end

