Mercurial > hg > ltpda
view m-toolbox/m/mdcs/mdc1_UTN/ltpda_series_derivative.m @ 11:9174aadb93a5 database-connection-manager
Add LTPDA Repository utility functions into utils.repository
author | Daniele Nicolodi <nicolodi@science.unitn.it> |
---|---|
date | Mon, 05 Dec 2011 16:20:06 +0100 |
parents | f0afece42f48 |
children |
line wrap: on
line source
function varargout = ltpda_series_derivative(varargin) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % DESCRIPTION: LTPDA_SERIES_DERIVATIVE performs the numeric time derivative % using the method of five points stencil Taylor series expansion [1]. % The function can perform the first, second, third and fourth derivetive % of a series of input data. % % % % CALL: Deriv = ltpda_series_derivative(a, ... , pl) % % % INPUTS: % - Aos containing the data to be differentiated. % - pl: is a parameter list containing the options for the % calculation. Parameters are: % - 'ORDER' whose accepeted options are: % - 'FIRST' perform the first derivative using the % couefficients vector d1 = [1 -8 0 8 -1]./(12*T) % - 'SECOND' perform the second derivative using the % coefficients vector d2 = [-1 16 -30 16 -1]./(12*T^2) % - 'THIRD' perform the third derivative using the % coefficients vector d3 = [-1 2 0 -2 1]./(2*T^3) % - 'FOURTH' perform the third derivative using the % coefficients vector d4 = [1 -4 6 -4 1]./(T^4) % % NOTE1: T is the sampling period % NOTE2: The default option for 'ORDER' is 'SECOND' % % % % OUTPUTS: % - Deriv is avector containing the resulting Aos after % differentiation % % % REFERENCES: % [1] S. E. Koonin and D. C. Meredith, COMPUTATIONAL PHYSICS - % Fortran Version, 1990, Westview Press % % % VERSION: $Id: ltpda_series_derivative.m,v 1.1 2008/04/24 16:13:12 luigi Exp $ % % HISTORY: 18-03-2008 L Ferraioli % Creation % % The following call returns a parameter list object that contains the % default parameter values: % % >> pl = ltpda_series_derivative('Params') % % The following call returns a string that contains the routine CVS version: % % >> version = ltpda_series_derivative('Version') % % The following call returns a string that contains the routine category: % % >> category = ltpda_series_derivative('Category') % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Standard history variables ALGONAME = mfilename; VERSION = '$Id: ltpda_series_derivative.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 category if 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 end end %% Collect input ao's, plist's and ao variable names in_names = {}; for ii = 1:nargin in_names{end+1} = inputname(ii); % Collect the inputs names end [as, pl, invars] = collect_inputs(varargin, in_names); % produce one parameter list if isa(pl, 'plist') pl = combine(pl, getDefaultPL()); else pl = getDefaultPL(); end %% Initialize outputs bs = []; %% Go through analysis objects % Assigning coefficients values based on the input options switch find(pl, 'ORDER') case 'FIRST' Coeffs = [1 -8 0 8 -1]./12; case 'SECOND' Coeffs = [-1 16 -30 16 -1]./12; case 'THIRD' Coeffs = [-1 2 0 -2 1]./2; case 'FOURTH' Coeffs = [1 -4 6 -4 1]; end for jj = 1:numel(as) a = as(jj); phi = a.data.y; fs = get(a, 'fs'); T = 1/fs; %% Building vectors for calculation phi_temp = [phi(1);phi(1);phi(1);phi(1);phi;phi(end);phi(end);phi(end);phi(end)]; % Switching between the input options switch find(pl, 'ORDER') case 'FIRST' Deriv = (1/T).*(Coeffs(1)*phi_temp(1:end-4) + Coeffs(2)*phi_temp(2:end-3) + Coeffs(3)*phi_temp(3:end-2) + Coeffs(4)*phi_temp(4:end-1) + Coeffs(5)*phi_temp(5:end)); Deriv = Deriv(3:end-2); case 'SECOND' Deriv = (1/T^2).*(Coeffs(1)*phi_temp(1:end-4) + Coeffs(2)*phi_temp(2:end-3) + Coeffs(3)*phi_temp(3:end-2) + Coeffs(4)*phi_temp(4:end-1) + Coeffs(5)*phi_temp(5:end)); Deriv = Deriv(3:end-2); case 'THIRD' Deriv = (1/T^3).*(Coeffs(1)*phi_temp(1:end-4) + Coeffs(2)*phi_temp(2:end-3) + Coeffs(3)*phi_temp(3:end-2) + Coeffs(4)*phi_temp(4:end-1) + Coeffs(5)*phi_temp(5:end)); Deriv = Deriv(3:end-2); case 'FOURTH' Deriv = (1/T^4).*(Coeffs(1)*phi_temp(1:end-4) + Coeffs(2)*phi_temp(2:end-3) + Coeffs(3)*phi_temp(3:end-2) + Coeffs(4)*phi_temp(4:end-1) + Coeffs(5)*phi_temp(5:end)); Deriv = Deriv(3:end-2); end %% Building output Aos % Creating new time series data Deriv = tsdata(Deriv,fs); Deriv = set(Deriv, 'name', ... sprintf('ltpda_parfit_derivative(%s)', a.data.name), ... 'xunits', a.data.xunits, 'yunits', 'm/s^2'); % make new history objects h = history(ALGONAME, VERSION, pl, a.hist); h = set(h, 'invars', invars); % make output analysis objects b = ao(Deriv, h); clear Deriv % name, mfilename, description for these objects b = setnh(b, 'name', sprintf('ltpda_parfit_derivative(%s)', invars{jj}),... 'description', find(pl,'description')); %% Output the data bs = [bs b]; clear a b end %% Reshape the ouput to the same size of the input varargout{1} = reshape(bs, size(as)); %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % FUNCTION: getDefaultPL % % DESCRIPTION: Get default params % % HISTORY: 01-02-2008 M Hueller % Creation % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function plo = getDefaultPL() plo = plist('NAME', 'ltpda_parfit_derivative', 'ORDER', 'SECOND', ... 'DESCRIPTION','Series Expansion Derivative Method'); % END