Mercurial > hg > ltpda
diff m-toolbox/test/MDC2/test_mdc2_noisegen_accuracy_v2.m @ 0:f0afece42f48
Import.
author | Daniele Nicolodi <nicolodi@science.unitn.it> |
---|---|
date | Wed, 23 Nov 2011 19:22:13 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/m-toolbox/test/MDC2/test_mdc2_noisegen_accuracy_v2.m Wed Nov 23 19:22:13 2011 +0100 @@ -0,0 +1,323 @@ +% A test script for to check the accuracy of the noise generation procedure +% for the MDC2 +% +% +% L. Ferraioli 04-02-2009 +% +% $Id: test_mdc2_noisegen_accuracy_v2.m,v 1.3 2009/04/20 14:34:12 luigi Exp $ +% + +%% General use variables and vectors + +fs = 1; +f = logspace(-6,log10(fs/2),300); +f = f.'; +Nsecs = 1e6; % number of seconds +Nfft1 = 1e5; +plsp1 = plist('Nfft',Nfft1,'order',2); +Nfft2 = 5e3; +plsp2 = plist('Nfft',Nfft2); + +%% MDC2 Models + +b = ao(plist('built-in','mdc2r2_fd_ltpnoise','f',f)); + +%% + +iplot(b) + +%% + +CSD = [b(1) b(2);conj(b(2)) b(3)]; +MSC = b(2).*conj(b(2))./(b(1).*b(3)); + +%% some ploting + +iplot(CSD(1,1),CSD(2,2),MSC) +iplot(CSD(1,1),CSD(2,2),CSD(1,2),CSD(2,1)) + +%% Make white noise + +a1 = ao(plist('tsfcn', 'randn(size(t))', 'fs', fs, 'nsecs', Nsecs, 'yunits', 'm')); +a2 = ao(plist('tsfcn', 'randn(size(t))', 'fs', fs, 'nsecs', Nsecs, 'yunits', 'm')); + +%% Noise generation + +plng = plist(... + 'csd11', CSD(1,1), ... + 'csd12', CSD(1,2), ... + 'csd21', CSD(2,1), ... + 'csd22', CSD(2,2), ... + 'MaxIter', 80, ... + 'PoleType', 2, ... + 'MinOrder', 35, ... + 'MaxOrder', 40, ... + 'Weights', 2, ... + 'Plot', false,... + 'MSEVARTOL', 1e-2,... + 'FITTOL', 1e-5,... + 'UseSym', 0,... + 'Disp', false); + +[ac1,ac2] = noisegen2D(a1,a2, plng); + +% extracting filters +h11 = ac1.procinfo.find('Filt11'); +h12 = ac1.procinfo.find('Filt12'); +h21 = ac2.procinfo.find('Filt21'); +h22 = ac2.procinfo.find('Filt22'); + +%% Find stationary filter state + +Nrun = 20; + +for jj = 1:Nrun % filter state evolution + disp(num2str(jj)) + ac11 = filter(a1,h11); + h11 = ac11.procinfo.find('Filters'); % prooagate histout + ac12 = filter(a2,h12); + h12 = ac12.procinfo.find('Filters'); + ac21 = filter(a1,h21); + h21 = ac21.procinfo.find('Filters'); + ac22 = filter(a2,h22); + h22 = ac22.procinfo.find('Filters'); +end + +% re-define ac1 and ac2 +ac1 = ac11 + ac12; +ac1.setName; +ac2 = ac21 + ac22; +ac2.setName; + +%% spectra calculation + +acxx1 = psd(ac1,plsp1); +acxx2 = psd(ac2,plsp1); +acxx12 = cohere(ac1,ac2,plsp2); + +% %% +% iplot(CSD11,acxx1,CSD22,acxx2) +% iplot(MSC,acxx12) +% +% %% + +% get dofs +dof1 = getdof(acxx1,plist('method','psd')); +dof2 = getdof(acxx2,plist('method','psd')); +dof12 = getdof(acxx12,plist('method','mscohere')); + +% Interpolate theorethical data +CSD11 = interp(CSD(1,1),plist('vertices',acxx1.data.x)); +CSD22 = interp(CSD(2,2),plist('vertices',acxx2.data.x)); +MSC = interp(MSC,plist('vertices',acxx12.data.x)); + +% getting variance +[lw1,up1,sig1] = confint(acxx1,plist('method','psd')); +[lw2,up2,sig2] = confint(acxx2,plist('method','psd')); +[lw12,up12,sig12] = confint(acxx12,plist('method','mscohere')); + +% set limits of reliable regions +[a,b] = size(acxx12.x); +la = round(a*0.0212); + +% chi square +k1 = acxx1 - CSD11; +k1 = k1.^2; +k1 = k1./sig1; +k1 = split(k1,plist('split_type','samples','samples',[la a])); +chi1 = sum(k1)./length(k1.data.x); + +k2 = acxx2 - CSD22; +k2 = k2.^2; +k2 = k2./sig2; +k2 = split(k2,plist('split_type','samples','samples',[la a])); +chi2 = sum(k2)./length(k2.data.x); + +k12 = acxx12 - MSC; +k12= k12.^2; +k12 = k12./sig12; +k12 = split(k12,plist('split_type','samples','samples',[la a])); +chi12 = sum(k12)./length(k12.data.x); + +proc1 = acxx1.procinfo; +proc2 = acxx2.procinfo; +proc12 = acxx12.procinfo; + +%% + +iplot(CSD11,acxx1,lw1,up1) +iplot(CSD22,acxx2,lw2,up2) +iplot(MSC,acxx12,lw12,up12) + +%% Running the loop + +N = 100; + +for ii = 2:N + disp(num2str(ii)) + + a1 = ao(plist('tsfcn', 'randn(size(t))', 'fs', fs, 'nsecs', Nsecs, 'yunits', 'm')); + a2 = ao(plist('tsfcn', 'randn(size(t))', 'fs', fs, 'nsecs', Nsecs, 'yunits', 'm')); + + x11 = filter(a1,h11); + x12 = filter(a2,h12); + x21 = filter(a1,h21); + x22 = filter(a2,h22); + + x1 = x11 + x12; + x2 = x21 + x22; + + % sectra + xx1 = psd(x1,plsp1); + xx2 = psd(x2,plsp1); + xx12 = cohere(x1,x2,plsp2); +% xx12 = xx12(1,2); + + % sum spectra + acxx1 = acxx1 + xx1; + acxx2 = acxx2 + xx2; + acxx12 = acxx12 + xx12; + + % getting variance + [lw,up,sig1] = confint(xx1,plist('method','psd')); + [lw,up,sig2] = confint(xx2,plist('method','psd')); + [lw,up,sig12] = confint(xx12,plist('method','mscohere')); + + % chi square + k1 = xx1 - CSD11; + k1 = k1.^2; + k1 = k1./sig1; + k1 = split(k1,plist('split_type','samples','samples',[la a])); + xc1 = sum(k1)./length(k1.data.x); + + k2 = xx2 - CSD22; + k2 = k2.^2; + k2 = k2./sig2; + k2 = split(k2,plist('split_type','samples','samples',[la a])); + xc2 = sum(k2)./length(k2.data.x); + + k12 = xx12 - MSC; + k12= k12.^2; + k12 = k12./sig12; + k12 = split(k12,plist('split_type','samples','samples',[la a])); + xc12 = sum(k12)./length(k12.data.x); + + % adding chisquare + chi1 = chi1 + xc1; + chi2 = chi2 + xc2; + chi12 = chi12 + xc12; + +end + +%% Do Averages + +% do average +acxx1 = acxx1./N; +acxx1.setName; +acxx2 = acxx2./N; +acxx2.setName; +acxx12 = acxx12./N; +acxx12.setName; + +% average chi square +chi1 = chi1./N; +chi2 = chi2./N; +chi12 = chi12./N; + +% dofs for the averages +adof1 = dof1.*N; +adof2 = dof2.*N; +adof12 = dof12.*N; + +% get confidence bounds for the 'true' spactra +[lw1,up1,sig1] = confint(acxx1,plist('method','psd','dof',adof1)); +[lw2,up2,sig2] = confint(acxx2,plist('method','psd','dof',adof2)); +[lw12,up12,sig12] = confint(acxx12,plist('method','mscohere','dof',adof12)); + +%% plotting + +iplot(CSD(1,1),acxx1) +iplot(CSD(2,2),acxx2) +iplot(MSC,acxx12) + +iplot(CSD(1,1),lw1,up1) +iplot(CSD(2,2),lw2,up2) +iplot(MSC,lw12,up12) + +%% plotting conflevels 1 + +x = lw1.data.x; +y1 = lw1.data.y; +y2 = up1.data.y; + +figure +y = [y1 (y2-y1)]; % y1 and y2 are columns +ha = area(x, y); +set(ha(1), 'FaceColor', 'none') % this makes the bottom area invisible +set(ha(2), 'FaceColor', 'r') +set(ha, 'LineStyle', 'none') +grid on + +% plot the line edges +hold on +hb = plot(x, y1, 'LineWidth', 1, 'Color', 'r'); +hc = plot(x, y2, 'LineWidth', 1, 'Color', 'r'); +hd = plot(CSD(1,1).data.x, CSD(1,1).data.y); + +set(gca,'xscale','log','yscale','log'); +% set(gca,'Layer','top') +ylabel('Power Spectrum [m^{2} / Hz]'); +xlabel('Frequency [Hz]'); +legend([hd hb],{'Model CSD(1,1)','95% Conf. level'}); + +%% plotting conflevels 2 + +x = lw2.data.x; +y1 = lw2.data.y; +y2 = up2.data.y; + +figure +y = [y1 (y2-y1)]; % y1 and y2 are columns +ha = area(x, y); +set(ha(1), 'FaceColor', 'none') % this makes the bottom area invisible +set(ha(2), 'FaceColor', 'r') +set(ha, 'LineStyle', 'none') +grid on + +% plot the line edges +hold on +hb = plot(x, y1, 'LineWidth', 1, 'Color', 'r'); +hc = plot(x, y2, 'LineWidth', 1, 'Color', 'r'); +hd = plot(CSD(2,2).data.x, CSD(2,2).data.y); + +set(gca,'xscale','log','yscale','log'); +% set(gca,'Layer','top') +ylabel('Power Spectrum [m^{2} / Hz]'); +xlabel('Frequency [Hz]'); +legend([hd hb],{'Model CSD(2,2)','95% Conf. level'}); + +%% plotting conflevels 3 + +x = lw12.data.x; +y1 = lw12.data.y; +y2 = up12.data.y; + +figure +y = [y1 (y2-y1)]; % y1 and y2 are columns +ha = area(x, y); +set(ha(1), 'FaceColor', 'none') % this makes the bottom area invisible +set(ha(2), 'FaceColor', 'r') +set(ha, 'LineStyle', 'none') +grid on + +% plot the line edges +hold on +hb = plot(x, y1, 'LineWidth', 1, 'Color', 'r'); +hc = plot(x, y2, 'LineWidth', 1, 'Color', 'r'); +hd = plot(MSC.data.x, MSC.data.y); + +set(gca,'yscale','log'); +% set(gca,'Layer','top') +ylabel('Magnitude Square Coherence'); +xlabel('Frequency [Hz]'); +legend([hd hb],{'Model MSC','95% Conf. level'});