Mercurial > hg > ltpda
diff testing/utp_1.1/utps/ao/utp_ao_psd.m @ 44:409a22968d5e default
Add unit tests
author | Daniele Nicolodi <nicolodi@science.unitn.it> |
---|---|
date | Tue, 06 Dec 2011 18:42:11 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/testing/utp_1.1/utps/ao/utp_ao_psd.m Tue Dec 06 18:42:11 2011 +0100 @@ -0,0 +1,4476 @@ +% UTP_AO_PSD a set of UTPs for the ao/psd method +% +% M Hewitson 06-08-08 +% +% $Id: utp_ao_psd.m,v 1.48 2011/07/21 06:46:48 mauro Exp $ +% + +% <MethodDescription> +% +% The psd method of the ao class computes the spectral density of time-series AOs. +% +% </MethodDescription> + +function results = utp_ao_psd(varargin) + + % Check the inputs + if nargin == 0 + + addpath(fullfile(fileparts(which(mfilename)), 'reference_files')) + + % Some keywords + class = 'ao'; + mthd = 'psd'; + + results = []; + disp('******************************************************'); + disp(['**** Running UTPs for ' class '/' mthd]); + disp('******************************************************'); + + % Test AOs + [at1,at2,at3,at4,at5,at6,atvec,atmat] = eval(['get_test_objects_' class]); + + % Exception list for the UTPs: + [ple1,ple2,ple3,ple4,ple5,ple6] = get_test_ples(); + + % Get default window from the preferences + prefs = getappdata(0, 'LTPDApreferences'); + defaultWinType = char(prefs.getMiscPrefs.getDefaultWindow); + + % Very-long white noise reference time-series + a_n_long = ao(plist('filename', 'ref_whitenoise_20000s_10Hz.xml')); + + % Split the reference data into different segments + nsecs = a_n_long.data.nsecs; + Nsegments = 100; + + ap = a_n_long.split(plist('split_type', 'chunks', 'chunks', Nsegments)); + + % Run the tests + results = [results utp_01]; % getInfo call + results = [results utp_02]; % Vector input + results = [results utp_03]; % Matrix input + results = [results utp_04]; % List input + results = [results utp_05]; % Test with mixed input + results = [results utp_06]; % Test history is working + results = [results utp_07]; % Test against MATLAB's pwelch + results = [results utp_08]; % Test output of the data + results = [results utp_09]; % Test against MATLAB's pwelch + results = [results utp_10]; % Test against MATLAB's pwelch + + results = [results utp_11(mthd, at1, ple1)]; % Test plotinfo doesn't disappear + + results = [results utp_12]; % Test "conservation of energy": + % - white noise from uniform pdf, random parameters + % - no detrending, Rectangular window + results = [results utp_13]; % Test "conservation of energy": + % - white noise from normal pdf, fixed parameters + % - no detrending, Rectangular window + results = [results utp_14]; % Test "conservation of energy": + % - white noise from uniform pdf, fixed parameters + % - no detrending, Rectangular window + results = [results utp_15]; % Test "conservation of energy": + % - white noise from normal pdf, fixed parameters + % - no detrending, Rectangular window + results = [results utp_16]; % Test "conservation of energy": + % - white noise from uniform pdf, fixed parameters + % - no detrending, Rectangular window + results = [results utp_17]; % Test units handling: PSD + results = [results utp_18]; % Test units handling: ASD + results = [results utp_19]; % Test units handling: PS + results = [results utp_20]; % Test units handling: AS + results = [results utp_21]; % Test "conservation of energy": Welch window + no detrending + results = [results utp_22]; % Test "conservation of energy": Welch window + mean detrending + results = [results utp_23]; % Test "conservation of energy": Welch window + linear detrending + results = [results utp_24]; % Test "conservation of energy": Hanning window + no detrending + results = [results utp_25]; % Test "conservation of energy": Hanning window + mean detrending + results = [results utp_26]; % Test "conservation of energy": Hanning window + linear detrending + results = [results utp_27]; % Test "conservation of energy": Hamming window + no detrending + results = [results utp_28]; % Test "conservation of energy": Hamming window + mean detrending + results = [results utp_29]; % Test "conservation of energy": Hamming window + linear detrending + results = [results utp_30]; % Test "conservation of energy": BH92 window + no detrending + results = [results utp_31]; % Test "conservation of energy": BH92 window + mean detrending + results = [results utp_32]; % Test "conservation of energy": BH92 window + linear detrending + results = [results utp_33]; % Test "conservation of energy": Kaiser200 window + no detrending + results = [results utp_34]; % Test "conservation of energy": Kaiser200 window + mean detrending + results = [results utp_35]; % Test "conservation of energy": Kaiser200 window + linear detrending + results = [results utp_38]; % Test detrending + results = [results utp_39]; % Test detrending + results = [results utp_40]; % Test detrending + results = [results utp_41]; % Test different windows: Rectangular + results = [results utp_42]; % Test different windows: BH92 + results = [results utp_43]; % Test different windows: Hamming + results = [results utp_44]; % Test different windows: Hanning + results = [results utp_45]; % Test different windows: Bartlett + results = [results utp_46]; % Test different windows: Nuttall3 + results = [results utp_47]; % Test different windows: Kaiser psll = [random] + results = [results utp_48]; % Test different windows: Kaiser psll = [default] + results = [results utp_49]; % Test different windows: Nuttall4 + results = [results utp_50]; % Test different windows: SFT3F + results = [results utp_51]; % Test number of averages: requested/obtained + results = [results utp_52]; % Test number of averages: correct number + results = [results utp_53]; % Test number of averages: syntax + results = [results utp_54]; % Test "conservation of energy": + results = [results utp_60]; % Test 'basic' call: PSD + results = [results utp_61]; % Test 'basic' call: ASD + results = [results utp_62]; % Test 'basic' call: PS + results = [results utp_63]; % Test 'basic' call: AS + + + disp('Done.'); + disp('******************************************************'); + + elseif nargin == 1 % Check for UTP functions + if strcmp(varargin{1}, 'isutp') + results = 1; + else + results = 0; + end + else + error('### Incorrect inputs') + end + + + %% UTP_01 + + % <TestDescription> + % + % Tests that the getInfo call works for this method. + % + % </TestDescription> + function result = utp_01 + + + % <SyntaxDescription> + % + % Test that the getInfo call works for no sets, all sets, and each set + % individually. + % + % </SyntaxDescription> + + % <SyntaxCode> + try + % Call for no sets + io(1) = eval([class '.getInfo(''' mthd ''', ''None'')']); + % Call for all sets + io(2) = eval([class '.getInfo(''' mthd ''')']); + % Call for each set + for kk=1:numel(io(2).sets) + io(kk+2) = eval([class '.getInfo(''' mthd ''', ''' io(2).sets{kk} ''')']); + end + stest = true; + catch err + disp(err.message) + stest = false; + end + % </SyntaxCode> + + % <AlgoDescription> + % + % 1) Check that getInfo call returned an minfo object in all cases. + % 2) Check that all plists have the correct parameters. + % + % </AlgoDescription> + + % <AlgoCode> + atest = true; + if stest + % check we have minfo objects + if isa(io, 'minfo') + + %%% SET 'None' + if ~isempty(io(1).sets), atest = false; end + if ~isempty(io(1).plists), atest = false; end + %%% Check all Sets + if ~any(strcmpi(io(2).sets, 'Default')), atest = false; end + if numel(io(2).plists) ~= numel(io(2).sets), atest = false; end + %%%%%%%%%% SET 'Default' + if io(3).plists.nparams ~= 9, atest = false; end + % Check key + if ~io(3).plists.isparam('nfft'), atest = false; end + if ~io(3).plists.isparam('win'), atest = false; end + if ~io(3).plists.isparam('olap'), atest = false; end + if ~io(3).plists.isparam('scale'), atest = false; end + if ~io(3).plists.isparam('order'), atest = false; end + if ~io(3).plists.isparam('navs'), atest = false; end + if ~io(3).plists.isparam('times'), atest = false; end + if ~io(3).plists.isparam('split'), atest = false; end + if ~io(3).plists.isparam('psll'), atest = false; end + % Check default value + if ~isequal(io(3).plists.find('nfft'), -1), atest = false; end + if ~strcmpi(io(3).plists.find('win'), defaultWinType), atest = false; end + if ~isequal(io(3).plists.find('olap'), -1), atest = false; end + if ~isequal(io(3).plists.find('scale'), 'PSD'), atest = false; end + if ~isequal(io(3).plists.find('order'), 0), atest = false; end + if ~isequal(io(3).plists.find('navs'), -1), atest = false; end + if ~isEmptyDouble(io(3).plists.find('times')), atest = false; end + if ~isEmptyDouble(io(3).plists.find('split')), atest = false; end + if ~isequal(io(3).plists.find('psll'), 200), atest = false; end + % Check options + if ~isequal(io(3).plists.getOptionsForParam('nfft'), {-1}), atest = false; end + if ~isequal(io(3).plists.getOptionsForParam('win'), specwin.getTypes), atest = false; end + if ~isequal(io(3).plists.getOptionsForParam('olap'), {-1}), atest = false; end + if ~isequal(io(3).plists.getOptionsForParam('scale'), {'PSD', 'ASD', 'PS', 'AS'}), atest = false; end + if ~isequal(io(3).plists.getOptionsForParam('order'), {-1 0 1 2 3 4 5 6 7 8 9}), atest = false; end + if ~isequal(io(3).plists.getOptionsForParam('navs'), {-1}), atest = false; end + if ~isequal(io(3).plists.getOptionsForParam('times'), {[]}), atest = false; end + if ~isequal(io(3).plists.getOptionsForParam('split'), {[]}), atest = false; end + if ~isequal(io(3).plists.getOptionsForParam('psll'), {200}), atest = false; end + end + else + atest = false; + end + % </AlgoCode> + + % Return a result structure + result = utp_prepare_result(atest, stest, dbstack, mfilename); + end % END UTP_01 + + %% UTP_02 + + % <TestDescription> + % + % Tests that the psd method works with a vector of AOs as input. + % + % </TestDescription> + function result = utp_02 + + % <SyntaxDescription> + % + % Test that the psd method works for a vector of AOs as input. + % + % </SyntaxDescription> + + % <SyntaxCode> + try + avec = [at1 at5 at6]; + % Vector output + out = psd(avec); + % List output + [out1, out2, out3] = psd(avec); + stest = true; + catch err + disp(err.message) + stest = false; + end + % </SyntaxCode> + + % <AlgoDescription> + % + % 1) Check that the number of elements in 'out' is the same as in the input. + % 2) Check that each output object contains the correct values. + % + % </AlgoDescription> + + % <AlgoCode> + atest = true; + if stest + % Check we have the correct number of outputs + if numel(out) ~= numel(avec), atest = false; end + % Check we have the correct values in the outputs + % Vector output + for kk = 1:numel(out) + if ~eq(out(kk), psd(avec(kk)), ple1), atest = false; end + end + % List output + if ~eq(out1, psd(avec(1)), ple1), atest = false; end + if ~eq(out2, psd(avec(2)), ple1), atest = false; end + if ~eq(out3, psd(avec(3)), ple1), atest = false; end + else + atest = false; + end + % </AlgoCode> + + % Return a result structure + result = utp_prepare_result(atest, stest, dbstack, mfilename); + end % END UTP_02 + + %% UTP_03 + + % <TestDescription> + % + % Tests that the psd method works with a matrix of AOs as input. + % + % </TestDescription> + function result = utp_03 + + % <SyntaxDescription> + % + % Test that the psd method works for a matrix of AOs as input. + % + % </SyntaxDescription> + + % <SyntaxCode> + try + amat = [at1 at5 at6; at5 at6 at1]; + % Vector output + out = psd(amat); + % List output + [out1, out2, out3, out4, out5, out6] = psd(amat); + stest = true; + catch err + disp(err.message) + stest = false; + end + % </SyntaxCode> + + % <AlgoDescription> + % + % 1) Check that the number of elements in 'out' is the same as in the input. + % 2) Check that each output object contains the correct values. + % + % </AlgoDescription> + + % <AlgoCode> + atest = true; + if stest + % Check we have the correct number of outputs + if numel(out) ~= numel(amat), atest = false; end + % Check we have the correct values in the outputs + % Vector output + for kk = 1:numel(out) + if ~eq(out(kk), psd(amat(kk)), ple1), atest = false; end + end + % List output + if ~eq(out1, psd(amat(1)), ple1), atest = false; end + if ~eq(out2, psd(amat(2)), ple1), atest = false; end + if ~eq(out3, psd(amat(3)), ple1), atest = false; end + if ~eq(out4, psd(amat(4)), ple1), atest = false; end + if ~eq(out5, psd(amat(5)), ple1), atest = false; end + if ~eq(out6, psd(amat(6)), ple1), atest = false; end + else + atest = false; + end + % </AlgoCode> + + % Return a result structure + result = utp_prepare_result(atest, stest, dbstack, mfilename); + end % END UTP_03 + + %% UTP_04 + + % <TestDescription> + % + % Tests that the psd method works with a list of AOs as input. + % + % </TestDescription> + function result = utp_04 + + % <SyntaxDescription> + % + % Test that the psd method works for a list of AOs as input. + % + % </SyntaxDescription> + + % <SyntaxCode> + try + % Vector output + out = psd(at1,at5,at6); + % List output + [out1, out2, out3] = psd(at1,at5,at6); + stest = true; + catch err + disp(err.message) + stest = false; + end + % </SyntaxCode> + + % <AlgoDescription> + % + % 1) Check that the number of elements in 'out' is the same as in the input. + % 2) Check that each output AO contains the correct data. + % + % </AlgoDescription> + + % <AlgoCode> + atest = true; + if stest + % Check we have the correct number of outputs + if numel(out) ~= 3, atest = false; end + % Check we have the correct values in the outputs + % Vector output + if ~eq(out(1), psd(at1), ple1), atest = false; end + if ~eq(out(2), psd(at5), ple1), atest = false; end + if ~eq(out(3), psd(at6), ple1), atest = false; end + % List output + if ~eq(out1, psd(at1), ple1), atest = false; end + if ~eq(out2, psd(at5), ple1), atest = false; end + if ~eq(out3, psd(at6), ple1), atest = false; end + + else + atest = false; + end + % </AlgoCode> + + % Return a result structure + result = utp_prepare_result(atest, stest, dbstack, mfilename); + end % END UTP_04 + + %% UTP_05 + + % <TestDescription> + % + % Tests that the psd method works with a mix of different shaped AOs as + % input. + % + % </TestDescription> + function result = utp_05 + + % <SyntaxDescription> + % + % Test that the psd method works with an input of matrices and vectors + % and single AOs. + % + % </SyntaxDescription> + + % <SyntaxCode> + try + % Vector output + out = psd(at1,[at5 at6],at5,[at5 at1; at6 at1],at6); + % List output + [out1, out2, out3, out4, out5, out6, out7, out8, out9] = ... + psd(at1,[at5 at6],at5,[at5 at1; at6 at1],at6); + stest = true; + catch err + disp(err.message) + stest = false; + end + % </SyntaxCode> + + % <AlgoDescription> + % + % 1) Check that the number of elements in 'out' is the same as in + % input. + % 2) Check that each output AO contains the correct data. + % + % </AlgoDescription> + + % <AlgoCode> + atest = true; + if stest + % Check we have the correct number of outputs + if numel(out) ~= 9, atest = false; end + % Check we have the correct values in the outputs + % Vector output + if ~eq(out(1), psd(at1), ple1), atest = false; end + if ~eq(out(2), psd(at5), ple1), atest = false; end + if ~eq(out(3), psd(at6), ple1), atest = false; end + if ~eq(out(4), psd(at5), ple1), atest = false; end + if ~eq(out(5), psd(at5), ple1), atest = false; end + if ~eq(out(6), psd(at6), ple1), atest = false; end + if ~eq(out(7), psd(at1), ple1), atest = false; end + if ~eq(out(8), psd(at1), ple1), atest = false; end + if ~eq(out(9), psd(at6), ple1), atest = false; end + % List output + if ~eq(out1, psd(at1), ple1), atest = false; end + if ~eq(out2, psd(at5), ple1), atest = false; end + if ~eq(out3, psd(at6), ple1), atest = false; end + if ~eq(out4, psd(at5), ple1), atest = false; end + if ~eq(out5, psd(at5), ple1), atest = false; end + if ~eq(out6, psd(at6), ple1), atest = false; end + if ~eq(out7, psd(at1), ple1), atest = false; end + if ~eq(out8, psd(at1), ple1), atest = false; end + if ~eq(out9, psd(at6), ple1), atest = false; end + + else + atest = false; + end + % </AlgoCode> + + % Return a result structure + result = utp_prepare_result(atest, stest, dbstack, mfilename); + end % END UTP_05 + + %% UTP_06 + + % <TestDescription> + % + % Tests that the psd method properly applies history. + % + % </TestDescription> + function result = utp_06 + + % <SyntaxDescription> + % + % Test that the result of applying the psd method can be processed back + % to an m-file. + % + % </SyntaxDescription> + + % <SyntaxCode> + try + out = psd(at5); + mout = rebuild(out); + stest = true; + catch err + disp(err.message) + stest = false; + end + % </SyntaxCode> + + % <AlgoDescription> + % + % 1) Check that the last entry in the history of 'out' corresponds to + % 'psd'. + % 2) Check that the re-built object is the same object as 'out'. + % + % </AlgoDescription> + + % <AlgoCode> + atest = true; + if stest + % Check the last step in the history of 'out' + if ~strcmp(out.hist.methodInfo.mname, 'psd'), atest = false; end + % Check the re-built object + if ~eq(mout, out, ple2), atest = false; end + else + atest = false; + end + % </AlgoCode> + + % Return a result structure + result = utp_prepare_result(atest, stest, dbstack, mfilename); + end % END UTP_06 + + %% UTP_07 + + % <TestDescription> + % + % Tests that the psd method agrees with MATLAB's pwelch, within some tolerance, + % when configured to use the same parameters. + % + % </TestDescription> + function result = utp_07 + + % <SyntaxDescription> + % + % Test that applying psd works on a single AO. + % + % </SyntaxDescription> + + % <SyntaxCode> + try + % Load reference ao + a1 = ao('ref_whitenoise_10s_1000Hz.xml'); + fs = a1.fs; + % Compute PSD + Nfft = 2*fs; + win = specwin('Hanning', Nfft); + pl = plist('Nfft', Nfft, 'Win', win.type, 'order', -1); + S1 = a1.psd(pl); + stest = true; + catch err + disp(err.message) + stest = false; + end + % </SyntaxCode> + + % <AlgoDescription> + % + % 1) Check that output agrees with the output of MATLAB's pwelch within tolerance. + % + % </AlgoDescription> + + % <AlgoCode> + atest = true; + TOL = 1.8e-15; + + if stest + % Load reference psd + ref = load('ref_psd_10s_1000Hz.txt'); + if ~isequal(ref(:,1), S1.x) || any((abs(S1.y - ref(:,2)) ./ S1.y) >= TOL) + atest = false; + end + else + atest = false; + end + % </AlgoCode> + + % Return a result structure + result = utp_prepare_result(atest, stest, dbstack, mfilename); + end % END UTP_07 + + %% UTP_08 + + % <TestDescription> + % + % Check that the psd method pass back the output objects to a list of + % output variables or to a single variable. + % + % </TestDescription> + function result = utp_08 + + % <SyntaxDescription> + % + % Call the method with a list of output variables and with a single output + % variable. Additionaly check that the rebuild method works on the output. + % + % </SyntaxDescription> + + try + % <SyntaxCode> + [o1, o2] = psd(at5, at6); + o3 = psd(at5, at6); + mout1 = rebuild(o1); + mout2 = rebuild(o2); + mout3 = rebuild(o3); + % </SyntaxCode> + stest = true; + catch err + disp(err.message) + stest = false; + end + + % <AlgoDescription> + % + % 1) Check that the output contains the right number of objects + % 2) Check that the 'rebuild' method produces the same object as 'out'. + % + % </AlgoDescription> + + atest = true; + if stest + % <AlgoCode> + % Check the number of outputs + if numel(o1) ~=1, atest = false; end + if numel(o2) ~=1, atest = false; end + if numel(o3) ~=2, atest = false; end + % Check the rebuilding of the object + if ~eq(o1, mout1, ple2), atest = false; end + if ~eq(o2, mout2, ple2), atest = false; end + if ~eq(o3, mout3, ple2), atest = false; end + % </AlgoCode> + else + atest = false; + end + + % Return a result structure + result = utp_prepare_result(atest, stest, dbstack, mfilename); + end % END UTP_08 + + %% UTP_09 + + % <TestDescription> + % + % Tests that the psd method agrees with MATLAB's pwelch when + % configured to use the same parameters. + % + % </TestDescription> + function result = utp_09 + + % <SyntaxDescription> + % + % Test that the applying psd works on a single AO. + % + % </SyntaxDescription> + + % <SyntaxCode> + try + % Load reference ao + a1 = ao('ref_whitenoise_3600s_1Hz.xml'); + % Compute PSD + Nfft = 1000; + win = specwin('BH92', Nfft); + pl = plist('Nfft', Nfft, 'Win', win.type, 'order', -1); + S1 = a1.psd(pl); + stest = true; + catch err + disp(err.message) + stest = false; + end + % </SyntaxCode> + + % <AlgoDescription> + % + % 1) Check that output agrees with the output of MATLAB's pwelch. + % + % </AlgoDescription> + + % <AlgoCode> + atest = true; + TOL = 1e-15; + + if stest + % Load reference psd + ref = load('ref_psd_3600s_1Hz.txt'); + if ~isequal(ref(:,1), S1.x) || any((abs(S1.y - ref(:,2)) ./ S1.y) >= TOL) + atest = false; + end + else + atest = false; + end + % </AlgoCode> + + % Return a result structure + result = utp_prepare_result(atest, stest, dbstack, mfilename); + end % END UTP_09 + + %% UTP_10 + + % <TestDescription> + % + % Tests that the psd method agrees with MATLAB's pwelch when + % configured to use the same parameters. + % + % </TestDescription> + function result = utp_10 + + % <SyntaxDescription> + % + % Test that the applying psd works on a single AO. + % + % </SyntaxDescription> + + % <SyntaxCode> + try + % Load reference ao + a1 = ao('ref_whitenoise_100000s_100mHz.xml'); + % Compute PSD + Nfft = a1.fs * a1.data.nsecs; + psll = 100; + win = specwin('Kaiser', Nfft, psll); + pl = plist('Nfft', Nfft, 'Win', win.type, 'psll', psll, 'order', -1); + S1 = a1.psd(pl); + stest = true; + catch err + disp(err.message) + stest = false; + end + % </SyntaxCode> + + % <AlgoDescription> + % + % 1) Check that output agrees with the output of MATLAB's pwelch. + % + % </AlgoDescription> + + % <AlgoCode> + atest = true; + TOL = 1e-13; + + if stest + % Load reference psd + ref = load('ref_psd_100000s_100mHz.txt'); + if ~isequal(ref(:,1), S1.x) || any((abs(S1.y - ref(:,2)) ./ S1.y) >= TOL) + atest = false; + end + else + atest = false; + end + % </AlgoCode> + + % Return a result structure + result = utp_prepare_result(atest, stest, dbstack, mfilename); + end % END UTP_10 + + + + %% UTP_12 + + % <TestDescription> + % + % Tests "conservation of energy": + % 1) white noise produced from uniform pdf, with a given mean value and + % sigma (distribution's 1st and 2nd order) + % 2) evaluate the sample mean value m and standard deviation s + % 3) psd of the white noise + % 4) compares the sqrt(sum(S * df)) with the standard deviation s + % + + % </TestDescription> + function result = utp_12 + + % <SyntaxDescription> + % + % 1) Prepare the test tsdata: + % white noise from uniform distribution + offset + % 2) Calculate the statistical parameters + % 3) Estimate the psd + % + % </SyntaxDescription> + + % <SyntaxCode> + try + + % White noise + % Parameters are crucial for the estimate to be correct! + + noise_type = 'Uniform'; + win_type = 'Rectangular'; + olap = 0; + detrend_order = 0; + + scale = 'PSD'; + + [sigma_sample, sigma_psd] = prepare_analyze_noise_energy(win_type, noise_type, scale, ... + plist('detrend_order', detrend_order, 'olap', olap)); + + stest = true; + + catch err + disp(err.message) + stest = false; + end + + % </SyntaxCode> + + % <AlgoDescription> + % + % 1) Check that calculated psd energy equals the rms content of the tsdata, estimated by the std of the sample + % + % </AlgoDescription> + + % <AlgoCode> + atest = true; + TOL = 1e-12; + + if stest + if abs(sigma_psd - sigma_sample) / mean([sigma_psd sigma_sample]) >= TOL + atest = false; + end + else + atest = false; + end + % </AlgoCode> + + % Return a result structure + result = utp_prepare_result(atest, stest, dbstack, mfilename); + end % END UTP_12 + + %% UTP_13 + + % <TestDescription> + % + % Tests "conservation of energy" with fixed parameters: + % 1) white noise produced from normal pdf, with a given mean value and + % sigma (distribution's 1st and 2nd order) + % 2) evaluate the sample mean value m and standard deviation s + % 3) psd of the white noise + % 4) compares the sqrt(sum(S * df)) with the standard deviation s + % + + % </TestDescription> + function result = utp_13 + + % <SyntaxDescription> + % + % 1) Prepare the test tsdata: + % white noise from normal distribution + offset + % 2) Calculate the statistical parameters + % 3) Estimate the psd + % + % </SyntaxDescription> + + % <SyntaxCode> + try + + % White noise + % Parameters are crucial for the estimate to be correct! + + noise_type = 'Normal'; + win_type = 'Rectangular'; + olap = 0; + detrend_order = 0; + + scale = 'PSD'; + + % Build with fixed parameters + fs = 10; + nsecs = 3600; + sigma_distr = 1; + mu_distr = 0; + [sigma_sample, sigma_psd] = prepare_analyze_noise_energy(win_type, noise_type, scale, ... + plist('detrend_order', detrend_order, 'olap', olap, ... + 'fs', fs, 'nsecs', nsecs, 'sigma_distr', sigma_distr, 'mu_distr', mu_distr)); + + stest = true; + + catch err + disp(err.message) + stest = false; + end + % </SyntaxCode> + + % <AlgoDescription> + % + % 1) Check that calculated psd energy equals the rms content of the tsdata, estimated by the std of the sample + % + % </AlgoDescription> + + % <AlgoCode> + atest = true; + TOL = 1e-12; + + if stest + if abs(sigma_psd - sigma_sample) / mean([sigma_psd sigma_sample]) >= TOL + atest = false; + end + else + atest = false; + end + % </AlgoCode> + + % Return a result structure + result = utp_prepare_result(atest, stest, dbstack, mfilename); + end % END UTP_13 + + %% UTP_14 + + % <TestDescription> + % + % Tests "conservation of energy" with fixed parameters: + % 1) white noise produced from uniform pdf, with a given mean value and + % sigma (distribution's 1st and 2nd order) + % 2) evaluate the sample mean value m and standard deviation s + % 3) psd of the white noise + % 4) compares the sqrt(sum(S * df)) with the standard deviation s + % + + % </TestDescription> + function result = utp_14 + + % <SyntaxDescription> + % + % 1) Prepare the test tsdata: + % white noise from uniform distribution + offset + % 2) Calculate the statistical parameters + % 3) Estimate the psd + % + % </SyntaxDescription> + + % <SyntaxCode> + try + + % White noise + % Parameters are crucial for the estimate to be correct! + + noise_type = 'Uniform'; + win_type = 'Rectangular'; + olap = 0; + detrend_order = 0; + + scale = 'PSD'; + + % Build with fixed parameters + fs = 1; + nsecs = 86400; + sigma_distr = 1e-9; + mu_distr = 3e-7; + [sigma_sample, sigma_psd] = prepare_analyze_noise_energy(win_type, noise_type, scale, ... + plist('detrend_order', detrend_order, 'olap', olap, ... + 'fs', fs, 'nsecs', nsecs, 'sigma_distr', sigma_distr, 'mu_distr', mu_distr)); + + stest = true; + + catch err + disp(err.message) + stest = false; + end + % </SyntaxCode> + + % <AlgoDescription> + % + % 1) Check that calculated psd energy equals the rms content of the tsdata, estimated by the std of the sample + % + % </AlgoDescription> + + % <AlgoCode> + atest = true; + TOL = 1e-12; + + if stest + if abs(sigma_psd - sigma_sample) / mean([sigma_psd sigma_sample]) >= TOL + atest = false; + end + else + atest = false; + end + % </AlgoCode> + + % Return a result structure + result = utp_prepare_result(atest, stest, dbstack, mfilename); + end % END UTP_14 + + %% UTP_15 + + % <TestDescription> + % + % Tests "conservation of energy" with fixed parameters: + % 1) white noise produced from normal pdf, with a given mean value and + % sigma (distribution's 1st and 2nd order) + % 2) evaluate the sample mean value m and standard deviation s + % 3) psd of the white noise + % 4) compares the sqrt(sum(S * df)) with the standard deviation s + % + + % </TestDescription> + function result = utp_15 + + % <SyntaxDescription> + % + % 1) Prepare the test tsdata: + % white noise from normal distribution + offset + % 2) Calculate the statistical parameters + % 3) Estimate the psd + % + % </SyntaxDescription> + + % <SyntaxCode> + try + + % White noise + % Parameters are crucial for the estimate to be correct! + + noise_type = 'Normal'; + win_type = 'Rectangular'; + olap = 0; + detrend_order = 0; + + scale = 'PSD'; + + % Build with fixed parameters + fs = 100; + nsecs = 100; + sigma_distr = 1e-12; + mu_distr = -5e-12; + [sigma_sample, sigma_psd] = prepare_analyze_noise_energy(win_type, noise_type, scale, ... + plist('detrend_order', detrend_order, 'olap', olap, ... + 'fs', fs, 'nsecs', nsecs, 'sigma_distr', sigma_distr, 'mu_distr', mu_distr)); + + stest = true; + + catch err + disp(err.message) + stest = false; + end + % </SyntaxCode> + + % <AlgoDescription> + % + % 1) Check that calculated psd energy equals the rms content of the tsdata, estimated by the std of the sample + % + % </AlgoDescription> + + % <AlgoCode> + atest = true; + TOL = 1e-12; + + if stest + if abs(sigma_psd - sigma_sample) / mean([sigma_psd sigma_sample]) >= TOL + atest = false; + end + else + atest = false; + end + % </AlgoCode> + + % Return a result structure + result = utp_prepare_result(atest, stest, dbstack, mfilename); + end % END UTP_15 + + %% UTP_16 + + % <TestDescription> + % + % Tests "conservation of energy" with fixed parameters: + % 1) white noise produced from uniform pdf, with a given mean value and + % sigma (distribution's 1st and 2nd order) + % 2) evaluate the sample mean value m and standard deviation s + % 3) psd of the white noise + % 4) compares the sqrt(sum(S * df)) with the standard deviation s + % + + % </TestDescription> + function result = utp_16 + + % <SyntaxDescription> + % + % 1) Prepare the test tsdata: + % white noise from uniform distribution + offset + % 2) Calculate the statistical parameters + % 3) Estimate the psd + % + % </SyntaxDescription> + + % <SyntaxCode> + try + + % White noise + % Parameters are crucial for the estimate to be correct! + + noise_type = 'Uniform'; + win_type = 'Rectangular'; + olap = 0; + detrend_order = 0; + + scale = 'PSD'; + + % Build with fixed parameters + fs = 0.01; + nsecs = 3*86400; + sigma_distr = 1e-15; + mu_distr = -7.72e-13; + [sigma_sample, sigma_psd] = prepare_analyze_noise_energy(win_type, noise_type, scale, ... + plist('detrend_order', detrend_order, 'olap', olap, ... + 'fs', fs, 'nsecs', nsecs, 'sigma_distr', sigma_distr, 'mu_distr', mu_distr)); + + stest = true; + + catch err + disp(err.message) + stest = false; + end + % </SyntaxCode> + + % <AlgoDescription> + % + % 1) Check that calculated psd energy equals the rms content of the tsdata, estimated by the std of the sample + % + % </AlgoDescription> + + % <AlgoCode> + atest = true; + TOL = 1e-12; + + if stest + if abs(sigma_psd - sigma_sample) / mean([sigma_psd sigma_sample]) >= TOL + atest = false; + end + else + atest = false; + end + % </AlgoCode> + + % Return a result structure + result = utp_prepare_result(atest, stest, dbstack, mfilename); + end % END UTP_16 + + %% UTP_17 + + % <TestDescription> + % + % Tests handling of units: + % 1) white noise produced from normal pdf, with a given mean value and + % sigma (distribution's 1st and 2nd orders) + % 2) PSD of the white noise + % 3) compares the units of the input and output + % + + % </TestDescription> + function result = utp_17 + + % <SyntaxDescription> + % + % 1) Prepare the test tsdata: + % white noise from normal distribution + offset + % 2) Assign a random unit + % 3) PSD of the white noise + % + % </SyntaxDescription> + + % <SyntaxCode> + try + + % White noise + noise_type = 'Normal'; + win_type = 'BH92'; + reduce_pts = 10; + scale = 'PSD'; + olap = specwin(win_type).rov; + + [a, S, S1, S2] = prepare_analyze_noise_win(win_type, noise_type, scale, ... + plist('olap', olap, 'reduce_pts', reduce_pts)); + % S1 and S2 are empty in this case + + stest = true; + + catch err + disp(err.message) + stest = false; + end + % </SyntaxCode> + + % <AlgoDescription> + % + % 1) Check that (calculated PSD yunits) equals (input units)^2 / Hz + % 2) Check that (calculated PSD xunits) equals Hz + % + % </AlgoDescription> + + % <AlgoCode> + atest = true; + + if stest + if ne(S.yunits, (a.yunits).^2 * unit('Hz^-1')) || ne(S.xunits, unit('Hz')) + atest = false; + end + else + atest = false; + end + % </AlgoCode> + + % Return a result structure + result = utp_prepare_result(atest, stest, dbstack, mfilename); + end % END UTP_17 + + %% UTP_18 + + % <TestDescription> + % + % Tests handling of units: + % 1) white noise produced from uniform pdf, with a given mean value and + % sigma (distribution's 1st and 2nd orders) + % 2) ASD of the white noise + % 3) compares the units of the input and output + % + + % </TestDescription> + function result = utp_18 + + % <SyntaxDescription> + % + % 1) Prepare the test tsdata: + % white noise from uniform distribution + offset + % 2) Assign a random unit + % 3) ASD of the white noise + % + % </SyntaxDescription> + + % <SyntaxCode> + try + + % White noise + noise_type = 'Uniform'; + win_type = 'Hamming'; + reduce_pts = 4; + scale = 'ASD'; + olap = specwin(win_type).rov; + + [a, S, S1, S2] = prepare_analyze_noise_win(win_type, noise_type, scale, ... + plist('olap', olap, 'reduce_pts', reduce_pts)); + % S1 and S2 are empty in this case + + stest = true; + + catch err + disp(err.message) + stest = false; + end + % </SyntaxCode> + + % <AlgoDescription> + % + % 1) Check that (calculated ASD yunits) equals (input units) / Hz^(1/2) + % 2) Check that (calculated ASD xunits) equals Hz + % + % </AlgoDescription> + + % <AlgoCode> + atest = true; + + if stest + if ne(S.yunits, (a.yunits) * unit('Hz^-1/2')) || ne(S.xunits, unit('Hz')) + atest = false; + end + else + atest = false; + end + % </AlgoCode> + + % Return a result structure + result = utp_prepare_result(atest, stest, dbstack, mfilename); + end % END UTP_18 + + %% UTP_19 + + % <TestDescription> + % + % Tests handling of units: + % 1) white noise produced from normal pdf, with a given mean value and + % sigma (distribution's 1st and 2nd orders) + % 2) PS of the white noise + % 3) compares the units of the input and output + % + + % </TestDescription> + function result = utp_19 + + % <SyntaxDescription> + % + % 1) Prepare the test tsdata: + % white noise from normal distribution + offset + % 2) Assign a random unit + % 3) PS of the white noise + % + % </SyntaxDescription> + + % <SyntaxCode> + try + + % White noise + noise_type = 'Normal'; + win_type = 'Hanning'; + reduce_pts = 5; + scale = 'PS'; + olap = specwin(win_type).rov; + + [a, S, S1, S2] = prepare_analyze_noise_win(win_type, noise_type, scale, ... + plist('olap', olap, 'reduce_pts', reduce_pts)); + % S1 and S2 are empty in this case + + stest = true; + + catch err + disp(err.message) + stest = false; + end + % </SyntaxCode> + + % <AlgoDescription> + % + % 1) Check that (calculated PS yunits) equals (input units)^2 + % 2) Check that (calculated PS xunits) equals Hz + % + % </AlgoDescription> + + % <AlgoCode> + atest = true; + + if stest + if ne(S.yunits, (a.yunits).^2) || ne(S.xunits, unit('Hz')) + atest = false; + end + else + atest = false; + end + % </AlgoCode> + + % Return a result structure + result = utp_prepare_result(atest, stest, dbstack, mfilename); + end % END UTP_19 + + %% UTP_20 + + % <TestDescription> + % + % Tests handling of units: + % 1) white noise produced from uniform distribution, with a given mean value and + % sigma (distribution's 1st and 2nd orders) + % 2) AS of the white noise + % 3) compares the units of the input and output + % + + % </TestDescription> + function result = utp_20 + + % <SyntaxDescription> + % + % 1) Prepare the test tsdata: + % white noise from uniform distribution + offset + % 2) Assign a random unit + % 3) AS of the white noise + % + % </SyntaxDescription> + + % <SyntaxCode> + try + + % White noise + noise_type = 'Uniform'; + win_type = 'Rectangular'; + reduce_pts = 10; + scale = 'AS'; + olap = specwin(win_type).rov; + + [a, S, S1, S2] = prepare_analyze_noise_win(win_type, noise_type, scale, ... + plist('olap', olap, 'reduce_pts', reduce_pts)); + % S1 and S2 are empty in this case + + stest = true; + + catch err + disp(err.message) + stest = false; + end + % </SyntaxCode> + + % <AlgoDescription> + % + % 1) Check that (calculated AS yunits) equals (input units) + % 2) Check that (calculated AS xunits) equals Hz + % + % </AlgoDescription> + + % <AlgoCode> + atest = true; + + if stest + if ne(S.yunits, a.yunits) || ne(S.xunits, unit('Hz')) + atest = false; + end + else + atest = false; + end + % </AlgoCode> + + % Return a result structure + result = utp_prepare_result(atest, stest, dbstack, mfilename); + end % END UTP_20 + + %% UTP_21 + + % <TestDescription> + % + % Tests "conservation of energy": + % 1) white noise produced from normal pdf, with: + % a given mean value and sigma (distribution's 1st and 2nd order) + % 2) Calculate the expected level of noise from sample statistics + % 3) Calculates the PSD of the individual parts, with: + % Welch window and no detrend + % 4) Evaluate the mean and standard deviation of the Checks on individual PSDs: + % 5) Checks on individual PSDs: mean and standard deviation of the PSD points + % 6) Evaluate the expected value, estimated from the std of the + % individual segments + % 7) Compares with the mean performed on the individual segments + % 8) Checks on averaged PSDs: mean and standard deviation of all the PSD points + % 9) Compares the grand-mean with the estimated white noise level + + % </TestDescription> + function result = utp_21 + + % <SyntaxDescription> + % + % 1) Split the reference data into different segments + % 2) Calculates the PSD of the individual parts + % + % </SyntaxDescription> + + % <SyntaxCode> + try + + % Calculate the expected level of noise from sample statistics + + % Evaluate the PSDs on the parts, employing: + % - Welch window + % - no detrend + win_type = 'Welch'; + detrend_order = -1; + + [S_ap, S_sigma_total, S_expected_total] = ... + test_psd_energy_prepare_data(win_type, detrend_order, plist); + + stest = true; + + catch err + disp(err.message) + stest = false; + end + % </SyntaxCode> + + % <AlgoDescription> + % + % 1) Evaluate the mean and standard deviation of the Checks on individual PSDs: + % 2) Checks on individual PSDs: mean and standard deviation of the PSD points + % 3) Evaluate the expected value, estimated from the std of the + % individual segments + % 4) Compares with the mean performed on the individual segments + % 5) Checks on averaged PSDs: mean and standard deviation of all the PSD points + % 6) Compares the grand-mean with the estimated white noise level + + % </AlgoDescription> + + % <AlgoCode> + + if stest + atest = algo_test_psd_energy(ap, S_ap, S_expected_total, plist); + else + atest = false; + end + + % </AlgoCode> + + % Return a result structure + result = utp_prepare_result(atest, stest, dbstack, mfilename); + end % END UTP_21 + + + %% UTP_22 + + % <TestDescription> + % + % Tests "conservation of energy": + % 1) white noise produced from normal pdf, with: + % a given mean value and sigma (distribution's 1st and 2nd order) + % 2) Calculate the expected level of noise from sample statistics + % 3) Calculates the PSD of the individual parts, with: + % Welch window and mean detrend + % 4) Evaluate the mean and standard deviation of the Checks on individual PSDs: + % 5) Checks on individual PSDs: mean and standard deviation of the PSD points + % 6) Evaluate the expected value, estimated from the std of the + % individual segments + % 7) Compares with the mean performed on the individual segments + % 8) Checks on averaged PSDs: mean and standard deviation of all the PSD points + % 9) Compares the grand-mean with the estimated white noise level + + % </TestDescription> + function result = utp_22 + + % <SyntaxDescription> + % + % 1) Split the reference data into different segments + % 2) Calculates the PSD of the individual parts + % + % </SyntaxDescription> + + % <SyntaxCode> + try + + % Calculate the expected level of noise from sample statistics + + % Evaluate the PSDs on the parts, employing: + % - Welch window + % - mean detrend + win_type = 'Welch'; + detrend_order = 0; + + [S_ap, S_sigma_total, S_expected_total] = ... + test_psd_energy_prepare_data(win_type, detrend_order, plist); + + stest = true; + + catch err + disp(err.message) + stest = false; + end + % </SyntaxCode> + + % <AlgoDescription> + % + % 1) Evaluate the mean and standard deviation of the Checks on individual PSDs: + % 2) Checks on individual PSDs: mean and standard deviation of the PSD points + % 3) Evaluate the expected value, estimated from the std of the + % individual segments + % 4) Compares with the mean performed on the individual segments + % 5) Checks on averaged PSDs: mean and standard deviation of all the PSD points + % 6) Compares the grand-mean with the estimated white noise level + + % </AlgoDescription> + + % <AlgoCode> + + if stest + atest = algo_test_psd_energy(ap, S_ap, S_expected_total, plist); + else + atest = false; + end + + % </AlgoCode> + + % Return a result structure + result = utp_prepare_result(atest, stest, dbstack, mfilename); + end % END UTP_22 + + %% UTP_23 + + % <TestDescription> + % + % Tests "conservation of energy": + % 1) white noise produced from normal pdf, with: + % a given mean value and sigma (distribution's 1st and 2nd order) + % 2) Calculate the expected level of noise from sample statistics + % 3) Calculates the PSD of the individual parts, with: + % Welch window and linear detrend + % 4) Evaluate the mean and standard deviation of the Checks on individual PSDs: + % 5) Checks on individual PSDs: mean and standard deviation of the PSD points + % 6) Evaluate the expected value, estimated from the std of the + % individual segments + % 7) Compares with the mean performed on the individual segments + % 8) Checks on averaged PSDs: mean and standard deviation of all the PSD points + % 9) Compares the grand-mean with the estimated white noise level + + % </TestDescription> + function result = utp_23 + + % <SyntaxDescription> + % + % 1) Split the reference data into different segments + % 2) Calculates the PSD of the individual parts + % + % </SyntaxDescription> + + % <SyntaxCode> + try + + % Calculate the expected level of noise from sample statistics + + % Evaluate the PSDs on the parts, employing: + % - Welch window + % - linear detrend + win_type = 'Welch'; + detrend_order = 1; + + [S_ap, S_sigma_total, S_expected_total] = ... + test_psd_energy_prepare_data(win_type, detrend_order, plist); + + stest = true; + + catch err + disp(err.message) + stest = false; + end + % </SyntaxCode> + + % <AlgoDescription> + % + % 1) Evaluate the mean and standard deviation of the Checks on individual PSDs: + % 2) Checks on individual PSDs: mean and standard deviation of the PSD points + % 3) Evaluate the expected value, estimated from the std of the + % individual segments + % 4) Compares with the mean performed on the individual segments + % 5) Checks on averaged PSDs: mean and standard deviation of all the PSD points + % 6) Compares the grand-mean with the estimated white noise level + + % </AlgoDescription> + + % <AlgoCode> + + if stest + atest = algo_test_psd_energy(ap, S_ap, S_expected_total, plist); + else + atest = false; + end + + % </AlgoCode> + + % Return a result structure + result = utp_prepare_result(atest, stest, dbstack, mfilename); + end % END UTP_23 + + %% UTP_24 + + % <TestDescription> + % + % Tests "conservation of energy": + % 1) white noise produced from normal pdf, with: + % a given mean value and sigma (distribution's 1st and 2nd order) + % 2) Calculate the expected level of noise from sample statistics + % 3) Calculates the PSD of the individual parts, with: + % Hanning window and no detrend + % 4) Evaluate the mean and standard deviation of the Checks on individual PSDs: + % 5) Checks on individual PSDs: mean and standard deviation of the PSD points + % 6) Evaluate the expected value, estimated from the std of the + % individual segments + % 7) Compares with the mean performed on the individual segments + % 8) Checks on averaged PSDs: mean and standard deviation of all the PSD points + % 9) Compares the grand-mean with the estimated white noise level + + % </TestDescription> + function result = utp_24 + + % <SyntaxDescription> + % + % 1) Split the reference data into different segments + % 2) Calculates the PSD of the individual parts + % + % </SyntaxDescription> + + % <SyntaxCode> + try + + % Calculate the expected level of noise from sample statistics + + % Evaluate the PSDs on the parts, employing: + % - Hanning window + % - no detrend + win_type = 'Hanning'; + detrend_order = -1; + + [S_ap, S_sigma_total, S_expected_total] = ... + test_psd_energy_prepare_data(win_type, detrend_order, plist); + + stest = true; + + catch err + disp(err.message) + stest = false; + end + % </SyntaxCode> + + % <AlgoDescription> + % + % 1) Evaluate the mean and standard deviation of the Checks on individual PSDs: + % 2) Checks on individual PSDs: mean and standard deviation of the PSD points + % 3) Evaluate the expected value, estimated from the std of the + % individual segments + % 4) Compares with the mean performed on the individual segments + % 5) Checks on averaged PSDs: mean and standard deviation of all the PSD points + % 6) Compares the grand-mean with the estimated white noise level + + % </AlgoDescription> + + % <AlgoCode> + + if stest + atest = algo_test_psd_energy(ap, S_ap, S_expected_total, plist); + else + atest = false; + end + + % </AlgoCode> + + % Return a result structure + result = utp_prepare_result(atest, stest, dbstack, mfilename); + end % END UTP_24 + + + %% UTP_25 + + % <TestDescription> + % + % Tests "conservation of energy": + % 1) white noise produced from normal pdf, with: + % a given mean value and sigma (distribution's 1st and 2nd order) + % 2) Calculate the expected level of noise from sample statistics + % 3) Calculates the PSD of the individual parts, with: + % Hanning window and mean detrend + % 4) Evaluate the mean and standard deviation of the Checks on individual PSDs: + % 5) Checks on individual PSDs: mean and standard deviation of the PSD points + % 6) Evaluate the expected value, estimated from the std of the + % individual segments + % 7) Compares with the mean performed on the individual segments + % 8) Checks on averaged PSDs: mean and standard deviation of all the PSD points + % 9) Compares the grand-mean with the estimated white noise level + + % </TestDescription> + function result = utp_25 + + % <SyntaxDescription> + % + % 1) Split the reference data into different segments + % 2) Calculates the PSD of the individual parts + % + % </SyntaxDescription> + + % <SyntaxCode> + try + + % Calculate the expected level of noise from sample statistics + + % Evaluate the PSDs on the parts, employing: + % - Hanning window + % - mean detrend + win_type = 'Hanning'; + detrend_order = 0; + + [S_ap, S_sigma_total, S_expected_total] = ... + test_psd_energy_prepare_data(win_type, detrend_order, plist); + + stest = true; + + catch err + disp(err.message) + stest = false; + end + % </SyntaxCode> + + % <AlgoDescription> + % + % 1) Evaluate the mean and standard deviation of the Checks on individual PSDs: + % 2) Checks on individual PSDs: mean and standard deviation of the PSD points + % 3) Evaluate the expected value, estimated from the std of the + % individual segments + % 4) Compares with the mean performed on the individual segments + % 5) Checks on averaged PSDs: mean and standard deviation of all the PSD points + % 6) Compares the grand-mean with the estimated white noise level + + % </AlgoDescription> + + % <AlgoCode> + + if stest + atest = algo_test_psd_energy(ap, S_ap, S_expected_total, plist); + else + atest = false; + end + + % </AlgoCode> + + % Return a result structure + result = utp_prepare_result(atest, stest, dbstack, mfilename); + end % END UTP_25 + + %% UTP_26 + + % <TestDescription> + % + % Tests "conservation of energy": + % 1) white noise produced from normal pdf, with: + % a given mean value and sigma (distribution's 1st and 2nd order) + % 2) Calculate the expected level of noise from sample statistics + % 3) Calculates the PSD of the individual parts, with: + % Hanning window and linear detrend + % 4) Evaluate the mean and standard deviation of the Checks on individual PSDs: + % 5) Checks on individual PSDs: mean and standard deviation of the PSD points + % 6) Evaluate the expected value, estimated from the std of the + % individual segments + % 7) Compares with the mean performed on the individual segments + % 8) Checks on averaged PSDs: mean and standard deviation of all the PSD points + % 9) Compares the grand-mean with the estimated white noise level + + % </TestDescription> + function result = utp_26 + + % <SyntaxDescription> + % + % 1) Split the reference data into different segments + % 2) Calculates the PSD of the individual parts + % + % </SyntaxDescription> + + % <SyntaxCode> + try + + % Calculate the expected level of noise from sample statistics + + % Evaluate the PSDs on the parts, employing: + % - Hanning window + % - linear detrend + win_type = 'Hanning'; + detrend_order = 1; + + [S_ap, S_sigma_total, S_expected_total] = ... + test_psd_energy_prepare_data(win_type, detrend_order, plist); + + stest = true; + + catch err + disp(err.message) + stest = false; + end + % </SyntaxCode> + + % <AlgoDescription> + % + % 1) Evaluate the mean and standard deviation of the Checks on individual PSDs: + % 2) Checks on individual PSDs: mean and standard deviation of the PSD points + % 3) Evaluate the expected value, estimated from the std of the + % individual segments + % 4) Compares with the mean performed on the individual segments + % 5) Checks on averaged PSDs: mean and standard deviation of all the PSD points + % 6) Compares the grand-mean with the estimated white noise level + + % </AlgoDescription> + + % <AlgoCode> + + if stest + atest = algo_test_psd_energy(ap, S_ap, S_expected_total, plist); + else + atest = false; + end + + % </AlgoCode> + + % Return a result structure + result = utp_prepare_result(atest, stest, dbstack, mfilename); + end % END UTP_26 + + %% UTP_27 + + % <TestDescription> + % + % Tests "conservation of energy": + % 1) white noise produced from normal pdf, with: + % a given mean value and sigma (distribution's 1st and 2nd order) + % 2) Calculate the expected level of noise from sample statistics + % 3) Calculates the PSD of the individual parts, with: + % Hamming window and no detrend + % 4) Evaluate the mean and standard deviation of the Checks on individual PSDs: + % 5) Checks on individual PSDs: mean and standard deviation of the PSD points + % 6) Evaluate the expected value, estimated from the std of the + % individual segments + % 7) Compares with the mean performed on the individual segments + % 8) Checks on averaged PSDs: mean and standard deviation of all the PSD points + % 9) Compares the grand-mean with the estimated white noise level + + % </TestDescription> + function result = utp_27 + + % <SyntaxDescription> + % + % 1) Split the reference data into different segments + % 2) Calculates the PSD of the individual parts + % + % </SyntaxDescription> + + % <SyntaxCode> + try + + % Calculate the expected level of noise from sample statistics + + % Evaluate the PSDs on the parts, employing: + % - Hamming window + % - no detrend + win_type = 'Hamming'; + detrend_order = -1; + + [S_ap, S_sigma_total, S_expected_total] = ... + test_psd_energy_prepare_data(win_type, detrend_order, plist); + + stest = true; + + catch err + disp(err.message) + stest = false; + end + % </SyntaxCode> + + % <AlgoDescription> + % + % 1) Evaluate the mean and standard deviation of the Checks on individual PSDs: + % 2) Checks on individual PSDs: mean and standard deviation of the PSD points + % 3) Evaluate the expected value, estimated from the std of the + % individual segments + % 4) Compares with the mean performed on the individual segments + % 5) Checks on averaged PSDs: mean and standard deviation of all the PSD points + % 6) Compares the grand-mean with the estimated white noise level + + % </AlgoDescription> + + % <AlgoCode> + + if stest + atest = algo_test_psd_energy(ap, S_ap, S_expected_total, plist); + else + atest = false; + end + + % </AlgoCode> + + % Return a result structure + result = utp_prepare_result(atest, stest, dbstack, mfilename); + end % END UTP_27 + + + %% UTP_28 + + % <TestDescription> + % + % Tests "conservation of energy": + % 1) white noise produced from normal pdf, with: + % a given mean value and sigma (distribution's 1st and 2nd order) + % 2) Calculate the expected level of noise from sample statistics + % 3) Calculates the PSD of the individual parts, with: + % Hamming window and mean detrend + % 4) Evaluate the mean and standard deviation of the Checks on individual PSDs: + % 5) Checks on individual PSDs: mean and standard deviation of the PSD points + % 6) Evaluate the expected value, estimated from the std of the + % individual segments + % 7) Compares with the mean performed on the individual segments + % 8) Checks on averaged PSDs: mean and standard deviation of all the PSD points + % 9) Compares the grand-mean with the estimated white noise level + + % </TestDescription> + function result = utp_28 + + % <SyntaxDescription> + % + % 1) Split the reference data into different segments + % 2) Calculates the PSD of the individual parts + % + % </SyntaxDescription> + + % <SyntaxCode> + try + + % Calculate the expected level of noise from sample statistics + + % Evaluate the PSDs on the parts, employing: + % - Hamming window + % - mean detrend + win_type = 'Hanning'; + detrend_order = 0; + + [S_ap, S_sigma_total, S_expected_total] = ... + test_psd_energy_prepare_data(win_type, detrend_order, plist); + + stest = true; + + catch err + disp(err.message) + stest = false; + end + % </SyntaxCode> + + % <AlgoDescription> + % + % 1) Evaluate the mean and standard deviation of the Checks on individual PSDs: + % 2) Checks on individual PSDs: mean and standard deviation of the PSD points + % 3) Evaluate the expected value, estimated from the std of the + % individual segments + % 4) Compares with the mean performed on the individual segments + % 5) Checks on averaged PSDs: mean and standard deviation of all the PSD points + % 6) Compares the grand-mean with the estimated white noise level + + % </AlgoDescription> + + % <AlgoCode> + + if stest + atest = algo_test_psd_energy(ap, S_ap, S_expected_total, plist); + else + atest = false; + end + + % </AlgoCode> + + % Return a result structure + result = utp_prepare_result(atest, stest, dbstack, mfilename); + end % END UTP_28 + + %% UTP_29 + + % <TestDescription> + % + % Tests "conservation of energy": + % 1) white noise produced from normal pdf, with: + % a given mean value and sigma (distribution's 1st and 2nd order) + % 2) Calculate the expected level of noise from sample statistics + % 3) Calculates the PSD of the individual parts, with: + % Hamming window and linear detrend + % 4) Evaluate the mean and standard deviation of the Checks on individual PSDs: + % 5) Checks on individual PSDs: mean and standard deviation of the PSD points + % 6) Evaluate the expected value, estimated from the std of the + % individual segments + % 7) Compares with the mean performed on the individual segments + % 8) Checks on averaged PSDs: mean and standard deviation of all the PSD points + % 9) Compares the grand-mean with the estimated white noise level + + % </TestDescription> + function result = utp_29 + + % <SyntaxDescription> + % + % 1) Split the reference data into different segments + % 2) Calculates the PSD of the individual parts + % + % </SyntaxDescription> + + % <SyntaxCode> + try + + % Calculate the expected level of noise from sample statistics + + % Evaluate the PSDs on the parts, employing: + % - Hamming window + % - linear detrend + win_type = 'Hamming'; + detrend_order = 1; + + [S_ap, S_sigma_total, S_expected_total] = ... + test_psd_energy_prepare_data(win_type, detrend_order, plist); + + stest = true; + + catch err + disp(err.message) + stest = false; + end + % </SyntaxCode> + + % <AlgoDescription> + % + % 1) Evaluate the mean and standard deviation of the Checks on individual PSDs: + % 2) Checks on individual PSDs: mean and standard deviation of the PSD points + % 3) Evaluate the expected value, estimated from the std of the + % individual segments + % 4) Compares with the mean performed on the individual segments + % 5) Checks on averaged PSDs: mean and standard deviation of all the PSD points + % 6) Compares the grand-mean with the estimated white noise level + + % </AlgoDescription> + + % <AlgoCode> + + if stest + atest = algo_test_psd_energy(ap, S_ap, S_expected_total, plist); + else + atest = false; + end + + % </AlgoCode> + + % Return a result structure + result = utp_prepare_result(atest, stest, dbstack, mfilename); + end % END UTP_29 + + + %% UTP_30 + + % <TestDescription> + % + % Tests "conservation of energy": + % 1) white noise produced from normal pdf, with: + % a given mean value and sigma (distribution's 1st and 2nd order) + % 2) Calculate the expected level of noise from sample statistics + % 3) Calculates the PSD of the individual parts, with: + % BH92 window and no detrend + % 4) Evaluate the mean and standard deviation of the Checks on individual PSDs: + % 5) Checks on individual PSDs: mean and standard deviation of the PSD points + % 6) Evaluate the expected value, estimated from the std of the + % individual segments + % 7) Compares with the mean performed on the individual segments + % 8) Checks on averaged PSDs: mean and standard deviation of all the PSD points + % 9) Compares the grand-mean with the estimated white noise level + + % </TestDescription> + function result = utp_30 + + % <SyntaxDescription> + % + % 1) Split the reference data into different segments + % 2) Calculates the PSD of the individual parts + % + % </SyntaxDescription> + + % <SyntaxCode> + try + + % Calculate the expected level of noise from sample statistics + + % Evaluate the PSDs on the parts, employing: + % - BH92 window + % - no detrend + win_type = 'BH92'; + detrend_order = -1; + + [S_ap, S_sigma_total, S_expected_total] = ... + test_psd_energy_prepare_data(win_type, detrend_order, plist); + + stest = true; + + catch err + disp(err.message) + stest = false; + end + % </SyntaxCode> + + % <AlgoDescription> + % + % 1) Evaluate the mean and standard deviation of the Checks on individual PSDs: + % 2) Checks on individual PSDs: mean and standard deviation of the PSD points + % 3) Evaluate the expected value, estimated from the std of the + % individual segments + % 4) Compares with the mean performed on the individual segments + % 5) Checks on averaged PSDs: mean and standard deviation of all the PSD points + % 6) Compares the grand-mean with the estimated white noise level + + % </AlgoDescription> + + % <AlgoCode> + + if stest + atest = algo_test_psd_energy(ap, S_ap, S_expected_total, plist); + else + atest = false; + end + + % </AlgoCode> + + % Return a result structure + result = utp_prepare_result(atest, stest, dbstack, mfilename); + end % END UTP_30 + + + %% UTP_31 + + % <TestDescription> + % + % Tests "conservation of energy": + % 1) white noise produced from normal pdf, with: + % a given mean value and sigma (distribution's 1st and 2nd order) + % 2) Calculate the expected level of noise from sample statistics + % 3) Calculates the PSD of the individual parts, with: + % BH92 window and mean detrend + % 4) Evaluate the mean and standard deviation of the Checks on individual PSDs: + % 5) Checks on individual PSDs: mean and standard deviation of the PSD points + % 6) Evaluate the expected value, estimated from the std of the + % individual segments + % 7) Compares with the mean performed on the individual segments + % 8) Checks on averaged PSDs: mean and standard deviation of all the PSD points + % 9) Compares the grand-mean with the estimated white noise level + + % </TestDescription> + function result = utp_31 + + % <SyntaxDescription> + % + % 1) Split the reference data into different segments + % 2) Calculates the PSD of the individual parts + % + % </SyntaxDescription> + + % <SyntaxCode> + try + + % Calculate the expected level of noise from sample statistics + + % Evaluate the PSDs on the parts, employing: + % - BH92 window + % - mean detrend + win_type = 'BH92'; + detrend_order = 0; + + [S_ap, S_sigma_total, S_expected_total] = ... + test_psd_energy_prepare_data(win_type, detrend_order, plist); + + stest = true; + + catch err + disp(err.message) + stest = false; + end + % </SyntaxCode> + + % <AlgoDescription> + % + % 1) Evaluate the mean and standard deviation of the Checks on individual PSDs: + % 2) Checks on individual PSDs: mean and standard deviation of the PSD points + % 3) Evaluate the expected value, estimated from the std of the + % individual segments + % 4) Compares with the mean performed on the individual segments + % 5) Checks on averaged PSDs: mean and standard deviation of all the PSD points + % 6) Compares the grand-mean with the estimated white noise level + + % </AlgoDescription> + + % <AlgoCode> + + if stest + atest = algo_test_psd_energy(ap, S_ap, S_expected_total, plist); + else + atest = false; + end + + % </AlgoCode> + + % Return a result structure + result = utp_prepare_result(atest, stest, dbstack, mfilename); + end % END UTP_31 + + %% UTP_32 + + % <TestDescription> + % + % Tests "conservation of energy": + % 1) white noise produced from normal pdf, with: + % a given mean value and sigma (distribution's 1st and 2nd order) + % 2) Calculate the expected level of noise from sample statistics + % 3) Calculates the PSD of the individual parts, with: + % BH92 window and linear detrend + % 4) Evaluate the mean and standard deviation of the Checks on individual PSDs: + % 5) Checks on individual PSDs: mean and standard deviation of the PSD points + % 6) Evaluate the expected value, estimated from the std of the + % individual segments + % 7) Compares with the mean performed on the individual segments + % 8) Checks on averaged PSDs: mean and standard deviation of all the PSD points + % 9) Compares the grand-mean with the estimated white noise level + + % </TestDescription> + function result = utp_32 + + % <SyntaxDescription> + % + % 1) Split the reference data into different segments + % 2) Calculates the PSD of the individual parts + % + % </SyntaxDescription> + + % <SyntaxCode> + try + + % Calculate the expected level of noise from sample statistics + + % Evaluate the PSDs on the parts, employing: + % - BH92 window + % - linear detrend + win_type = 'BH92'; + detrend_order = 1; + + [S_ap, S_sigma_total, S_expected_total] = ... + test_psd_energy_prepare_data(win_type, detrend_order, plist); + + stest = true; + + catch err + disp(err.message) + stest = false; + end + % </SyntaxCode> + + % <AlgoDescription> + % + % 1) Evaluate the mean and standard deviation of the Checks on individual PSDs: + % 2) Checks on individual PSDs: mean and standard deviation of the PSD points + % 3) Evaluate the expected value, estimated from the std of the + % individual segments + % 4) Compares with the mean performed on the individual segments + % 5) Checks on averaged PSDs: mean and standard deviation of all the PSD points + % 6) Compares the grand-mean with the estimated white noise level + + % </AlgoDescription> + + % <AlgoCode> + + if stest + atest = algo_test_psd_energy(ap, S_ap, S_expected_total, plist); + else + atest = false; + end + + % </AlgoCode> + + % Return a result structure + result = utp_prepare_result(atest, stest, dbstack, mfilename); + end % END UTP_32 + + %% UTP_33 + + % <TestDescription> + % + % Tests "conservation of energy": + % 1) white noise produced from normal pdf, with: + % a given mean value and sigma (distribution's 1st and 2nd order) + % 2) Calculate the expected level of noise from sample statistics + % 3) Calculates the PSD of the individual parts, with: + % Kaiser200 window and no detrend + % 4) Evaluate the mean and standard deviation of the Checks on individual PSDs: + % 5) Checks on individual PSDs: mean and standard deviation of the PSD points + % 6) Evaluate the expected value, estimated from the std of the + % individual segments + % 7) Compares with the mean performed on the individual segments + % 8) Checks on averaged PSDs: mean and standard deviation of all the PSD points + % 9) Compares the grand-mean with the estimated white noise level + + % </TestDescription> + function result = utp_33 + + % <SyntaxDescription> + % + % 1) Split the reference data into different segments + % 2) Calculates the PSD of the individual parts + % + % </SyntaxDescription> + + % <SyntaxCode> + try + + % Calculate the expected level of noise from sample statistics + + % Evaluate the PSDs on the parts, employing: + % - Kaiser200 window + % - no detrend + win_type = 'Kaiser'; + psll = 200; + detrend_order = -1; + + [S_ap, S_sigma_total, S_expected_total] = ... + test_psd_energy_prepare_data(win_type, detrend_order, plist('psll', psll)); + + stest = true; + + catch err + disp(err.message) + stest = false; + end + % </SyntaxCode> + + % <AlgoDescription> + % + % 1) Evaluate the mean and standard deviation of the Checks on individual PSDs: + % 2) Checks on individual PSDs: mean and standard deviation of the PSD points + % 3) Evaluate the expected value, estimated from the std of the + % individual segments + % 4) Compares with the mean performed on the individual segments + % 5) Checks on averaged PSDs: mean and standard deviation of all the PSD points + % 6) Compares the grand-mean with the estimated white noise level + + % </AlgoDescription> + + % <AlgoCode> + + if stest + atest = algo_test_psd_energy(ap, S_ap, S_expected_total, plist); + else + atest = false; + end + + % </AlgoCode> + + % Return a result structure + result = utp_prepare_result(atest, stest, dbstack, mfilename); + end % END UTP_33 + + + %% UTP_34 + + % <TestDescription> + % + % Tests "conservation of energy": + % 1) white noise produced from normal pdf, with: + % a given mean value and sigma (distribution's 1st and 2nd order) + % 2) Calculate the expected level of noise from sample statistics + % 3) Calculates the PSD of the individual parts, with: + % Kaiser200 window and mean detrend + % 4) Evaluate the mean and standard deviation of the Checks on individual PSDs: + % 5) Checks on individual PSDs: mean and standard deviation of the PSD points + % 6) Evaluate the expected value, estimated from the std of the + % individual segments + % 7) Compares with the mean performed on the individual segments + % 8) Checks on averaged PSDs: mean and standard deviation of all the PSD points + % 9) Compares the grand-mean with the estimated white noise level + + % </TestDescription> + function result = utp_34 + + % <SyntaxDescription> + % + % 1) Split the reference data into different segments + % 2) Calculates the PSD of the individual parts + % + % </SyntaxDescription> + + % <SyntaxCode> + try + + % Calculate the expected level of noise from sample statistics + + % Evaluate the PSDs on the parts, employing: + % - Kaiser200 window + % - mean detrend + win_type = 'Kaiser'; + psll = 200; + detrend_order = 0; + + [S_ap, S_sigma_total, S_expected_total] = ... + test_psd_energy_prepare_data(win_type, detrend_order, plist('psll', psll)); + + stest = true; + + catch err + disp(err.message) + stest = false; + end + % </SyntaxCode> + + % <AlgoDescription> + % + % 1) Evaluate the mean and standard deviation of the Checks on individual PSDs: + % 2) Checks on individual PSDs: mean and standard deviation of the PSD points + % 3) Evaluate the expected value, estimated from the std of the + % individual segments + % 4) Compares with the mean performed on the individual segments + % 5) Checks on averaged PSDs: mean and standard deviation of all the PSD points + % 6) Compares the grand-mean with the estimated white noise level + + % </AlgoDescription> + + % <AlgoCode> + + if stest + atest = algo_test_psd_energy(ap, S_ap, S_expected_total, plist); + else + atest = false; + end + + % </AlgoCode> + + % Return a result structure + result = utp_prepare_result(atest, stest, dbstack, mfilename); + end % END UTP_34 + + %% UTP_35 + + % <TestDescription> + % + % Tests "conservation of energy": + % 1) white noise produced from normal pdf, with: + % a given mean value and sigma (distribution's 1st and 2nd order) + % 2) Calculate the expected level of noise from sample statistics + % 3) Calculates the PSD of the individual parts, with: + % Kaiser200 window and linear detrend + % 4) Evaluate the mean and standard deviation of the Checks on individual PSDs: + % 5) Checks on individual PSDs: mean and standard deviation of the PSD points + % 6) Evaluate the expected value, estimated from the std of the + % individual segments + % 7) Compares with the mean performed on the individual segments + % 8) Checks on averaged PSDs: mean and standard deviation of all the PSD points + % 9) Compares the grand-mean with the estimated white noise level + + % </TestDescription> + function result = utp_35 + + % <SyntaxDescription> + % + % 1) Split the reference data into different segments + % 2) Calculates the PSD of the individual parts + % + % </SyntaxDescription> + + % <SyntaxCode> + try + + % Calculate the expected level of noise from sample statistics + + % Evaluate the PSDs on the parts, employing: + % - Kaiser200 window + % - linear detrend + win_type = 'Kaiser'; + psll = 200; + detrend_order = 1; + + [S_ap, S_sigma_total, S_expected_total] = ... + test_psd_energy_prepare_data(win_type, detrend_order, plist('psll', psll)); + + stest = true; + + catch err + disp(err.message) + stest = false; + end + % </SyntaxCode> + + % <AlgoDescription> + % + % 1) Evaluate the mean and standard deviation of the Checks on individual PSDs: + % 2) Checks on individual PSDs: mean and standard deviation of the PSD points + % 3) Evaluate the expected value, estimated from the std of the + % individual segments + % 4) Compares with the mean performed on the individual segments + % 5) Checks on averaged PSDs: mean and standard deviation of all the PSD points + % 6) Compares the grand-mean with the estimated white noise level + + % </AlgoDescription> + + % <AlgoCode> + + if stest + atest = algo_test_psd_energy(ap, S_ap, S_expected_total, plist); + else + atest = false; + end + + % </AlgoCode> + + % Return a result structure + result = utp_prepare_result(atest, stest, dbstack, mfilename); + end % END UTP_35 + + %% UTP_38 + + % <TestDescription> + % + % Tests "conservation of energy": + % 1) white noise produced from normal pdf, with: + % a given mean value and sigma (distribution's 1st and 2nd order) + % 2) evaluate the sample mean value m and standard deviation s + % 3) add a given trend of order n + % 4) psd of the noise, with proper detrending + % 5) compares the sqrt(sum(S * df)) with the standard deviation s + % + + % </TestDescription> + function result = utp_38 + + % <SyntaxDescription> + % + % 1) Prepare the test tsdata: + % white noise from normal distribution + offset + % 2) Calculate the statistical parameters + % 3) Add a trend + % 4) Estimate the psd + % + % </SyntaxDescription> + + % <SyntaxCode> + try + fs = 10; + nsecs = 3600; + sigma_distr = 1; + trend_0 = 0; + trend_1 = 2e-6; + trend_2 = 5e-10; + + % White noise + type = 'Normal'; + a_n = ao(plist('waveform', 'noise', ... + 'type', type, 'fs', fs, 'nsecs', nsecs, 'sigma', sigma_distr)); + + % Drift signal + a_d = ao(plist('tsfcn', [num2str(trend_0) '*t.^0 + ' num2str(trend_1) ' *t + ' num2str(trend_2) ' *t.^2'], ... + 'fs', fs, 'nsecs', nsecs)); + + % Total signal + a = a_n + a_d; + + % Estimate the mean value and the sigma of the white noise time-series data + sigma_sample = std(a_n.y, 1); + + % Evaluate the psd of the white noise time-series data + % Parameters are crucial for the estimate to be correct! + win = 'Rectangular'; + olap = 0; + detrend = 0; + n_pts = -1; + scale = 'PSD'; + + S_n = a_n.psd(plist('Win', win, 'olap', olap, ... + 'Nfft', n_pts, 'order', detrend, 'scale', scale)); + + % Evaluate the psd of the "drifting" time-series data + % Parameters are crucial for the estimate to be correct! + win = 'Rectangular'; + olap = 0; + detrend = 2; + n_pts = -1; + scale = 'PSD'; + + S = a.psd(plist('Win', win, 'olap', olap, ... + 'Nfft', n_pts, 'order', detrend, 'scale', scale)); + stest = true; + + catch err + disp(err.message) + stest = false; + end + % </SyntaxCode> + + % <AlgoDescription> + % + % 1) Check that calculated psd energy equals the rms content of the tsdata, estimated by the std of the sample + % + % </AlgoDescription> + + % <AlgoCode> + atest = true; + TOL = 1e-3; + + if stest + % Integrals of the spectra + sigma_psd = sqrt(sum(S.y * S.x(2))); + sigma_psd_n = sqrt(sum(S_n.y * S_n.x(2))); + + if abs(sigma_psd - sigma_sample) / mean([sigma_psd sigma_sample]) >= TOL || ... + abs(sigma_psd_n - sigma_sample) / mean([sigma_psd_n sigma_sample]) >= TOL + atest = false; + end + else + atest = false; + end + % </AlgoCode> + + % Return a result structure + result = utp_prepare_result(atest, stest, dbstack, mfilename); + end % END UTP_38 + + + %% UTP_39 + + % <TestDescription> + % + % Tests "conservation of energy": + % 1) white noise produced from uniform pdf, with: + % a given mean value and sigma (distribution's 1st and 2nd order) + % 2) evaluate the sample mean value m and standard deviation s + % 3) add a given trend of order n + % 4) psd of the noise, with proper detrending + % 5) compares the sqrt(sum(S * df)) with the standard deviation s + % + + % </TestDescription> + function result = utp_39 + + % <SyntaxDescription> + % + % 1) Prepare the test tsdata: + % white noise from uniform distribution + offset + % 2) Calculate the statistical parameters + % 3) Add a trend + % 4) Estimate the psd + % + % </SyntaxDescription> + + % <SyntaxCode> + try + % Build time-series test data + fs = 1; + nsecs = 86400; + sigma_distr = 1e-9; + trend_0 = 3e-7; + trend_1 = 1e-7; + trend_2 = 2e-14; + + % White noise + type = 'Uniform'; + a_n = ao(plist('waveform', 'noise', ... + 'type', type, 'fs', fs, 'nsecs', nsecs, 'sigma', sigma_distr)); + + % Drift signal + a_d = ao(plist('tsfcn', [num2str(trend_0) '*t.^0 + ' num2str(trend_1) ' *t + ' num2str(trend_2) ' *t.^2'], ... + 'fs', fs, 'nsecs', nsecs)); + + % Total signal + a = a_n + a_d; + + % Estimate the mean value and the sigma of the white noise time-series data + sigma_sample = std(a_n.y, 1); + + % Evaluate the psd of the white noise time-series data + % Parameters are crucial for the estimate to be correct! + win = 'Rectangular'; + olap = 0; + detrend = 0; + n_pts = -1; + scale = 'PSD'; + + S_n = a_n.psd(plist('Win', win, 'olap', olap, ... + 'Nfft', n_pts, 'order', detrend, 'scale', scale)); + + % Evaluate the psd of the "drifting" time-series data + % Parameters are crucial for the estimate to be correct! + win = 'Rectangular'; + olap = 0; + detrend = 2; + n_pts = -1; + scale = 'PSD'; + + S = a.psd(plist('Win', win, 'olap', olap, ... + 'Nfft', n_pts, 'order', detrend, 'scale', scale)); + stest = true; + + catch err + disp(err.message) + stest = false; + end + % </SyntaxCode> + + % <AlgoDescription> + % + % 1) Check that calculated psd energy equals the rms content of the tsdata, estimated by the std of the sample + % + % </AlgoDescription> + + % <AlgoCode> + atest = true; + TOL = 1e-3; + + if stest + % Integrals of the spectra + sigma_psd = sqrt(sum(S.y * S.x(2))); + sigma_psd_n = sqrt(sum(S_n.y * S_n.x(2))); + + if abs(sigma_psd - sigma_sample) / mean([sigma_psd sigma_sample]) >= TOL || ... + abs(sigma_psd_n - sigma_sample) / mean([sigma_psd_n sigma_sample]) >= TOL + atest = false; + end + else + atest = false; + end + % </AlgoCode> + + % Return a result structure + result = utp_prepare_result(atest, stest, dbstack, mfilename); + end % END UTP_39 + + %% UTP_40 + + % <TestDescription> + % + % Tests "conservation of energy": + % 1) white noise produced from normal pdf, with: + % a given mean value and sigma (distribution's 1st and 2nd order) + % 2) evaluate the sample mean value m and standard deviation s + % 3) add a given trend of order n + % 4) psd of the noise, with proper detrending + % 5) compares the sqrt(sum(S * df)) with the standard deviation s + % + + % </TestDescription> + function result = utp_40 + + % <SyntaxDescription> + % + % 1) Prepare the test tsdata: + % white noise from normal distribution + offset + % 2) Calculate the statistical parameters + % 3) Add a trend + % 4) Estimate the psd + % + % </SyntaxDescription> + + % <SyntaxCode> + try + % Build time-series test data + + fs = 100; + nsecs = 100; + sigma_distr = 1e-12; + trend_0 = -5e-12; + trend_1 = 4e-13; + trend_2 = 1.17e-14; + + % White noise + type = 'Normal'; + a_n = ao(plist('waveform', 'noise', ... + 'type', type, 'fs', fs, 'nsecs', nsecs, 'sigma', sigma_distr)); + + % Drift signal + a_d = ao(plist('tsfcn', [num2str(trend_0) '*t.^0 + ' num2str(trend_1) ' *t + ' num2str(trend_2) ' *t.^2'], ... + 'fs', fs, 'nsecs', nsecs)); + + % Total signal + a = a_n + a_d; + + % Estimate the mean value and the sigma of the white noise time-series data + sigma_sample = std(a_n.y, 1); + + % Evaluate the psd of the white noise time-series data + % Parameters are crucial for the estimate to be correct! + win = 'Rectangular'; + olap = 0; + detrend = 0; + n_pts = -1; + scale = 'PSD'; + + S_n = a_n.psd(plist('Win', win, 'olap', olap, ... + 'Nfft', n_pts, 'order', detrend, 'scale', scale)); + + % Evaluate the psd of the "drifting" time-series data + % Parameters are crucial for the estimate to be correct! + win = 'Rectangular'; + olap = 0; + detrend = 2; + n_pts = -1; + scale = 'PSD'; + + S = a.psd(plist('Win', win, 'olap', olap, ... + 'Nfft', n_pts, 'order', detrend, 'scale', scale)); + stest = true; + + catch err + disp(err.message) + stest = false; + end + % </SyntaxCode> + + % <AlgoDescription> + % + % 1) Check that calculated psd energy equals the rms content of the tsdata, estimated by the std of the sample + % + % </AlgoDescription> + + % <AlgoCode> + atest = true; + TOL = 1e-3; + + if stest + % Integrals of the spectra + sigma_psd = sqrt(sum(S.y * S.x(2))); + sigma_psd_n = sqrt(sum(S_n.y * S_n.x(2))); + + if abs(sigma_psd - sigma_sample) / mean([sigma_psd sigma_sample]) >= TOL || ... + abs(sigma_psd_n - sigma_sample) / mean([sigma_psd_n sigma_sample]) >= TOL + atest = false; + end + else + atest = false; + end + % </AlgoCode> + + % Return a result structure + result = utp_prepare_result(atest, stest, dbstack, mfilename); + end % END UTP_40 + + + + %% UTP_41 + + % <TestDescription> + % + % Tests the effect of windowing: + % 1) white noise produced from normal pdf, with: + % a given mean value and sigma (distribution's 1st and 2nd order) + % 2) psd of the noise, without detrending, Rectangular window + % 3) Apply the detrending and the window manually + % 4) psd of the noise, without detrending, Rectangular window + % 5) compares the to psds + % + + % </TestDescription> + function result = utp_41 + + % <SyntaxDescription> + % + % 1) Prepare the test tsdata: + % white noise from normal distribution + offset + % 2) Calculate the statistical parameters + % 3) Estimate the psd without detrending, Rectangular window + % 4) Manually apply window to the data + % 5) Estimate the psd without detrending, Rectangular window + % + % </SyntaxDescription> + + % <SyntaxCode> + try + + noise_type = 'Normal'; + win_type = 'Rectangular'; + scale = 'PSD'; + + [a, S_name, S_obj, S_man] = prepare_analyze_noise_win(win_type, noise_type, scale, ... + plist('win_test', true)); + + stest = true; + + catch err + disp(err.message) + stest = false; + end + % </SyntaxCode> + + % <AlgoDescription> + % + % 1) Check that calculated psds are identical within a part in 10^12 + % + % </AlgoDescription> + + % <AlgoCode> + + TOL = 1e-12; + + if stest + atest = algo_test_psd_win(S_name, S_obj, S_man, plist('TOL', TOL)); + else + atest = false; + end + + % </AlgoCode> + + % Return a result structure + result = utp_prepare_result(atest, stest, dbstack, mfilename); + end % END UTP_41 + + %% UTP_42 + + % <TestDescription> + % + % Tests the effect of windowing: + % 1) white noise produced from normal pdf, with: + % a given mean value and sigma (distribution's 1st and 2nd order) + % 2) psd of the noise, without detrending, BH92 window + % 3) Apply the detrending and the window manually + % 4) psd of the noise, without detrending, Rectangular window + % 5) compares the to psds + % + + % </TestDescription> + function result = utp_42 + + % <SyntaxDescription> + % + % 1) Prepare the test tsdata: + % white noise from normal distribution + offset + % 2) Calculate the statistical parameters + % 3) Estimate the psd without detrending, BH92 window + % 4) Manually apply window to the data + % 5) Estimate the psd without detrending, Rectangular window + % + % </SyntaxDescription> + + % <SyntaxCode> + try + + noise_type = 'Normal'; + win_type = 'BH92'; + scale = 'PSD'; + + [a, S_name, S_obj, S_man] = prepare_analyze_noise_win(win_type, noise_type, scale, ... + plist('win_test', true)); + + stest = true; + + catch err + disp(err.message) + stest = false; + end + % </SyntaxCode> + + % <AlgoDescription> + % + % 1) Check that calculated psds are identical within a part in 10^12 + % + % </AlgoDescription> + + % <AlgoCode> + + TOL = 1e-12; + + if stest + atest = algo_test_psd_win(S_name, S_obj, S_man, plist('TOL', TOL)); + else + atest = false; + end + + % </AlgoCode> + + % Return a result structure + result = utp_prepare_result(atest, stest, dbstack, mfilename); + end % END UTP_42 + + + %% UTP_43 + + % <TestDescription> + % + % Tests the effect of windowing: + % 1) white noise produced from normal pdf, with: + % a given mean value and sigma (distribution's 1st and 2nd order) + % 2) psd of the noise, without detrending, Hamming window + % 3) Apply the detrending and the window manually + % 4) psd of the noise, without detrending, Rectangular window + % 5) compares the to psds + % + + % </TestDescription> + function result = utp_43 + + % <SyntaxDescription> + % + % 1) Prepare the test tsdata: + % white noise from normal distribution + offset + % 2) Calculate the statistical parameters + % 3) Estimate the psd without detrending, Hamming window + % 4) Manually apply window to the data + % 5) Estimate the psd without detrending, Rectangular window + % + % </SyntaxDescription> + + % <SyntaxCode> + try + + noise_type = 'Normal'; + win_type = 'Hamming'; + scale = 'PSD'; + + [a, S_name, S_obj, S_man] = prepare_analyze_noise_win(win_type, noise_type, scale, ... + plist('win_test', true)); + + stest = true; + + catch err + disp(err.message) + stest = false; + end + % </SyntaxCode> + + % <AlgoDescription> + % + % 1) Check that calculated psds are identical within a part in 10^12 + % + % </AlgoDescription> + + % <AlgoCode> + + TOL = 1e-12; + + if stest + atest = algo_test_psd_win(S_name, S_obj, S_man, plist('TOL', TOL)); + else + atest = false; + end + + % </AlgoCode> + + % Return a result structure + result = utp_prepare_result(atest, stest, dbstack, mfilename); + end % END UTP_43 + + %% UTP_44 + + % <TestDescription> + % + % Tests the effect of windowing: + % 1) white noise produced from normal pdf, with: + % a given mean value and sigma (distribution's 1st and 2nd order) + % 2) psd of the noise, without detrending, Hanning window + % 3) Apply the detrending and the window manually + % 4) psd of the noise, without detrending, Rectangular window + % 5) compares the to psds + % + + % </TestDescription> + function result = utp_44 + + % <SyntaxDescription> + % + % 1) Prepare the test tsdata: + % white noise from normal distribution + offset + % 2) Calculate the statistical parameters + % 3) Estimate the psd without detrending, Hanning window + % 4) Manually apply window to the data + % 5) Estimate the psd without detrending, Rectangular window + % + % </SyntaxDescription> + + % <SyntaxCode> + msg = ''; + try + + noise_type = 'Normal'; + win_type = 'Hanning'; + scale = 'PSD'; + + [a, S_name, S_obj, S_man] = prepare_analyze_noise_win(win_type, noise_type, scale, ... + plist('win_test', true)); + + stest = true; + + catch err + disp(err.message) + msg = err.message; + stest = false; + end + % </SyntaxCode> + + % <AlgoDescription> + % + % 1) Check that calculated psds are identical within a part in 10^12 + % + % </AlgoDescription> + + % <AlgoCode> + + TOL = 1e-12; + + if stest + [atest, msg] = algo_test_psd_win(S_name, S_obj, S_man, plist('TOL', TOL)); + else + atest = false; + end + + % </AlgoCode> + + % Return a result structure + result = utp_prepare_result(atest, stest, dbstack, mfilename, msg); + end % END UTP_44 + + %% UTP_45 + + % <TestDescription> + % + % Tests the effect of windowing: + % 1) white noise produced from normal pdf, with: + % a given mean value and sigma (distribution's 1st and 2nd order) + % 2) psd of the noise, without detrending, Bartlett window + % 3) Apply the detrending and the window manually + % 4) psd of the noise, without detrending, Rectangular window + % 5) compares the to psds + % + + % </TestDescription> + function result = utp_45 + + % <SyntaxDescription> + % + % 1) Prepare the test tsdata: + % white noise from normal distribution + offset + % 2) Calculate the statistical parameters + % 3) Estimate the psd without detrending, Bartlett window + % 4) Manually apply window to the data + % 5) Estimate the psd without detrending, Rectangular window + % + % </SyntaxDescription> + + % <SyntaxCode> + try + + noise_type = 'Normal'; + win_type = 'Bartlett'; + scale = 'PSD'; + + [a, S_name, S_obj, S_man] = prepare_analyze_noise_win(win_type, noise_type, scale, ... + plist('win_test', true)); + + stest = true; + + catch err + disp(err.message) + stest = false; + end + % </SyntaxCode> + + % <AlgoDescription> + % + % 1) Check that calculated psds are identical within a part in 10^12 + % + % </AlgoDescription> + + % <AlgoCode> + + TOL = 1e-12; + + if stest + atest = algo_test_psd_win(S_name, S_obj, S_man, plist('TOL', TOL)); + else + atest = false; + end + + % </AlgoCode> + + % Return a result structure + result = utp_prepare_result(atest, stest, dbstack, mfilename); + end % END UTP_45 + + %% UTP_46 + + % <TestDescription> + % + % Tests the effect of windowing: + % 1) white noise produced from normal pdf, with: + % a given mean value and sigma (distribution's 1st and 2nd order) + % 2) psd of the noise, without detrending, Nuttall3 window + % 3) Apply the detrending and the window manually + % 4) psd of the noise, without detrending, Rectangular window + % 5) compares the to psds + % + + % </TestDescription> + function result = utp_46 + + % <SyntaxDescription> + % + % 1) Prepare the test tsdata: + % white noise from normal distribution + offset + % 2) Calculate the statistical parameters + % 3) Estimate the psd without detrending, Nuttall3 window + % 4) Manually apply window to the data + % 5) Estimate the psd without detrending, Rectangular window + % + % </SyntaxDescription> + + % <SyntaxCode> + msg = ''; + try + + noise_type = 'Normal'; + win_type = 'Nuttall3'; + scale = 'PSD'; + + [a, S_name, S_obj, S_man] = prepare_analyze_noise_win(win_type, noise_type, scale, ... + plist('win_test', true)); + + stest = true; + + catch err + disp(err.message) + msg = err.message; + stest = false; + end + % </SyntaxCode> + + % <AlgoDescription> + % + % 1) Check that calculated psds are identical within a part in 10^12 + % + % </AlgoDescription> + + % <AlgoCode> + + TOL = 1e-12; + + if stest + [atest, msg] = algo_test_psd_win(S_name, S_obj, S_man, plist('TOL', TOL)); + else + atest = false; + end + + % </AlgoCode> + + % Return a result structure + result = utp_prepare_result(atest, stest, dbstack, mfilename, msg); + end % END UTP_46 + + %% UTP_47 + + % <TestDescription> + % + % Tests the effect of windowing: + % 1) white noise produced from normal pdf, with: + % a given mean value and sigma (distribution's 1st and 2nd order) + % 2) psd of the noise, without detrending, Kaiser psll = random window + % 3) Apply the detrending and the window manually + % 4) psd of the noise, without detrending, Rectangular window + % 5) compares the to psds + % + + % </TestDescription> + function result = utp_47 + + % <SyntaxDescription> + % + % 1) Prepare the test tsdata: + % white noise from normal distribution + offset + % 2) Calculate the statistical parameters + % 3) Estimate the psd without detrending, Kaiser psll = random window + % 4) Manually apply window to the data + % 5) Estimate the psd without detrending, Rectangular window + % + % </SyntaxDescription> + + % <SyntaxCode> + try + + noise_type = 'Normal'; + win_type = 'Kaiser'; + psll = utils.math.randelement([10:10:200],1); + scale = 'PSD'; + + [a, S_name, S_obj, S_man] = prepare_analyze_noise_win(win_type, noise_type, scale, ... + plist('win_test', true)); + + stest = true; + + catch err + disp(err.message) + stest = false; + end + % </SyntaxCode> + + % <AlgoDescription> + % + % 1) Check that calculated psds are identical within a part in 10^12 + % + % </AlgoDescription> + + % <AlgoCode> + + TOL = 1e-12; + + if stest + atest = algo_test_psd_win(S_name, S_obj, S_man, plist('TOL', TOL)); + else + atest = false; + end + + % </AlgoCode> + + % Return a result structure + result = utp_prepare_result(atest, stest, dbstack, mfilename); + end % END UTP_47 + + %% UTP_48 + + % <TestDescription> + % + % Tests the effect of windowing: + % 1) white noise produced from normal pdf, with: + % a given mean value and sigma (distribution's 1st and 2nd order) + % 2) psd of the noise, without detrending, Kaiser psll = default window + % 3) Apply the detrending and the window manually + % 4) psd of the noise, without detrending, Rectangular window + % 5) compares the to psds + % + + % </TestDescription> + function result = utp_48 + + % <SyntaxDescription> + % + % 1) Prepare the test tsdata: + % white noise from normal distribution + offset + % 2) Calculate the statistical parameters + % 3) Estimate the psd without detrending, Kaiser psll = default window + % 4) Manually apply window to the data + % 5) Estimate the psd without detrending, Rectangular window + % + % </SyntaxDescription> + + % <SyntaxCode> + try + + noise_type = 'Normal'; + win_type = 'Kaiser'; + scale = 'PSD'; + + [a, S_name, S_obj, S_man] = prepare_analyze_noise_win(win_type, noise_type, scale, ... + plist('win_test', true)); + + stest = true; + + catch err + disp(err.message) + stest = false; + end + % </SyntaxCode> + + % <AlgoDescription> + % + % 1) Check that calculated psds are identical within a part in 10^12 + % + % </AlgoDescription> + + % <AlgoCode> + + TOL = 1e-12; + + if stest + atest = algo_test_psd_win(S_name, S_obj, S_man, plist('TOL', TOL)); + else + atest = false; + end + + % </AlgoCode> + + % Return a result structure + result = utp_prepare_result(atest, stest, dbstack, mfilename); + end % END UTP_48 + + + %% UTP_49 + + % <TestDescription> + % + % Tests the effect of windowing: + % 1) white noise produced from normal pdf, with: + % a given mean value and sigma (distribution's 1st and 2nd order) + % 2) psd of the noise, without detrending, Nuttall4 window + % 3) Apply the detrending and the window manually + % 4) psd of the noise, without detrending, Rectangular window + % 5) compares the to psds + % + + % </TestDescription> + function result = utp_49 + + % <SyntaxDescription> + % + % 1) Prepare the test tsdata: + % white noise from normal distribution + offset + % 2) Calculate the statistical parameters + % 3) Estimate the psd without detrending, Nuttall4 window + % 4) Manually apply window to the data + % 5) Estimate the psd without detrending, Rectangular window + % + % </SyntaxDescription> + + % <SyntaxCode> + try + + noise_type = 'Normal'; + win_type = 'Nuttall4'; + scale = 'PSD'; + + [a, S_name, S_obj, S_man] = prepare_analyze_noise_win(win_type, noise_type, scale, ... + plist('win_test', true)); + + stest = true; + + catch err + disp(err.message) + stest = false; + end + % </SyntaxCode> + + % <AlgoDescription> + % + % 1) Check that calculated psds are identical within a part in 10^12 + % + % </AlgoDescription> + + % <AlgoCode> + + TOL = 1e-12; + + if stest + atest = algo_test_psd_win(S_name, S_obj, S_man, plist('TOL', TOL)); + else + atest = false; + end + + % </AlgoCode> + + % Return a result structure + result = utp_prepare_result(atest, stest, dbstack, mfilename); + end % END UTP_49 + + %% UTP_50 + + % <TestDescription> + % + % Tests the effect of windowing: + % 1) white noise produced from normal pdf, with: + % a given mean value and sigma (distribution's 1st and 2nd order) + % 2) psd of the noise, without detrending, SFT3F window + % 3) Apply the detrending and the window manually + % 4) psd of the noise, without detrending, Rectangular window + % 5) compares the to psds + % + + % </TestDescription> + function result = utp_50 + + % <SyntaxDescription> + % + % 1) Prepare the test tsdata: + % white noise from normal distribution + offset + % 2) Calculate the statistical parameters + % 3) Estimate the psd without detrending, SFT3F window + % 4) Manually apply window to the data + % 5) Estimate the psd without detrending, Rectangular window + % + % </SyntaxDescription> + + % <SyntaxCode> + try + + noise_type = 'Normal'; + win_type = 'SFT3F'; + scale = 'PSD'; + + [a, S_name, S_obj, S_man] = prepare_analyze_noise_win(win_type, noise_type, scale, ... + plist('win_test', true)); + + stest = true; + + catch err + disp(err.message) + stest = false; + end + % </SyntaxCode> + + % <AlgoDescription> + % + % 1) Check that calculated psds are identical within a part in 10^12 + % + % </AlgoDescription> + + % <AlgoCode> + + TOL = 1e-12; + + if stest + atest = algo_test_psd_win(S_name, S_obj, S_man, plist('TOL', TOL)); + else + atest = false; + end + + % </AlgoCode> + + % Return a result structure + result = utp_prepare_result(atest, stest, dbstack, mfilename); + end % END UTP_50 + + %% UTP_51 + + % <TestDescription> + % + % Tests the possibility to set the number of averages rather than setting the Nfft: + % 1) white noise produced from normal pdf, with: + % a given mean value and sigma (distribution's 1st and 2nd order) + % 2) psd of the noise, without detrending, random window, set number of + % averages + % 3) check the effective number of averages + % + + % </TestDescription> + function result = utp_51 + + % <SyntaxDescription> + % + % 1) Prepare the test tsdata: + % white noise from normal distribution + offset + % 2) psd of the noise, without detrending, random window, set number of + % averages + % + % </SyntaxDescription> + + % <SyntaxCode> + try + noise_type = 'Normal'; + + % Evaluate the psd of the white noise time-series data + [a, S1, S2, navs] = prepare_analyze_noise_navs(noise_type, plist); + + stest = true; + + catch err + disp(err.message) + stest = false; + end + % </SyntaxCode> + + % <AlgoDescription> + % + % 1) Check that calculated navs are identical to those requested + % + % </AlgoDescription> + + % <AlgoCode> + atest = true; + + if stest + % Compare the navs written in the output object with the requested one + if ne(navs, S1.data.navs) + if ne(find(S1.hist.plistUsed, 'navs'), S1.data.navs) + atest = false; + end + end + else + atest = false; + end + % </AlgoCode> + + % Return a result structure + result = utp_prepare_result(atest, stest, dbstack, mfilename); + end % END UTP_51 + + %% UTP_52 + + % <TestDescription> + % + % Tests the possibility to set the number of averages rather than setting the Nfft: + % 1) white noise produced from normal pdf, with: + % a given mean value and sigma (distribution's 1st and 2nd order) + % 2) psd of the noise, without detrending, random window, random navs + % 3) get the number of averages + % 4) get the nfft used + % 5) run psd again, with the nfft used + % 6) compare the calculated objects + % + + % </TestDescription> + function result = utp_52 + + % <SyntaxDescription> + % + % 1) white noise produced from normal pdf, with: + % a given mean value and sigma (distribution's 1st and 2nd order) + % 2) psd of the noise, without detrending, random window, random navs + % 3) get the number of averages + % 4) get the nfft used + % 5) run psd again, with the nfft used + % + % </SyntaxDescription> + + % <SyntaxCode> + try + noise_type = 'Normal'; + + % Evaluate the psd of the white noise time-series data + [a, S1, S2, navs] = prepare_analyze_noise_navs(noise_type, plist); + + stest = true; + + catch err + disp(err.message) + stest = false; + end + % </SyntaxCode> + + % <AlgoDescription> + % + % 1) Check that calculated objects S1 and S2 are identical + % + % </AlgoDescription> + + % <AlgoCode> + atest = true; + + if stest + % Compare the output objects + if ne(S1, S2, ple3) + atest = false; + end + else + atest = false; + end + % </AlgoCode> + + % Return a result structure + result = utp_prepare_result(atest, stest, dbstack, mfilename); + end % END UTP_52 + + %% UTP_53 + + % <TestDescription> + % + % Tests the possibility to set the number of averages rather than setting the Nfft: + % 1) white noise produced from normal pdf, with: + % a given mean value and sigma (distribution's 1st and 2nd order) + % 2) psd of the noise, without detrending, random window, random navs + % 3) get the number of averages + % 4) get the nfft used + % 5) run psd again, with the nfft used + % 6) compare navs, nfft, psds + % + + % </TestDescription> + function result = utp_53 + + % <SyntaxDescription> + % + % 1) white noise produced from normal pdf, with: + % a given mean value and sigma (distribution's 1st and 2nd order) + % 2) psd of the noise, without detrending, random window, random navs + % 3) get the number of averages + % 4) get the nfft used + % 5) run psd again, with the nfft used + % 6) run psd again, with conflicting parameters, and verify it uses + % nfft rather than navs + % + % </SyntaxDescription> + + % <SyntaxCode> + try + noise_type = 'Uniform'; + + % Evaluate the psd of the white noise time-series data + [a, S1, S2, navs] = prepare_analyze_noise_navs(noise_type, plist); + + npts_3 = fix(find(S1.hist.plistUsed, 'Nfft')/2); + + % Calculates the psd asking for the number of points AND the window length + pl_spec = S1.hist.plistUsed; + pl_spec.pset('Nfft', npts_3, 'navs', navs); + S3 = a.psd(pl_spec); + + stest = true; + + catch err + disp(err.message) + stest = false; + end + % </SyntaxCode> + + % <AlgoDescription> + % + % 1) Check that calculated objects S1 and S2 are identical + % 2) Check that S3 used different values + % + % </AlgoDescription> + + % <AlgoCode> + atest = true; + + if stest + % Compare the navs written in the output object with the requested one + if ne(S1, S2, ple3) || ... + ne(find(S3.hist.plistUsed, 'Nfft'), npts_3) || eq(S3.data.navs, navs) + atest = false; + end + else + atest = false; + end + % </AlgoCode> + + % Return a result structure + result = utp_prepare_result(atest, stest, dbstack, mfilename); + end % END UTP_53 + + %% UTP_54 + + % <TestDescription> + % + % Tests "conservation of energy": + % 1) white noise produced from normal pdf, with a given mean value and + % sigma (distribution's 1st and 2nd order) + % 2) evaluate the sample mean value m and standard deviation s + % 3) psd of the white noise + % 4) compares the sqrt(sum(S * df)) with the standard deviation s + % + + % </TestDescription> + function result = utp_54 + + % <SyntaxDescription> + % + % 1) Prepare the test tsdata: + % white noise from normal distribution + offset + % 2) Calculate the statistical parameters + % 3) Estimate the psd + % + % </SyntaxDescription> + + % <SyntaxCode> + try + % Array of parameters to pick from + fs_list = [0.1;1;10]; + nsecs_list = [100:100:10000]'; + sigma_distr_list = [1e-6 2e-3 0.25 1:0.1:10]'; + mu_distr_list = [1e-6 2e-3 0.25 1:0.1:10]'; + + % Build time-series test data + + % Picks the values at random from the list + fs = utils.math.randelement(fs_list, 1); + nsecs = utils.math.randelement(nsecs_list, 1); + sigma_distr = utils.math.randelement(sigma_distr_list, 1); + mu_distr = utils.math.randelement(mu_distr_list, 1); + + % White noise + type = 'Normal'; + a_n = ao(plist('waveform', 'noise', ... + 'type', type, 'fs', fs, 'nsecs', nsecs, 'sigma', sigma_distr)); + a_const = ao(mu_distr); + a = a_n + a_const; + + % Estimate the mean value and the sigma of the time-series data + sigma_sample = std(a.y, 1); + mu_sample = mean(a.y); + + % Evaluate the psd of the time-series data + % Parameters are crucial for the estimate to be correct! + win = 'Rectangular'; + olap = 0; + detrend = 0; + n_pts = -1; + scale = 'PSD'; + + S = a.psd(plist('Win', win, 'olap', olap, ... + 'Nfft', n_pts, 'order', detrend, 'scale', scale)); + + stest = true; + + catch err + disp(err.message) + stest = false; + end + % </SyntaxCode> + + % <AlgoDescription> + % + % 1) Check that calculated psd energy equals the rms content of the tsdata, estimated by the std of the sample + % + % </AlgoDescription> + + % <AlgoCode> + atest = true; + TOL = 1e-12; + + if stest + % Integral of the spectrum + sigma_psd = sqrt(sum(S.y * S.x(2))); + if abs(sigma_psd - sigma_sample) / mean([sigma_psd sigma_sample]) >= TOL + atest = false; + end + else + atest = false; + end + % </AlgoCode> + + % Return a result structure + result = utp_prepare_result(atest, stest, dbstack, mfilename); + end % END UTP_54 + + %% UTP_60 + + % <TestDescription> + % + % Tests the 'basic' call: + % 1) white noise produced from normal pdf, with: + % a given mean value and sigma (distribution's 1st and 2nd order) + % 2) psd of the noise, defualt detrending, default window, no averaging + % + + % </TestDescription> + function result = utp_60 + + % <SyntaxDescription> + % + % 1) Prepare the test tsdata: + % white noise from normal distribution + offset + % 2) Calculate the statistical parameters + % 3) Estimate the psd with default detrending, default window, no averaging + % + % </SyntaxDescription> + + % <SyntaxCode> + try + + noise_type = 'Normal'; + win_type = char(prefs.getMiscPrefs.getDefaultWindow); + scale = 'PSD'; + + [a, S_name, S_obj, S_man] = prepare_analyze_noise_win(win_type, noise_type, scale, ... + plist('win_test', false, 'reduce_pts', false)); + + stest = true; + + catch err + disp(err.message) + stest = false; + end + % </SyntaxCode> + + % <AlgoDescription> + % + % 1) Nothing to check + % + % </AlgoDescription> + + % <AlgoCode> + + if stest + atest = true; + else + atest = false; + end + + % </AlgoCode> + + % Return a result structure + result = utp_prepare_result(atest, stest, dbstack, mfilename); + end % END UTP_60 + + %% UTP_61 + + % <TestDescription> + % + % Tests the 'basic' call: + % 1) white noise produced from normal pdf, with: + % a given mean value and sigma (distribution's 1st and 2nd order) + % 2) psd of the noise, defualt detrending, default window, no averaging + % + + % </TestDescription> + function result = utp_61 + + % <SyntaxDescription> + % + % 1) Prepare the test tsdata: + % white noise from normal distribution + offset + % 2) Calculate the statistical parameters + % 3) Estimate the psd with default detrending, default window, no averaging + % + % </SyntaxDescription> + + % <SyntaxCode> + try + + noise_type = 'Normal'; + win_type = char(prefs.getMiscPrefs.getDefaultWindow); + scale = 'ASD'; + + [a, S_name, S_obj, S_man] = prepare_analyze_noise_win(win_type, noise_type, scale, ... + plist('win_test', false, 'reduce_pts', false)); + + stest = true; + + catch err + disp(err.message) + stest = false; + end + % </SyntaxCode> + + % <AlgoDescription> + % + % 1) Nothing to check + % + % </AlgoDescription> + + % <AlgoCode> + + if stest + atest = true; + else + atest = false; + end + + % </AlgoCode> + + % Return a result structure + result = utp_prepare_result(atest, stest, dbstack, mfilename); + end % END UTP_61 + + %% UTP_62 + + % <TestDescription> + % + % Tests the 'basic' call: + % 1) white noise produced from normal pdf, with: + % a given mean value and sigma (distribution's 1st and 2nd order) + % 2) psd of the noise, defualt detrending, default window, no averaging + % + + % </TestDescription> + function result = utp_62 + + % <SyntaxDescription> + % + % 1) Prepare the test tsdata: + % white noise from normal distribution + offset + % 2) Calculate the statistical parameters + % 3) Estimate the psd with default detrending, default window, no averaging + % + % </SyntaxDescription> + + % <SyntaxCode> + try + + noise_type = 'Normal'; + win_type = char(prefs.getMiscPrefs.getDefaultWindow); + scale = 'PS'; + + [a, S_name, S_obj, S_man] = prepare_analyze_noise_win(win_type, noise_type, scale, ... + plist('win_test', false, 'reduce_pts', false)); + + stest = true; + + catch err + disp(err.message) + stest = false; + end + % </SyntaxCode> + + % <AlgoDescription> + % + % 1) Nothing to check + % + % </AlgoDescription> + + % <AlgoCode> + + if stest + atest = true; + else + atest = false; + end + + % </AlgoCode> + + % Return a result structure + result = utp_prepare_result(atest, stest, dbstack, mfilename); + end % END UTP_62 + + %% UTP_63 + + % <TestDescription> + % + % Tests the 'basic' call: + % 1) white noise produced from normal pdf, with: + % a given mean value and sigma (distribution's 1st and 2nd order) + % 2) psd of the noise, defualt detrending, default window, no averaging + % + + % </TestDescription> + function result = utp_63 + + % <SyntaxDescription> + % + % 1) Prepare the test tsdata: + % white noise from normal distribution + offset + % 2) Calculate the statistical parameters + % 3) Estimate the psd with default detrending, default window, no averaging + % + % </SyntaxDescription> + + % <SyntaxCode> + try + + noise_type = 'Normal'; + win_type = char(prefs.getMiscPrefs.getDefaultWindow); + scale = 'AS'; + + [a, S_name, S_obj, S_man] = prepare_analyze_noise_win(win_type, noise_type, scale, ... + plist('win_test', false, 'reduce_pts', false)); + + stest = true; + + catch err + disp(err.message) + stest = false; + end + % </SyntaxCode> + + % <AlgoDescription> + % + % 1) Nothing to check + % + % </AlgoDescription> + + % <AlgoCode> + + if stest + atest = true; + else + atest = false; + end + + % </AlgoCode> + + % Return a result structure + result = utp_prepare_result(atest, stest, dbstack, mfilename); + end % END UTP_63 + + %% Helper function for window call construction + + function [a, S_name, S_obj, S_w] = prepare_analyze_noise_win(win_type, noise_type, scale, pli) + % Array of parameters to pick from + fs_list = [0.1;1;2;5;10]; + nsecs_list = [20 100 1000:1000:10000]'; + sigma_distr_list = [1e-6 2e-3 0.25 1:0.1:10]'; + trend_0_list = [1e-6 2e-3 0.25 1:0.1:10]'; + + + % Build time-series test data + + % Picks the values at random from the list + fs = utils.math.randelement(fs_list, 1); + nsecs = utils.math.randelement(nsecs_list, 1); + sigma_distr = utils.math.randelement(sigma_distr_list, 1); + trend_0 = utils.math.randelement(trend_0_list, 1); + + % Pick units and prefix from those supported + unit_list = unit.supportedUnits; + % remove the first empty unit '' from the list, because then is it + % possible that we add a prefix to an empty unit + unit_list = unit_list(2:end); + prefix_list = unit.supportedPrefixes; + + % White noise + a_n = ao(plist('waveform', 'noise', ... + 'type', noise_type, 'fs', fs, 'nsecs', nsecs, 'sigma', sigma_distr)); + + % Constant signal + a_c = ao(trend_0); + + % Total signal + a = a_n + a_c; + + % Set units + a.setYunits(unit([cell2mat(utils.math.randelement(prefix_list,1)) cell2mat(utils.math.randelement(unit_list,1))])); + + % Evaluate the psd of the white noise time-series data + n_pts_reduction_factor = find(pli, 'reduce_pts'); + if isempty(n_pts_reduction_factor) || ~n_pts_reduction_factor + n_pts_reduction_factor = 1; % Taking single windows, no reduction in number of points + end + n_pts = a.nsecs * a.fs/ n_pts_reduction_factor; + + olap = find(pli, 'olap'); + if isempty(olap) + olap = 0; %% Should we take the rov instead? + end + if n_pts_reduction_factor == 1 + olap = 0; % This does not matter in the case of single window + end + + detrend_order = 0; + + switch lower(win_type) + case 'kaiser' + psll = find(pli, 'psll'); + if isempty(psll) + psll = find(ao.getInfo('psd').plists, 'psll'); + end + win = specwin(win_type, fs*nsecs, psll); + pl_spec = plist('Win', win_type, 'psll', psll, 'olap', olap, ... + 'Nfft', n_pts, 'order', detrend_order, 'scale', scale); + otherwise + win = specwin(win_type, fs*nsecs); + pl_spec = plist('Win', win_type, 'olap', olap, ... + 'Nfft', n_pts, 'order', detrend_order, 'scale', scale); + end + + if find(pli, 'win_test') + % Makes a copy of the data, and apply the window manually + % Apply the detrending + a_w = a.detrend(plist('N', detrend_order)); + % Apply the window, taking into account the correct normalization + a_w.setY(a_w.y .* win.win'./sqrt(win.ws2 / win.len)); + + % Evaluate the psd of the windowed data + S_w = a_w.psd(plist('Win', 'Rectangular', 'olap', olap, ... + 'Nfft', n_pts, 'order', -1, 'scale', scale)); + + % Calls psd applying the detrend and window internally + % (passig window object) + S_obj = a.psd(pl_spec); + + else + S_obj = ao; + S_w = ao; + end + + % Calls psd applying the detrend and window internally + % (passig window name) + pl_spec.pset('Win', win_type); + S_name = a.psd(pl_spec); + + end + + + %% Helper function for window call construction + + function [sigma_sample, sigma_psd] = prepare_analyze_noise_energy(win_type, noise_type, scale, pli) + + % Build time-series test data + if find(pli, 'fs') + fs = find(pli, 'fs'); + nsecs = find(pli, 'nsecs'); + sigma_distr = find(pli, 'sigma_distr'); + mu_distr = find(pli, 'mu_distr'); + else + % Array of parameters to pick from + fs_list = [0.1;1;10]; + nsecs_list = [100:100:10000]; + sigma_distr_list = [1e-6 2e-3 0.25 1:0.1:10]'; + mu_distr_list = [1e-6 2e-3 0.25 1:0.1:10]'; + + % Picks the values at random from the list + fs = utils.math.randelement(fs_list, 1); + nsecs = utils.math.randelement(nsecs_list, 1); + sigma_distr = utils.math.randelement(sigma_distr_list, 1); + mu_distr = utils.math.randelement(mu_distr_list, 1); + end + + % Pick units and prefix from those supported + unit_list = unit.supportedUnits; + % remove the first empty unit '' from the list, because then is it + % possible that we add a prefix to an empty unit + unit_list = unit_list(2:end); + prefix_list = unit.supportedPrefixes; + + % White noise + a_n = ao(plist('waveform', 'noise', ... + 'type', noise_type, 'fs', fs, 'nsecs', nsecs, 'sigma', sigma_distr)); + + % Constant signal + a_c = ao(mu_distr); + + % Total signal + a = a_n + a_c; + + % Set units + a.setYunits(unit([cell2mat(utils.math.randelement(prefix_list,1)) cell2mat(utils.math.randelement(unit_list,1))])); + + % Evaluate the psd of the white noise time-series data + olap = find(pli, 'olap'); + if isempty(olap) + olap = 0; %% Should we take the rov instead? + end + + detrend_order = find(pli, 'detrend_order'); + if isempty(detrend_order) + detrend_order = 0; + end + + n_pts = -1; + + switch lower(win_type) + case 'kaiser' + psll = find(pli, 'psll'); + if isempty(psll) + psll = find(ao.getInfo('psd').plists, 'psll'); + end + win = specwin(win_type, fs*nsecs, psll); + pl_spec = plist('Win', win_type, 'psll', psll, 'olap', olap, ... + 'Nfft', n_pts, 'order', detrend_order, 'scale', scale); + otherwise + win = specwin(win_type, fs*nsecs); + pl_spec = plist('Win', win_type, 'olap', olap, ... + 'Nfft', n_pts, 'order', detrend_order, 'scale', scale); + end + + % Calls psd applying the detrend and window internally + % (passig window name) + pl_spec.pset('Win', win_type); + S = a.psd(pl_spec); + + % Evaluate the statistics of the time-series and spectra + + % Estimate the mean value and the sigma of the time-series data + sigma_sample = std(a.y, 1); + mu_sample = mean(a.y); + + % Integral of the spectrum + sigma_psd = sqrt(sum(S.y * S.x(2))); + + end + + %% Helper function for window call construction, navs option + + function [a, S, S1, navs] = prepare_analyze_noise_navs(noise_type, pli) + % Array of parameters to pick from + fs_list = [0.1;1;2;5;10]; + nsecs_list = [2000:1000:10000]'; + sigma_distr_list = [1e-6 2e-3 0.25 1:0.1:10]'; + trend_0_list = [1e-6 2e-3 0.25 1:0.1:10]'; + + + % Build time-series test data + + % Picks the values at random from the list + fs = utils.math.randelement(fs_list, 1); + nsecs = utils.math.randelement(nsecs_list, 1); + sigma_distr = utils.math.randelement(sigma_distr_list, 1); + trend_0 = utils.math.randelement(trend_0_list, 1); + + % Pick units and prefix from those supported + unit_list = unit.supportedUnits; + % remove the first empty unit '' from the list, because then is it + % possible that we add a prefix to an empty unit + unit_list = unit_list(2:end); + prefix_list = unit.supportedPrefixes; + + % White noise + a_n = ao(plist('waveform', 'noise', ... + 'type', noise_type, 'fs', fs, 'nsecs', nsecs, 'sigma', sigma_distr)); + + % Constant signal + a_c = ao(trend_0); + + % Total signals + a = a_n + a_c; + + % Set units + a.setYunits(unit([cell2mat(utils.math.randelement(prefix_list,1)) cell2mat(utils.math.randelement(unit_list,1))])); + + % Evaluate the psd of the white noise time-series data + olap = 0; + detrend_order = 0; + n_pts = -1; + + navs = fix(utils.math.randelement(logspace(0,log10(max(0,a.len/10)),50),1)); + + % Evaluate the psd of the white noise time-series data + % Window + win_list = specwin.getTypes; + win_type = utils.math.randelement(win_list,1); + win_type = win_type{1}; + + switch lower(win_type) + case 'kaiser' + psll = utils.math.randelement([0:10:200],1); + if psll == 0 + psll = find(ao.getInfo('psd').plists, 'psll'); + end + pl_spec = plist('Win', win_type, 'psll', psll, 'olap', olap, 'order', detrend_order); + case 'levelledhanning' + pl_spec = plist('Win', 'BH92', 'olap', olap, 'order', detrend_order); + otherwise + pl_spec = plist('Win', win_type, 'olap', olap, 'order', detrend_order); + end + + % Calls psd asking for the number of averages + pl_spec.pset('Nfft', n_pts, 'navs', navs); + S = a.psd(pl_spec); + + % Calls psd asking for the number of points just evaluated + pl_spec.pset('Nfft', find(S.hist.plistUsed, 'Nfft')); + pl_spec.remove('navs'); + S1 = a.psd(pl_spec); + + end + + %% Helper function for window call construction, navs option + function [S_ap, S_sigma_total, S_expected_total] = test_psd_energy_prepare_data(win_type, detrend_order, pli) + + % Calculate the expected level of noise from sample statistics + fs = a_n_long.fs; + S_sigma_total = std(a_n_long.y, 1); + S_expected_total = S_sigma_total^2 / fs * 2; + + olap = 0; + n_pts = -1; + scale = 'PSD'; + + switch lower(win_type) + case 'kaiser' + psll = find(pli, 'psll'); + if isempty(psll) + psll = find(ao.getInfo('psd').plists, 'psll'); + end + pl_spec = plist('Win', win_type, 'psll', psll, 'olap', olap, ... + 'Nfft', n_pts, 'order', detrend_order, 'scale', scale); + case 'levelledhanning' + pl_spec = plist('Win', 'BH92', 'olap', olap, ... + 'Nfft', n_pts, 'order', detrend_order, 'scale', scale); + otherwise + pl_spec = plist('Win', win_type, 'olap', olap, ... + 'Nfft', n_pts, 'order', detrend_order, 'scale', scale); + end + + % Calls psd applying the detrend and window internally + % (passig window name) + S_ap = ap.psd(pl_spec); + + end + + %% Algorithm test for window comparison + + function varargout = algo_test_psd_win(S_name, S_obj, S_man, pli) + atest = true; + msg = ''; + pl_def = plist('TOL', 1e-12); + TOL = find(parse(pli, pl_def), 'TOL'); + + % Compare the psd evaluated with the window name / object + if ~eq(S_name, S_obj, ple1) + atest = false; + msg = ['Two PSD objects are not equal: ' lastwarn]; + end + % Compare the psd evaluated with the two methods + res = abs(S_obj - S_man) ./ S_obj; + if any(res.y >= TOL) + atest = false; + msg = 'Two PSDs are not equal'; + end + + if nargout == 1 + varargout{1} = atest; + elseif nargout == 2 + varargout{1} = atest; + varargout{2} = msg; + else + error('Incorrect outputs'); + end + + end + + + %% Algorithm test for energy conservation tests + + function atest = algo_test_psd_energy(ap, S_ap, S_expected_total, pli) + + % Checks on individual PSDs: mean and standard deviation of the + % PSD points + fs = ap.fs; + Npoints = length(S_ap(1).y); + S_mean = mean(S_ap.y); + S_err = std(S_ap.y, 1) / sqrt(Npoints); + + % Expected value, estimated from the std of the individual segments + S_sigma = std(ap.y, 1); + S_expected = S_sigma.^2 / fs * 2; + + % Comparison with the mean performed on the individual segments + test_level = abs(S_mean - S_expected) < S_err; + sum(test_level) / Nsegments; % TODO: implement hypothesis test here + + % Checks on averaged PSDs: mean and standard deviation of all the + % PSD points + S_mean_total = mean(S_mean); + S_err_total = std(S_mean) / sqrt(Nsegments); + + % Compares the grand-mean with the estimated white noise level + if sum(abs(S_mean_total - S_expected_total) < S_err_total) + atest = true; + else + atest = false; + end + + end + + +end