function varargout = ltpda_free_dynamics(varargin)%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% DESCRIPTION: DATA_REDUCTION converts interferometer data to acceleration% data. This function returns the free dynamics without the action of the% controller circuit. The commanded force has to be subtracted in order to% obtain the output force noise%%% CALL: b = ltpda_free_dynamics(varargin);% ltpda_free_dynamics(varargin);%% INPUTS: % - Aos containing the interferometer data. Aos must be supplied in% couples.% - plist containing the parasitic stiffness and the cross talk% coefficient. The default structure of the plist is:% plo = plist('pstiff1', -13e-7,'pstiff2', -20e-7,'cross_talk',% -1e-4, 'METHOD', 'PARFIT')% - 'pstiff1' is the square of the parasitic stiffness per unit of mass of TM1% - 'pstiff2' is the square of the parasitic stiffness per unit of mass of TM2% - 'cross_talk' is the sensitivity of the differential channel% to x1% - 'METHOD' define the method you want to use for the% calculation of the derivatives. Possible values are:% - 'PARFIT' makes use of the five points stencil parabolic% fit approximation [1] to calculate the derivatives% - 'SERIES' makes use of the five points stencil taylor% series approximation [2] to calculate the derivatives% % Es: b = ltpda_free_dynamics(ao1, ao2);% % Es: b = ltpda_free_dynamics(ao1, ao2, pl);% %%% OUTPUTS: % a vector of Aos containing the data obtained by the application of% the free dynamics to the input data (interferometer data)%% REFERENCES:% [1] L. Carbone et al., Physical Review D 75, 042001 (2007)% [2] S. E. Koonin and D. C. Meredith, COMPUTATIONAL PHYSICS -% Fortran Version, 1990, Westview Press%% VERSION: $Id: ltpda_free_dynamics.m,v 1.1 2008/04/24 16:13:12 luigi Exp $% % HISTORY: 18-03-2008 L Ferraioli% Creation%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Standard history variablesALGONAME = mfilename;VERSION = '$Id: ltpda_free_dynamics.m,v 1.1 2008/04/24 16:13:12 luigi Exp $';CATEGORY = 'Signal Processing';%% Check if this is a call for parameters, the CVS version string% or the method categoryif nargin == 1 && ischar(varargin{1}) in = char(varargin{1}); if strcmpi(in, 'Params') varargout{1} = getDefaultPL(); return elseif strcmpi(in, 'Version') varargout{1} = VERSION; return elseif strcmpi(in, 'Category') varargout{1} = CATEGORY; return endend%% Collect input ao's, plist's and ao variable namesin_names = {};for ii = 1:nargin in_names{end+1} = inputname(ii);end[as, pl, invars] = collect_inputs(varargin, in_names);% Checks that the input AOs come in pairsif rem(length(as),2) warning('The input AOs must come in pairs!'); returnend% produce one parameter listif isa(pl, 'plist') pl = combine(pl, getDefaultPL());else pl = getDefaultPL();end%% Initialize outputs% bs = [];%% Defining Constantsfs = get(as(1),'fs');wpx1 = find(pl, 'pstiff1');wpx2 = find(pl, 'pstiff2');dSD1 = find(pl, 'cross_talk');T = 1/fs;%% Defining plist for derivative functions% In this case we need only second order derivatives and zero order in% case we want to use the parabolic fit methodpl_2diff = plist('NAME', 'Second deriv plist', 'ORDER', 'SECOND');pl_0diff = plist('NAME', 'Zero deriv plist', 'ORDER', 'ZERO');%% Going through analysis objectsfor jj = 1:2:numel(as)/2 % Extracts the input data a1 = as(jj); a2 = as(jj+1); %% Applying "free dynamics" to data using the differentiation method %% defined in the input plist switch find(pl, 'METHOD') case 'PARFIT' d2_a1 = ltpda_parfit_derivative(a1, pl_2diff); d0_a1 = ltpda_parfit_derivative(a1, pl_0diff); d2_a2 = ltpda_parfit_derivative(a2, pl_2diff); d0_a2 = ltpda_parfit_derivative(a2, pl_0diff); b1 = d2_a1 + wpx1.*d0_a1; b12 = -dSD1.*d2_a1 + (wpx2-wpx1-(dSD1*wpx2)).*d0_a1; b22 = d2_a2 + wpx2.*d0_a2; b2 = b12 + b22; clear b12 b22 case 'SERIES' d2_a1 = ltpda_series_derivative(a1, pl_2diff); d2_a2 = ltpda_series_derivative(a2, pl_2diff); b1 = d2_a1 + wpx1.*a1; b12 = -dSD1.*d2_a1 + (wpx2-wpx1-(dSD1*wpx2)).*a1; b22 = d2_a2 + wpx2.*a2; b2 = b12 + b22; clear b12 b22 end % name, mfilename, description for these objects b1 = setnh(b1, 'name', sprintf('ltpda_free_dynamics(%s)', invars{jj}),... 'description', find(pl,'description')); b2 = setnh(b2, 'name', sprintf('ltpda_free_dynamics(%s)', invars{jj+1}),... 'description', find(pl,'description'));% bs = [bs b1 b2];% clear('b1', 'b2');end% %% Reshape the ouput to the same size of the input% % varargout{1} = reshape(bs, size(as));%% outputsif nargout == 2 varargout{1} = b1; varargout{2} = b2;elseif nargout == 1 varargout{1} = [b1 b2];end%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% FUNCTION: getDefaultPL%% DESCRIPTION: Get default params%% HISTORY: 01-02-2008 M Hueller% Creation%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%function plo = getDefaultPL()plo = plist('pstiff1', -13e-7,'pstiff2', -20e-7,'cross_talk', -1e-4,'METHOD', 'PARFIT', ... 'DESCRIPTION','Application of the free dynamics to interferometer data');