Mercurial > hg > ltpda
diff m-toolbox/test/utils/test_2dim_vdfit.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/utils/test_2dim_vdfit.m Wed Nov 23 19:22:13 2011 +0100 @@ -0,0 +1,184 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% TEST Fitting procedure in 2dim z-domain VDFIT +% At the end you have 4 stable transfer functions in partial fractions +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% HISTORY: 02-10-2008 L Ferraioli +% Creation +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% VERSION + +'$Id: test_2dim_vdfit.m,v 1.1 2009/04/23 10:11:26 luigi Exp $'; + +%% Clear + +clear all + +%% Loading spectra + +load ..\m-toolbox\test\mpsd.mat % load mpsd.mat first column is f then psd1, csd and psd2 + +f = mpsd(:,1); +csd11 = mpsd(:,2); +csd12 = mpsd(:,3); +csd21 = []; +csd22 = mpsd(:,4); + +fs = 10; + + +%% Eigendecomposition + +[tf11,tf12,tf21,tf22] = utils.math.eigcsd(csd11,csd12,csd21,csd22,'USESYM',0,'DIG',50,'OTP','TF'); + +%% Constructing vector + +f1 = [tf11 tf21]; +f2 = [tf12 tf22]; + +%% VDFIT +tic; + +clear mlr1 mlr2 + +N = 32; %Order of approximation + + +% Max Iteration +Nmaxiter = 40; + +% mlr1 = zeros(Nmaxiter,1); +% mlr2 = zeros(Nmaxiter,1); + +% Fitting params +fitin.stable = 0; +fitin.dterm = 0; +fitin.plot = 0; +fitin.fs = fs; + +weight = utils.math.wfun(f1,2); +% weight = 1./abs(f1); + +pparams = struct('spolesopt',3, 'type','DISC', 'pamp', 0.98); +poles1 = utils.math.startpoles(N,f,pparams); +for hh = 1:Nmaxiter + [res1,poles1,dterm1,mresp1,rdl1,sqe1] = utils.math.vdfit(f1,f,poles1,weight,fitin); % Fitting + disp(['Iter' num2str(hh)]) + + % Stop condition checking + mlr1(hh) = sqe1(:,1); + mlr2(hh) = sqe1(:,2); +% [ext1,msg1] = utils.math.stopfit(f1(:,1),rdl1(:,1),mlr1,'lrsrmse',2,15); +% [ext2,msg2] = utils.math.stopfit(f1(:,2),rdl1(:,2),mlr2,'lrsrmse',2,15); + +% order = length(poles1); +% mlr1(hh) = mean(log10(abs(f1(:,1)))-log10(abs(rdl1(:,1)))); +% mlr2(hh) = mean(log10(abs(f1(:,2)))-log10(abs(rdl1(:,2)))); +% [ext1,msg1] = utils.math.stopfit(f1(:,1),rdl1(:,1),mlr1,order,'lrs',1,0.0001,2); +% [ext2,msg2] = utils.math.stopfit(f1(:,2),rdl1(:,2),mlr2,order,'lrs',1,0.0001,2); + +% if ext1 && ext2 +% disp(msg1) +% break +% end + +end +elpstime = toc; + +% plotting squared error +figure() +semilogy(mlr1,'-ok') +hold on +grid on +semilogy(mlr2,'-or') + +% % plotting RMS error variation +% figure() +% semilogy(abs(diff(sqrt(mlr1))),'-ok') +% hold on +% grid on +% semilogy(abs(diff(sqrt(mlr2))),'-or') + +% plotting squared error variation +figure() +semilogy(abs(diff(mlr1)./mlr1(1,end-1)),'-ok') +hold on +grid on +semilogy(abs(diff(mlr2)./mlr2(1,end-1)),'-or') + +%% All Passing + +% [np1,resp1] = pfallpz(res1,poles1,dterm1,mresp1,f,fs); +[nr1,np1,nd1,resp1] = utils.math.pfallpsymz(res1,poles1,dterm1,mresp1,f,fs); + + +figure() +subplot(2,1,1); +p1 = loglog(f,abs(mresp1),'k'); +hold on +p2 = loglog(f,abs(resp1),'r'); +xlabel('Frequency [Hz]') +ylabel('Amplitude') +legend([p1(1) p2(1)],'VDFIT','Stabilized') +hold off + +subplot(2,1,2); +p4 = semilogx(f,(180/pi).*unwrap(angle(mresp1)),'k'); +hold on +p5 = semilogx(f,(180/pi).*unwrap(angle(resp1)),'r'); +xlabel('Frequency [Hz]') +ylabel('Phase [Deg]') +legend([p4(1) p5(1)],'VDFIT', 'Stabilized') +hold off + +%% VDFIT + +clear mlr3 mlr4 ext1 ext2 +N = 24; %Order of approximation + + +% Max Iteration +Nmaxiter = 70; + +% Fitting params +fitin.stable = 0; +fitin.dterm = 0; +fitin.plot = 1; +fitin.fs = fs; + +weight = utils.math.wfun(f2,2); + +pparams = struct('spolesopt',2, 'type','DISC', 'pamp', 0.98); +poles2 = utils.math.startpoles(N,f,pparams); + +for hh = 1:Nmaxiter + [res2,poles2,dterm2,mresp2,rdl2,rmse2] = utils.math.vdfit(f2,f,poles2,weight,fitin); % Fitting + disp(['Iter' num2str(hh)]) + + % Stop condition checking + mlr3(hh) = rmse2(:,1); + mlr4(hh) = rmse2(:,2); + [ext1,msg1] = utils.math.stopfit(f2(:,1),rdl2(:,1),mlr3,'lrsrmse',2,15); + [ext2,msg2] = utils.math.stopfit(f2(:,2),rdl2(:,2),mlr4,'lrsrmse',2,15); + + if ext1 && ext2 + disp(msg1) + break + end + +end + +% plotting RMS error +figure() +semilogy(mlr3,'-ok') +hold on +grid on +semilogy(mlr4,'-or') + +%% +% params = struct('spolesopt',2, 'Nmaxiter',250, 'minorder',30,... +% 'maxorder',60, 'weightparam',1, 'plot',0,... +% 'ctp','lrs','lrscond',1,'lrsvarcond',1,'nrmsecond',2,... +% 'stabfit',0,'dterm',0,'spy',0); +% +% [res2,poles2,dterm2,mresp2,rdl2] = autodfit(f2,f,fs,params);