function [p,xvalue] = noiseNORMALITYtest( noise,M )
%[p,xvalue] = noiseNORMALITYtest( noise )
%NOISENORMALITYTEST vykoná test hypotézy, že daný signál má ako náhodná
%premenná normálne rozdelenie s nulovou strednou hodnotou a rozptylom
%výpočítaným zo vstupného signálu.
% Vstup:    noise - dáta, ktoré chceme otestovať
% Výstupy:  p - p-hodnota štatistického testu, udáva pravdepobnosť, že by
% sme zamietli správnu hypotézu
%           xvalue - testovacie kritérium štatistického testu

N = length(noise);

if nargin < 2
    M = round(N/100);
end

avg = sum(noise)/length(noise);
rozptyl = sqrt((1/(length(noise)-1))*sum((noise-avg).^2));

a = min(noise);
b = max(noise);
bins = a:(b-a)/M:b;
bins = [bins bins(end)+(b-a)/M]; %rovnako veľké triedy, ich počet a šírka
%sa bude upravovať, aby boli splnené predpoklady štatistickej hypotézy
newbins = bins(1);

counts = []; %skutočné početnosti tried
teorcounts = []; %teoretické početnosti tried
cumulative = 0; %pomocná premenná na hromadenie teoretických početností

for i = 1:length(bins)-1
    if bins(i)>0
        cumulative = cumulative + (-normcdf(-bins(i+1),0,rozptyl) + normcdf(-bins(i),0,rozptyl))*N;
    else
        cumulative = cumulative + (normcdf(bins(i+1),0,rozptyl) - normcdf(bins(i),0,rozptyl))*N; %počítam to prevrátene
%kvôli strojovému epsilon... 1-1e-16 = (MATLAB prehlási) = 1 a dostaneme
%početnosť 0. Preto využijem symetriu okolo nulovej hodnoty
    end
    
    if cumulative < 5 %predpoklad testu je, že teoretické početnosti sú rovné väčšie päť
        if i == length(bins)-1
            teorcounts(end) = teorcounts(end) + cumulative;
            newbins(end) = bins(end);
        end
    else
      teorcounts(end+1) = cumulative;
      newbins(end+1) = bins(i+1);
      cumulative = 0;
    end
   
end

for i = 1:length(newbins)-1
   %výpočet skutočných početností tried
   indexes1 = noise >= newbins(i);
   indexes2 = noise < newbins(i+1);
   indexes = indexes1 + indexes2;
   trueindexes = indexes == 2;
   counts(end+1) = sum(trueindexes);
   
   testkrit(i) = ((teorcounts(i)-counts(i))^2)/teorcounts(i);
end

xvalue = sum(testkrit);
p = chi2cdf(xvalue,length(newbins)-2,'upper'); %p - hodnota určená
%z distribučnej funkcie chí-kvadrátu s m-q-1 stupňom voľnosti,
%m - počet tried, q - počet odhadnutých parametrov, v našom prípade
%rozptyl, iba jeden parameter

end

