diff m-toolbox/test/LTPDA_training/topic5/TrainigSession_T5_Ex01.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/LTPDA_training/topic5/TrainigSession_T5_Ex01.m	Wed Nov 23 19:22:13 2011 +0100
@@ -0,0 +1,192 @@
+% Training session Topic 5 exercise 01
+% 
+% System identification in z-domain 1
+% 
+% 1) Generate white noise
+% 2) Filter white noise with a miir filter
+% 3) Extract transfer function from data
+% 4) Fit TF with zDomainFit
+% 5) Compare results
+% 6) Comments
+% 
+% L FERRAIOLI 22-02-09
+%
+% $Id: TrainigSession_T5_Ex01.m,v 1.2 2009/02/25 18:18:45 luigi Exp $
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%% 1) Generate White Noise
+
+% Build a gaussian random noise data series
+a = ao(plist('tsfcn', 'randn(size(t))', 'fs', 1, 'nsecs', 10000,'yunits','m'));
+
+%% 2) Filtering White Noise
+
+% set a proper plist for a miir filter converting meters to volt
+plmiir = plist('a',[2 0.3 0.4],'b',[1 .05 .3 0.1],'fs',1,'iunits','m','ounits','V');
+
+% Building the filter
+filt = miir(plmiir);
+
+% filtering white noise
+ac = filter(a,filt);
+ac.simplifyYunits;
+
+%% Checking
+% set a plist for psd calculation
+plpsd = plist('Nfft',1000);
+
+% calculate psd of white data
+axx = psd(a,plpsd);
+
+% calculate psd of colored data
+acxx = psd(ac,plpsd);
+
+% plotting psd
+iplot(axx,acxx)
+
+%% 3) Extracting transfer function
+
+% settung plist for TF estimation
+pltf = plist('Nfft',1000);
+
+% TF estimation
+tf = tfe(a,ac,pltf);
+
+% Removing first bins form tf
+tf12 = split(tf(1,2),plist('split_type', 'frequencies', 'frequencies', [3e-3 5e-1]));
+
+% plotting
+iplot(tf(1,2),tf12)
+
+%% 4.1) Fitting TF - checking residuals log difference
+
+% Perform an automatic fit of TF data in order to identify a discrete
+% model. The parameters controlling fit accuracy are
+% 
+% 'ResLogDiff' check that the normalized difference between data and fit
+% residuals in log scale is larger than the value specified.
+% if d is the input value for the parameter, than the algorithm check that
+% log10(data) - log10(res) > d
+% In other words if d = 1 an accuracy of 10% is guaranteed
+% if d = an accuracy of 1% is guaranteed
+% Note1 - fit residuals are calculated as res = model - data
+% Note2 - In fitting noisy data, this option should be relaxed otherwise
+% the function try to fit accurately the random oscillations due to the
+% noise
+% 
+% 'RMSE' if r is the parameter value, then the algorithm check that the
+% step-by-step Root Mean Squared Error variation is less than 10^-r 
+
+plfit1 = plist('FS',1,... % Sampling frequency for the model filters
+  'AutoSearch','on',... % Automatically search for a good model
+  'StartPolesOpt','c1',... % Define the properties of the starting poles - complex distributed in the unitary circle
+  'maxiter',50,... % maximum number of iteration per model order
+  'minorder',2,... % minimum model order
+  'maxorder',9,... % maximum model order
+  'weightparam','abs',... % assign weights as 1./abs(data)
+  'ResLogDiff',2,... % Residuals log difference
+  'ResFlat',[],... % Rsiduals spectral flatness (no need to assign this parameter for the moment)
+  'RMSE',7,... % Root Mean Squared Error Variation
+  'Plot','on',... % set the plot on or off
+  'ForceStability','on',... % force to output a stable ploes model
+  'CheckProgress','off'); % display fitting progress on the command window
+
+% Do the fit
+fobj1 = zDomainFit(tf12,plfit1);
+% setting input and output units for fitted model
+fobj1(:).setIunits('m');
+fobj1(:).setOunits('V');
+
+%% 4.2) Fitting TF - checking residuals spectral flatness
+
+% Perform an automatic fit of TF data in order to identify a discrete
+% model. The parameters controlling fit accuracy are
+% 
+% 'ResFlat' Check that normalized fit residuals spectral flatness is larger
+% than the parameter value. Admitted values for the parameter are 0<r<1.
+% Suggested values are 0.5<r<0.7.
+% Note - normalized fit residuals are calculated as
+% res = (model - data)./data
+% Note2 - This option could be useful with noisy data, when ResLogDiff
+% option is not useful
+% 
+% 'RMSE' if r is the parameter value, then the algorithm check that the
+% step-by-step Root Mean Squared Error variation is less than 10^-r 
+
+plfit2 = plist('FS',1,... % Sampling frequency for the model filters
+  'AutoSearch','on',... % Automatically search for a good model
+  'StartPolesOpt','c1',... % Define the properties of the starting poles - complex distributed in the unitary circle
+  'maxiter',50,... % maximum number of iteration per model order
+  'minorder',2,... % minimum model order
+  'maxorder',9,... % maximum model order
+  'weightparam','abs',... % assign weights as 1./abs(data)
+  'ResLogDiff',[],... % Residuals log difference (no need to assign this parameter for the moment)
+  'ResFlat',0.65,... % Rsiduals spectral flatness
+  'RMSE',7,... % Root Mean Squared Error Variation
+  'Plot','on',... % set the plot on or off
+  'ForceStability','on',... % force to output a stable ploes model
+  'CheckProgress','off'); % display fitting progress on the command window
+
+fobj2 = zDomainFit(tf12,plfit2);
+% setting input and output units for fitted model
+fobj2(:).setIunits('m');
+fobj2(:).setOunits('V');
+
+%% 5) Evaluating accuracy
+
+% fobj1 and fobj2 are parallel bank of miir filters. Therofore we can
+% calculate filter response and compare with our starting model
+
+% set plist for filter response
+plrsp = plist('bank','parallel','f1',1e-5,'f2',0.5,'nf',100,'scale','log');
+
+% calculate filters responses
+rfilt = resp(filt,plrsp); % strating model response
+rfobj1 = resp(fobj1,plrsp); % result of first fit
+rfobj2 = resp(fobj2,plrsp); % result of second fit
+
+% plotting filters
+iplot(rfilt,rfobj1,rfobj2)
+
+% plotting difference
+iplot(abs(rfobj1-rfilt),abs(rfobj2-rfilt))
+
+%% 6) Comments
+
+% Decomposition in partial fractions of the starting filter provides
+% residues =
+% 
+%           0.531297296250259 -      0.28636710753776i
+%           0.531297296250259 +      0.28636710753776i
+%           0.937405407499481                         
+% 
+% 
+% poles =
+% 
+%           0.112984252455744 +     0.591265379634664i
+%           0.112984252455744 -     0.591265379634664i
+%          -0.275968504911487
+% 
+% If we look inside the fitted objects fobj1 and fobj2 the following
+% results can be extracted
+% rsidues =
+%           0.531391341497363 - i*0.286395031447695
+%           0.531391341497363 + i*0.286395031447695
+%           0.937201773620951
+% 
+% poles = 
+%           0.112971704620295 + i*0.591204610859687
+%           0.112971704620295 - i*0.591204610859687
+%          -0.276032231799774
+% 
+% Model order is correct and residues and poles values are accurate to the
+% third decimal digit.
+% 
+% With low order model the algorithm works fine. For higher order model the
+% algorithm is capable to provide a model within the prescribed accuracy
+% but the order could be not guaranteed. Lets see what happen with higher
+% order models opening the second exercise script:
+% TrainingSession_T5_Ex02.m
+
+