Mercurial > hg > ltpda
diff m-toolbox/classes/+utils/@math/diffStepFish.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/classes/+utils/@math/diffStepFish.m Wed Nov 23 19:22:13 2011 +0100 @@ -0,0 +1,113 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Look for differentiation step for a given parameter and +% +% Parameters are: + +% +% $Id: diffStepFish.m,v 1.2 2011/09/19 06:17:45 miquel Exp $ +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +function best = diffStepFish(i1,i2,S11,S12,S21,S22,N,meval,params,ngrid,ranges,freqs,inNames,outNames) + +% remove aux file if existing +if exist('diffStepFish.txt') == 2 + ! rm diffStepFish.txt +end + +step = ones(ngrid,numel(params)); +% build matrix of steps +% for ii = 1:length(params) +% step(:,ii) = [] logspace(ranges(1,ii),ranges(2,ii),ngrid); +% end +for ii = 1:ngrid + step(ii,:) = ranges(1,:); +end + +% step(:,1) = logspace(ranges(1,1),ranges(2,1),ngrid); + +for kk = 1:length(params) + step(:,kk) = logspace(log10(ranges(1,kk)),log10(ranges(2,kk)),ngrid); + Rmat = []; + for jj = 1:ngrid + for ii = 1:length(params) + tic + % differentiate numerically + dH = meval.parameterDiff(plist('names', params(ii),'values',step(jj,ii))); + % create plist with correct outNames (since parameterDiff change them) + out1 = strrep(outNames{1},'.', sprintf('_DIFF_%s.',params{ii})); % 2x2 case + out2 =strrep(outNames{2},'.', sprintf('_DIFF_%s.',params{ii})); + spl = plist('set', 'for bode', ... + 'outputs', {out1,out2}, ... + 'inputs', inNames, ... + 'reorganize', true,... + 'f', freqs); + % do bode + d = bode(dH, spl); + % assign according matlab's matrix notation: + % H(1,1)->h(1) H(2,1)->h(2) H(1,2)->h(3) H(2,2)->h(4) + d11(ii) = d.objs(1); + d21(ii) = d.objs(2); + d12(ii) = d.objs(3); + d22(ii) = d.objs(4); + + end + + fs = S11.fs; + % scaling of PSD + % PSD = 2/(N*fs) * FFT *conj(FFT) + C11 = N*fs/2.*S11.y; + C22 = N*fs/2.*S22.y; + C12 = N*fs/2.*S12.y; + C21 = N*fs/2.*S21.y; + + % compute elements of inverse cross-spectrum matrix + InvS11 = (C22./(C11.*C22 - C12.*C21)); + InvS22 = (C11./(C11.*C22 - C12.*C21)); + InvS12 = (C21./(C11.*C22 - C12.*C21)); + InvS21 = (C12./(C11.*C22 - C12.*C21)); + + + % compute Fisher Matrix + for i =1:length(params) + for j =1:length(params) + + v1v1 = conj(d11(i).y.*i1.y + d12(i).y.*i2.y).*(d11(j).y.*i1.y + d12(j).y.*i2.y); + v2v2 = conj(d21(i).y.*i1.y + d22(i).y.*i2.y).*(d21(j).y.*i1.y + d22(j).y.*i2.y); + v1v2 = conj(d11(i).y.*i1.y + d12(i).y.*i2.y).*(d21(j).y.*i1.y + d22(j).y.*i2.y); + v2v1 = conj(d21(i).y.*i1.y + d22(i).y.*i2.y).*(d11(j).y.*i1.y + d12(j).y.*i2.y); + + FisMat(i,j) = sum(real(InvS11.*v1v1 + InvS22.*v2v2 - InvS12.*v1v2 - InvS21.*v2v1)); + end + end + + detFisMat = det(FisMat); + R = [step(jj,:) detFisMat]; + save('diffStepFish.txt','R','-ascii','-append'); + Rmat = [Rmat; R]; + + toc + end + + % look for the stable step: compute diff and + % look for the smallest one in absolute value + % The smallest slope marks the plateau + diffDetFisMat = abs(diff(Rmat(:,end))); + lowdet = diffDetFisMat(1); + ind = 2; + for k = 1:numel(diffDetFisMat) + if diffDetFisMat(k) < lowdet + lowdet = diffDetFisMat(k); + ind = k+1; % index give by diff = x(2) - x(1). We take the step corresponding to x(2) + end + end + + step(:,kk) = step(jj,kk)*ones(ngrid,1); + +end + +step(:,end) = logspace(log10(ranges(1,end)),log10(ranges(2,end)),ngrid); +best = step(1,:); + +end +