0
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 1 % SPSDSUBTRACTION makes a sPSD-weighted least-square iterative fit
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 3 %
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 4 % DESCRIPTION: SPSDSUBTRACTION makes a sPSD-weighted least-square iterative fit
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 5 %
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 6 % CALL: [MPest, plOut, aoResiduum, aoP, aoPini] = spsdSubtraction(ao_Y, [ao_U1, ao_U2, ao_U3 ...]);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 7 % [MPest, plOut, aoResiduum, aoP, aoPini] = spsdSubtraction(ao_Y, [ao_U1, ao_U2, ao_U3 ...], pl);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 8 %
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 9 % The function finds the optimal M that minimizes the sum of the weighted sPSD of
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 10 % (ao_Y - M * [ao_U1 ao_U2 ao_U3 ...] )
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 11 % if ao_Y is a vector of aos, the use the matrix/spsdSubtraction is
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 12 % advised
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 13 %
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 14 % OUTPUTS: - MPest: output PEST object with parameter estimates
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 15 % - aoResiduum: residuum times series
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 16 % - plOut: plist containing data like the parameter estimates
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 17 % - aoP: last weight used in the optimization (fater last
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 18 % Maximization/Expectation step)
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 19 % - aoPini: initial weight used in the optimization (before first
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 20 % Maximization/Expectation step)
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 21 %
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 22 % <a href="matlab:utils.helper.displayMethodInfo('ao', 'spsdSubtraction')">Parameters Description</a>
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 23 %
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 24 % VERSION : $Id: spsdSubtraction.m,v 1.6 2011/08/03 19:21:10 adrien Exp $
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 25 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 26
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 27 function varargout = spsdSubtraction(varargin)
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 28
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 29 % use the caller is method flag
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 30 callerIsMethod = utils.helper.callerIsMethod;
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 31
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 32 % Check if this is a call for parameters
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 33 if utils.helper.isinfocall(varargin{:})
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 34 varargout{1} = getInfo(varargin{3});
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 35 return
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 36 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 37
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 38 % Collect input variable names
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 39 in_names = cell(size(varargin));
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 40 for ii = 1:nargin,in_names{ii} = inputname(ii);end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 41
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 42 if ~nargin>1
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 43 error('optSubtraction requires at least the two input aos as first and second entries')
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 44 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 45
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 46 %% retrieving the two input aos
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 47 [aos_in, ao_invars] = utils.helper.collect_objects(varargin(:), 'ao', in_names);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 48
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 49 aosY = varargin{1};
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 50 aosU = varargin{2};
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 51 if (~isa(aosY, 'ao')) || (~isa(aosU, 'ao'))
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 52 error('first two inputs should be two ao-arrays involved in the subtraction')
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 53 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 54
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 55 % Collect plist
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 56 pl = utils.helper.collect_objects(varargin(:), 'plist');
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 57
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 58 % Get default parameters
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 59 pl = combine(pl, getDefaultPlist);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 60
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 61 %% checking data sizes
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 62 NY = numel(aosY);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 63 if NY==0
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 64 error('Nothing to subtract to!')
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 65 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 66 NU = size(aosU,2);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 67 if NU==0
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 68 error('Nothing to subtract!')
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 69 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 70 if ~(size(aosY,2)==1)
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 71 error('The input ao Y array should be a column vector')
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 72 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 73 if ~(size(aosU,1)==NY)
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 74 error('The fields ''subtracted'' should be an array of aos with the height of numel(initial)')
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 75 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 76
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 77 %% collecting history
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 78 if callerIsMethod
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 79 % we don't need the history of the input
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 80 else
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 81 inhist = [aosY(:).hist aosU(:).hist];
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 82 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 83
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 84 %% retrieving general quantities
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 85 ndata = numel(aosY(1).y);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 86 Ts = 1/aosY(1).fs;
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 87 nFreqs = floor(ndata/2);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 88 freqs = 1/(2*Ts) * linspace(0,1,nFreqs);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 89
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 90 %% produce window
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 91 Win = find(pl, 'Win');
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 92 if isa(Win, 'plist')
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 93 Win = ao( combine(plist( 'length', ndata), Win) );
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 94 W = Win.y;
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 95 elseif isa(Win, 'ao')
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 96 if ~isa(Win.data, 'tsdata')
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 97 error('An ao window should be a time series')
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 98 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 99 W = Win.y;
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 100 if ~length(W)==ndata
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 101 error('signals and windows don''t have the same length')
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 102 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 103 else
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 104 error('input option Win is not acceptable (not a plist nor an ao)!')
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 105 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 106
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 107 %% get initial M coefficient matrix
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 108 M = pl.find('coefs');
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 109 if isempty(M)
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 110 M = zeros(1,NU);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 111 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 112
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 113 %% get criterion thinness
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 114 linCoef = pl.find('lincoef');
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 115 logCoef = pl.find('logcoef');
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 116
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 117 %% getting the input data Y and taking FFT
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 118 Y = zeros(NY, nFreqs);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 119 YLocNorm = zeros(NY,1);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 120
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 121 for ii=1:NY
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 122 if isempty(aosY(ii).data)
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 123 error('One ao for Y is empty!')
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 124 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 125 if ~(length(aosY(ii).y)==ndata)
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 126 error('various Y vectors do not have the same length')
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 127 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 128 yLoc = fft(aosY(ii).y .* W, ndata);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 129 YLocNorm(ii) = norm(aosY(ii).y .* W)/sqrt(ndata);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 130 Y(ii,:) = yLoc(1:nFreqs)/YLocNorm(ii);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 131 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 132
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 133 %% getting the data U norm
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 134 ULocNorm = zeros(NY,NU);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 135 for iU=1:NU
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 136 for iY=1:NY
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 137 if ~isempty(aosU(iY,iU).data)
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 138 ULocNorm(iY,iU,:) = norm(aosU(iY,iU).y .* W)/sqrt(ndata);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 139 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 140 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 141 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 142 ULocNorm = max(ULocNorm,[],1);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 143
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 144 %% getting the input data U and taking FFT
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 145 U = zeros(NY,NU, nFreqs);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 146 for iY=1:NY
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 147 for iU=1:NU
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 148 if ~isempty(aosU(iY,iU).data)
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 149 if ~(length(aosU(iY,iU).y)==ndata)
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 150 error('various U vectors do not have the same length as Y')
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 151 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 152 uLoc = fft(aosU(iY,iU).y .* W, ndata);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 153 U(iY,iU,:) = uLoc(1:nFreqs)/ (YLocNorm(iY) * ULocNorm(iU));
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 154 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 155 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 156 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 157
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 158 %% getting the weight powAvgWeight
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 159 weightingMethod =pl.find('weightingMethod');
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 160 switch lower(weightingMethod)
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 161 case 'pzmodel'
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 162 weightModel =pl.find('pzmodelWeight');
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 163 if numel(weightModel)~=NY
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 164 error('there should be as many pzmodels as weighted entries')
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 165 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 166 for ii=1:NY
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 167 weight = weightModel(ii).resp(freqs);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 168 weight = abs(weight).^2;
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 169 pow = [0 ; weight.y(2:nFreqs)];
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 170 [freqsAvg, powAvgs, nFreqsAvg, nDofs, binningMatrix] = ltpda_spsd(freqs, pow, linCoef, logCoef);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 171 powAvgWeight(ii,:) = powAvgs; %#ok<AGROW>
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 172 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 173 case 'ao'
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 174 weight = pl.find('aoWeight');
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 175 if numel(weight)~=NY
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 176 error('there should be as many AOs as weighted entries')
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 177 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 178 for ii=1:NY
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 179 if ~isa(weight(ii).data, 'fsdata')
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 180 error('if weight is an ao, it should be a FSdata')
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 181 elseif length(weight(ii).y)~=nFreqs
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 182 error(['length of FS weight is not length of the FFT vector : ' num2str(length(weight(ii).y)) ' instead of ' num2str(nFreqs)])
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 183 else
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 184 pow = weight(ii).y;
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 185 [freqsAvg, powAvgs, nFreqsAvg, nDofs, binningMatrix] = ltpda_spsd(freqs, pow, linCoef, logCoef);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 186 powAvgWeight(ii,:) = powAvgs; %#ok<AGROW>
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 187 %% add unit check here!!
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 188 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 189 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 190 case 'residual'
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 191 [freqsAvg, powAvgWeight, nFreqsAvg, nDofs, binningMatrix] = computeWeight(Y, M, U, freqs, linCoef, logCoef);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 192 otherwise
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 193 error('weighting method requested does not exist!')
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 194 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 195 powAvgInv = (powAvgWeight.*(nFreqsAvg.')./(nDofs.')).^-1;
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 196
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 197 %% get ME iterations termination conditions
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 198 iterMax = pl.find('iterMax');
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 199 normCoefs = pl.find('normCoefs');
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 200 normCriterion = pl.find('normCriterion');
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 201
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 202 %% Maximization Expectation iterations loop
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 203 for i_iter = 1:iterMax
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 204 utils.helper.msg(utils.const.msg.PROC3, ['starting iteration ', num2str(i_iter)]);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 205
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 206 %% initializing history
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 207 if i_iter==1 % storing intial weight
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 208 Pini = powAvgWeight;
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 209 MHist(1,:) = reshape(M, [1, numel(M)] );
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 210 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 211 fValIni = optimalCriterion(Y, M, U, powAvgInv, linCoef, logCoef);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 212
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 213 %% solving LSQ problem
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 214 [M, hessian] = solveProblem(M, Y, U, powAvgInv, nFreqsAvg, binningMatrix);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 215 fval = optimalCriterion(Y, M, U, powAvgInv, linCoef, logCoef);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 216
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 217 %% store history
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 218 fValHist(i_iter) = fval/fValIni; %#ok<AGROW>
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 219 MHist(i_iter+1,:) = reshape(M, [1, numel(M)] ); %#ok<AGROW>
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 220
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 221 %% updating weight, recomputing residuum power
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 222 [freqsAvg, powAvgWeight, nFreqsAvg, nDofs] = computeWeight(Y, M, U, freqs, linCoef, logCoef);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 223 powAvgInv = (powAvgWeight.*(nFreqsAvg.')./(nDofs.')).^-1;
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 224
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 225 %% deciding whether to pursue or not ME iterations
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 226 if strcmpi( weightingMethod, 'pzmodel')
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 227 display('One iteration for Pzmodel weighting only')
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 228 break
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 229 elseif strcmpi( weightingMethod, 'ao')
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 230 display('One iteration for ao weighting only')
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 231 break
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 232 elseif norm(fValHist(i_iter)-1) < normCriterion && norm(MHist(i_iter+1,:)-MHist(i_iter,:))<normCoefs
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 233 display(['Iterations stopped at iteration ' num2str(i_iter) ' because not enough progress was made (see parameter "normCriterion" and "normCoefs")'])
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 234 break
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 235 elseif i_iter == iterMax
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 236 display(['Iterations stopped at maximum number of iterations ' num2str(i_iter) ' (see parameter "iterMax")'])
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 237 break
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 238 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 239 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 240
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 241 %% creating output pest
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 242 MVals = M * diag( ULocNorm.^-1 );
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 243 MStd = diag(diag(ULocNorm) * hessian * diag(ULocNorm)).^-0.5;
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 244 MCov = diag(ULocNorm)^-1 * hessian^-1 * diag(ULocNorm)^-1;
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 245
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 246 % prepare model, units, names
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 247 model = [];
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 248 for jj = 1:NU
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 249 names{jj} = ['U' num2str(jj)]; %#ok<AGROW>
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 250 units{jj} = aosY(1).yunits / aosU(1,jj).yunits; %#ok<AGROW>
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 251 xunits{jj} = aosU(1,jj).yunits; %#ok<AGROW>
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 252 MNames{jj} = ['M' num2str(jj)]; %#ok<AGROW>
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 253 if jj == 1
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 254 model = ['M' num2str(jj) '*U' num2str(jj)];
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 255 else
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 256 model = [model ' + M' num2str(jj) '*U' num2str(jj)]; %#ok<AGROW>
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 257 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 258 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 259
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 260 model = smodel(plist('expression', model, ...
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 261 'params', MNames, ...
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 262 'values', MVals.', ...
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 263 'xvar', names, ...
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 264 'xunits', xunits, ...
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 265 'yunits', aosY(1).yunits ...
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 266 ));
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 267
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 268 % collect inputs names
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 269 argsname = aosY(1).name;
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 270 for jj = 1:numel(NU)
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 271 argsname = [argsname ',' aosU(jj).name];
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 272 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 273
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 274 % Build the output pest object
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 275 MPest = pest;
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 276 MPest.setY( MVals.' );
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 277 MPest.setDy(MStd);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 278 MPest.setCov(MCov);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 279 MPest.setChi2(0);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 280 MPest.setNames(names{:});
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 281 MPest.setYunits(units{:});
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 282 MPest.setModels(model);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 283 MPest.name = sprintf('optSubtraction(%s)', argsname);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 284
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 285 % Set procinfo object
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 286 MPest.procinfo = plist('MPsdE', 0);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 287 % Propagate 'plotinfo'
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 288 plotinfo = [aosY(:).plotinfo aosU(:).plotinfo];
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 289 if ~isempty(plotinfo)
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 290 MPest.plotinfo = combine(plotinfo);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 291 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 292
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 293 %% creating output plist
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 294 plOut = plist;
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 295
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 296 p = param({ 'criterion' , 'last value of the criterion in the last optimization'}, fval );
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 297 plOut.append(p);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 298 p = param({ 'M' , 'Best fitting value'}, MVals );
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 299 plOut.append(p);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 300 p = param({ 'Mhist' , 'History of the best fit, through iteration'}, MHist * diag( ULocNorm.^-1 ) );
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 301 plOut.append(p);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 302 p = param({ 'fValHist' , 'History of the criterion value, through iteration'}, fValHist );
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 303 plOut.append(p);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 304 p = param({ 'hessian' , 'fitting hessian'}, diag(ULocNorm) * hessian * diag(ULocNorm) );
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 305 plOut.append(p);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 306 %add history and use Mdata/Pest instead
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 307
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 308 %% creating aos for the weights used
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 309 if nargout>2
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 310 aoP = ao.initObjectWithSize(NY, 1);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 311 aoPini = ao.initObjectWithSize(NY, 1);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 312 for ii=1:NY
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 313 aoP(ii).setData(fsdata( freqsAvg, YLocNorm(ii)^2 * powAvgWeight(ii,:) ));
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 314 aoP(ii).setName('final weight');
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 315 aoP(ii).setXunits('Hz');
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 316 aoP(ii).setYunits(aosY(ii).yunits^2 * unit('Hz^-1'));
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 317 aoP(ii).setDescription(['final weight in the channel "' aosY(ii).name '"']);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 318 aoP(ii).setT0(aosY(ii).t0);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 319 aoPini(ii).setData(fsdata( freqsAvg, YLocNorm(ii)^2 * Pini(ii,:) ));
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 320 aoPini(ii).setName('initial weight');
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 321 aoPini(ii).setXunits('Hz');
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 322 aoPini(ii).setYunits(aosY(ii).yunits^2 * unit('Hz^-1'));
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 323 aoPini(ii).setDescription(['initial weight in the channel "' aosY(ii).name '"']);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 324 aoPini(ii).setT0(aosY(ii).t0);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 325 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 326 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 327
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 328 %% creating residuum time-series
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 329 if nargout>2
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 330 aoResiduum = ao.initObjectWithSize(NY,1);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 331 for ii=1:NY
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 332 aoResiduumValue = aosY(ii).y;
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 333 for jj = 1:NU
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 334 aoResiduumValue = aoResiduumValue - MVals(jj)*aosU(ii,jj).y;
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 335 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 336 aoResiduum(ii).setData(tsdata( aoResiduumValue, aosY(ii).fs ));
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 337 aoResiduum(ii).setName(['residual in the channel "' aosY(ii).name '"' ]);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 338 aoResiduum(ii).setXunits('s');
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 339 aoResiduum(ii).setYunits(aosY(ii).yunits);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 340 aoResiduum(ii).setDescription(['residual corresponding to "' aosY(ii).description '"' ]);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 341 aoResiduum(ii).setT0(aosY(ii).t0);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 342 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 343 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 344
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 345 %% adding history
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 346 if callerIsMethod
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 347 % we don't need to set the history
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 348 else
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 349 MPest.addHistory(getInfo('None'), pl, ao_invars, inhist);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 350 if nargout>2
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 351 for ii=1:NY
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 352 aoP(ii).addHistory(getInfo('None'), pl, ao_invars, inhist);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 353 aoPini(ii).addHistory(getInfo('None'), pl, ao_invars, inhist);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 354 aoResiduum(ii).addHistory(getInfo('None'), pl, ao_invars, inhist);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 355 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 356 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 357 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 358
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 359 %% return coefficients and hessian and Jfinal and powAvgWeight
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 360 if nargout>2
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 361 varargout = {MPest, plOut, aoResiduum, aoP, aoPini};
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 362 else
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 363 varargout = {MPest, plOut};
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 364 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 365 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 366
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 367 %% weight for optimal criterion
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 368 function [freqsAvg, powAvgWeight, nFreqsAvg, nDofs, binningMatrix] = computeWeight(Y, M, U, freqs, linCoef, logCoef)
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 369 errDft = subtraction( Y, M, U);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 370 errPow = real(errDft).^2 + imag(errDft).^2;
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 371 for ii=1:size(errDft,1)
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 372 [freqsAvg, powAvgs, nFreqsAvg, nDofs, binningMatrix] = ltpda_spsd(freqs, errPow, linCoef, logCoef);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 373 powAvgWeight(ii,:) = powAvgs; %#ok<AGROW>
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 374 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 375 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 376
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 377 %% optimal criterion
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 378 function j = optimalCriterion(Y, M, U, powAvgInv, linCoef, logCoef)
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 379 errDft = subtraction(Y, M, U);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 380 errPow = real(errDft).^2 + imag(errDft).^2;
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 381 j = 0;
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 382 for ii=1:size(errDft,1)
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 383 [freqsAvg, powAvgs, nFreqsAvg, nDofs] = ltpda_spsd([], errPow, linCoef, logCoef); %#ok<ASGLU>
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 384 powSum = powAvgs .* nDofs; % binning frequencies as in sPSD
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 385 j = j + sum( powSum .* powAvgInv(:,ii) );
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 386 % alpha = 4;
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 387 % logProbaDensityFactor = - nFreqsAvg * log(2) - gammaln(nFreqsAvg);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 388 % normlzChi2Sum = ((alpha*2)*powSum) .* powAvgInv(:,ii); % divide the sum by the expected average of each terms, so the chi2 is normalized
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 389 % logProbaDensities = logProbaDensityFactor + (nFreqsAvg-1).*log(normlzChi2Sum) - normlzChi2Sum/2 ; % here computing log of probability
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 390 % j = j - sum(logProbaDensities); % better than taking product of probabilities
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 391 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 392 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 393
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 394 %% time-series subtraction function
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 395 function Y = subtraction( Y, M, U)
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 396 ndata = size(Y,2);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 397 for ii=1:size(Y,1)
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 398 for j=1:numel(M)
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 399 Y(ii,:) = Y(ii,:) - reshape( M(j)*U(ii,j,:) , [1,ndata] );
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 400 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 401 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 402 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 403
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 404 %% Direct solver
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 405 function [M, hessian] = solveProblem(M, Y, U, powAvgInv, nFreqsAvg, binningMatrix)
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 406 errDft = subtraction(Y, M, U);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 407 NU = size(U,2);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 408 NFreqs = size(binningMatrix,2);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 409 ATB = zeros(NU,1);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 410 ATA = zeros(NU,NU);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 411 % matrix for frequency binning & Weighting & Summing :
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 412 matBSW = powAvgInv * binningMatrix;
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 413 for iiParam = 1:NU
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 414 Uii = reshape(U(1,iiParam,:), [1 NFreqs]);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 415 ATB(iiParam) = 2 * ( matBSW * real( Uii .* conj(errDft) ).' );
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 416 for jjParam = 1:NU
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 417 Ujj = reshape(U(1,jjParam,:), [1 NFreqs]);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 418 ATA(iiParam,jjParam) = 2 * ( matBSW * real( Uii .* conj(Ujj) ).' );
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 419 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 420 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 421 try
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 422 MUpdate = ATA^-1 * ATB;
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 423 M = M + MUpdate.';
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 424 catch
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 425 warning('Numerical accuracy limited the number of iterations')
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 426 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 427 hessian = ATA;
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 428 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 429
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 430
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 431 %--------------------------------------------------------------------------
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 432 % Get Info Object
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 433 %--------------------------------------------------------------------------
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 434 function ii = getInfo(varargin)
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 435 if nargin == 1 && strcmpi(varargin{1}, 'None')
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 436 sets = {};
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 437 pl = [];
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 438 else
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 439 sets = {'Default'};
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 440 pl = getDefaultPlist;
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 441 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 442 % Build info object
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 443 ii = minfo(mfilename, 'ao', 'ltpda', utils.const.categories.op, '$Id: spsdSubtraction.m,v 1.6 2011/08/03 19:21:10 adrien Exp $', sets, pl);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 444 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 445
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 446 %--------------------------------------------------------------------------
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 447 % Get Default Plist
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 448 %--------------------------------------------------------------------------
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 449 function plout = getDefaultPlist()
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 450 persistent pl;
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 451 if exist('pl', 'var')==0 || isempty(pl)
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 452 pl = buildplist();
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 453 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 454 plout = pl;
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 455 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 456
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 457 function pl = buildplist()
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 458 pl = plist;
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 459
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 460 % initial coefficients for subtraction initialization
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 461 p = param({ 'coefs' , 'initial subtracted coefficients, must be a nY*nU double array. If not provided zeros are assumed'}, [] );
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 462 pl.append(p);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 463
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 464 % weighting scheme
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 465 p = param({ 'weightingMethod' , 'choose to define a frequency weighting scheme'}, {1, {'residual', 'ao', 'pzmodel'}, paramValue.SINGLE} );
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 466 pl.append(p);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 467
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 468 p = param({ 'aoWeight' , 'ao to define a frequency weighting scheme (if chosen in ''weightingMethod'')'}, ao.initObjectWithSize(0,0) );
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 469 pl.append(p);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 470
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 471 p = param({ 'pzmodelWeight' , 'pzmodel to define a frequency weighting scheme (if chosen in ''weightingMethod'')'}, pzmodel.initObjectWithSize(0,0) );
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 472 pl.append(p);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 473
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 474 p = param({ 'lincoef' , 'linear coefficient for scaling frequencies in chi2'}, 5 );
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 475 pl.append(p);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 476
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 477 p = param({ 'logcoef' , 'logarithmic coefficient for scaling frequencies in chi2'}, 0.3 );
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 478 pl.append(p);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 479
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 480 % iterations convergence stop criterion
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 481 p = param({ 'iterMax' , 'max number of Mex/Exp iterations'}, 20 );
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 482 pl.append(p);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 483
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 484 p = param({ 'normCoefs' , 'tolerance on inf norm of coefficient update (used depending on ''CVCriterion'')'}, 1e-15 );
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 485 pl.append(p);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 486
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 487 p = param({ 'normCriterion' , 'tolerance on norm of criterion variation (used depending on ''CVCriterion'')'}, 1e-15 );
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 488 pl.append(p);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 489
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 490 % windowing options
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 491 p = param({ 'win' , 'window to operate FFT, may be a plist/ao'}, plist('win', 'levelledHanning', 'PSLL', 200, 'levelOrder', 4 ) );
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 492 pl.append(p);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 493
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 494 % display
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 495 p = param({ 'display' , 'choose how much to display of the optimizer output'}, {1, {'off', 'iter', 'final'}, paramValue.SINGLE} );
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 496 pl.append(p);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 497
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 498 % optimizer options
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 499 p = param({ 'maxcall' , 'maximum number of calls to the criterion function'}, 5000 );
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 500 pl.append(p);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 501
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 502 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 503
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 504