Mercurial > hg > ltpda
diff m-toolbox/test/LTPDA_training/topic5/TrainigSession_T5_Ex03.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_Ex03.m Wed Nov 23 19:22:13 2011 +0100 @@ -0,0 +1,89 @@ +% Training session Topic 5 exercise 03 +% +% Generation of noise with given psd +% +% 1) Load fsdata object from file +% 2) Fit psd of test data with zDomainFit +% 3) Genarate noise from fitted model +% 4) Fit psd of test data with curvefit +% 5) Genarate noise from fitted model +% 6) Compare results +% +% L FERRAIOLI 22-02-09 +% +% $Id: TrainigSession_T5_Ex03.m,v 1.3 2009/02/25 18:18:45 luigi Exp $ +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%% 1) load fsdata + +% load test noise AO from file +tn = ao(plist('filename', 'topic5\T5_Ex03_TestNoise.xml')); +tn.setName; + +%% 2) Fitting psd of test data with zDomainFit + +%% 2.1) We try to identify a proper model for the psd of loaded data + +% making psd ot test data - we need some average otherwise the fitting +% algorithm is not able to run correctly +tnxx1 = tn.psd(plist('Nfft',2000)); + +% Removing first bins +tnxx1r = split(tnxx1,plist('split_type', 'frequencies', 'frequencies', [2e-3 5e-1])); +iplot(tnxx1r) + +% finding proper weights for noisy data +stnxx = smoother(tnxx1r); +wgh = 1./(abs(stnxx.data.y)); + +%% 2.2) Fitting + +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',10,... % minimum model order + 'maxorder',45,... % maximum model order + 'weights',wgh,... % assign externally calculated weights + 'ResLogDiff',[],... % Residuals log difference (no need to assign this parameter for the moment) + 'ResFlat',0.77,... % Rsiduals spectral flatness + 'RMSE',5,... % Root Mean Squared Error Variation + 'Plot','on',... % set the plot on or off + 'ForceStability','off',... % we do not need a stable filter + 'CheckProgress','off'); % display fitting progress on the command window + +% Do the fit +[param1,fmod1] = zDomainFit(tnxx1r,plfit1); + +%% 3) Generating noise from model psd + +% noisegen1D is a noise coloring tool. It accept as input a white noise +% time series and output a colored noise time series with one sided psd +% matching the model specifiend into the parameters + +% Generate white noise +a1 = ao(plist('tsfcn', 'randn(size(t))', 'fs', 1, 'nsecs', 10000,'yunits','m')); + +plng = plist(... + 'model', abs(fmod1), ... % model for colored noise psd + 'MaxIter', 50, ... % maximum number of fit iteration per model order + 'PoleType', 2, ... % generates complex poles distributed in the unitary circle + 'MinOrder', 20, ... % minimum model order + 'MaxOrder', 50, ... % maximum model order + 'Weights', 2, ... % weight with 1/abs(model) + 'Plot', false,... % on to show the plot + 'Disp', false,... % on to display fit progress on the command window + 'RMSEVar', 7,... % Root Mean Squared Error Variation + 'FitTolerance', 2); % Residuals log difference + +ac1 = noisegen1D(a1, plng); + +%% 4) Checking results + +% Calculating psd of generated data +acxx1 = ac1.psd(plist('Nfft',2000)); + +% Comparing with starting data +iplot(tnxx1,acxx1) +