function [ y,h] = FIRbandpass( x, N, Fl, Fr, fs, window, order, symmetry )
%[y,h] = FIRBANDPASS( x, N, Fl, Fr, fs, window, order, exactendmatch )
%FIRBANDPASS vykoná filtráciu dát BANDPASS 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
%           fl - ideálna ľavá start-frekvencia
%           fr - ideálna pravá start-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
%[1] SMITH, Steven W.  The scientist and engineer’s guide to digital signal processing. 2nd ed. California Technical Publishing, 1999. ISBN 0-9660176-6-8.

if nargin < 8
    symmetry = 0;
end

if nargin < 7
   order = 1; 
end

N = N(:); N = N(1);
fs = fs(:); fs = fs(1);
Fl = Fl(:); Fl = Fl(1);
Fr = Fr(:); Fr = Fr(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,'vzorkovacia frekvencia musí byť kladné reálne číslo');
assert(isnumeric(Fl)==1 && Fl>0,'prechodová frekvencia musí byť kladné reálne číslo');
assert(Fl<fs/2,'prechodová frekvencia musí spĺňať vzorkovací teorém a patriť do intervalu <0;fs/2>');
assert(isnumeric(Fr)==1 && Fr>0,'prechodová frekvencia musí byť kladné reálne číslo');
assert(Fr<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 Fl>Fr
    hlp = Fl;
    Fl = Fr;
    Fr = hlp;
end

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

fl = Fl/fs; fr = Fr/fs;

%% TVORBA IMPULZNEJ ODOZVY

hl = getlowpassresponse(N, fl, window);
hr = getlowpassresponse(N, fr, window);
delta = zeros(1,N);
delta(floor(N/2)+1)=1; %jednotkový impulz
hr = delta - hr; %spektrálna inverzia

h = hl + hr; %paralelné spojenie filtrov [1]
h = delta - h; %spektrálna inverzia
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

