function [ y ] = FIRfilt( x,h, symmetry )
%[y] = FIRFILT( x,h, exactendmatch )
%FIRFILT vykoná filtráciu dát filtrom s konečnou impulznou odozvou
% Vstupy:   x - vstupný signál filtru
%           h - impulzná odozva filtru
%           symmetry - pokiaľ chceme použiť symetrické predĺženie signálu
%           na krajoch, treba použiť číslo 1
% Výstup:   y - výstupný signál filtru

if nargin < 3           
    symmetry = 0;
end
L = length(h);
N = length(x);

%% FILTRACIA
 
if symmetry
    try
        x = [x(L+1:-1:2) x x(end-1:-1:end-L)]; %párna symetria
        if N + L>1e2
            yn = FFTconvolution(x,h);           %rýchlejší algoritmus pomocou FFT
        else
            yn = convolution(x,h);
        end
        if mod(L,2)==0                      %zúženie signálu rozšíreného konvolúciou
            y = yn(L/2:end-L/2);
        else
            LK = floor(L/2);
            y = yn(LK+1:end-LK);
        end

        y = y(L+1:end-L);
    catch
        Lh = N-1;
        
        x = [x(Lh+1:-1:2) x x(end-1:-1:end-Lh)]; %párna symetria
        
        if N + L>1e2
            yn = FFTconvolution(x,h);           %rýchlejší algoritmus pomocou FFT
        else
            yn = convolution(x,h);
        end
        if mod(L,2)==0                      %zúženie signálu rozšíreného konvolúciou
            y = yn(L/2:end-L/2);
        else
            LK = floor(L/2);
            y = yn(LK+1:end-LK);
        end
        y = y(Lh+1:end-Lh);
    end 
else
    try
            xL = x(2:L+1);                              %vytvorenie antisymetrického predĺženie signálu
            xLzero = xL - x(1);                         %dostať signál na kraji na nulu
            xLzerosymmetry = -xLzero(end:-1:1);         %antisymetricky ho otočiť
            xLantisymmetry = xLzerosymmetry + x(1);     %dostať signál naspäť kam patrí

            xR = x(end-L:end-1) ;                       %analogicky
            xRzero = xR - x(end);
            xRzerosymmetry = -xRzero(end:-1:1);
            xRantisymmetry = xRzerosymmetry + x(end);

            x = [xLantisymmetry x xRantisymmetry]; %nepárna symetria, trafí presne krajné body

        if N + L>1e2
            yn = FFTconvolution(x,h);           %rýchlejší algoritmus pomocou FFT
        else
            yn = convolution(x,h);
        end
        if mod(L,2)==0                      %zúženie signálu rozšíreného konvolúciou
            y = yn(L/2:end-L/2);
        else
            LK = floor(L/2);
            y = yn(LK+1:end-LK);
        end
    
    y = y(L+1:end-L);
    catch
        Lh = N-1;
        xL = x(2:Lh+1);                              %vytvorenie antisymetrického predĺženie signálu
        xLzero = xL - x(1);                         %dostať signál na kraji na nulu
        xLzerosymmetry = -xLzero(end:-1:1);         %antisymetricky ho otočiť
        xLantisymmetry = xLzerosymmetry + x(1);     %dostať signál naspäť kam patrí

        xR = x(end-Lh:end-1) ;                       %analogicky
        xRzero = xR - x(end);
        xRzerosymmetry = -xRzero(end:-1:1);
        xRantisymmetry = xRzerosymmetry + x(end);

        x = [xLantisymmetry x xRantisymmetry]; %nepárna symetria, trafí presne krajné body, CONTIadapt ju aktuálne
        
        
        if N + L>1e2
            yn = FFTconvolution(x,h);           %rýchlejší algoritmus pomocou FFT
        else
            yn = convolution(x,h);
        end
        if mod(L,2)==0                      %zúženie signálu rozšíreného konvolúciou
            y = yn(L/2:end-L/2);
        else
            LK = floor(L/2);
            y = yn(LK+1:end-LK);
        end 
        y = y(Lh+1:end-Lh);
    end 

end
    
end