Skip to content
Snippets Groups Projects
dev_moveaverage.m 2.13 KiB
Newer Older
function [smooth,nval] = tsg_moveaverage(time, param, timeInterval, stdLim)
%
% Perform a moving average of a time series.
% The average is made over a period equal to 'timeinterval'
% 
% Data exceeding the average over that period by stdLim
% are not taken into account.
%
% Input
% time ............... date in Matlab serial number
% param............... parameter to smooth
% timeInterval ....... time interval used to compute the mean
% stdLim ............. Maximum standard deviation admitted
%
% Output
% smooth ............. time series para smoothed
% nval ............... nb values used to compute the mean in every interval
%
% time, para, smooth, nval are column vector of the same size
%
% Si pas de calcul possible valeur a NaN
%

% Memory allocation
% -----------------
smooth = zeros( size(param) );
nval   = zeros( size(param) );

% Loop over the param time series
% -------------------------------
for i = 1:length(param)
 
	% Select the param data over timeInterval interval
    % ind1 : indices of Param in the timeInterval
    % ind2 : indices of 'good' Param in the timeInterval
    % ---------------------------------------------------
    ind1 = find( time >= time(i) - timeInterval/2 & ...
                 time  <= time(i) + timeInterval/2 );
	ind2 = ind1;
    
    if ~isempty(ind2)
        
		currentStd   = Inf;
        previousStd = 0;
        
        while currentStd > stdLim && currentStd ~= previousStd
			
            previousStd = currentStd; 
            
            % Standard deviation and average over timeInterval
            % ------------------------------------------------
			currentStd = nanstd(  param(ind2) ); 
            meanParam  = nanmean( param(ind2) );
            
			% Indices of 'good' values of Param
            % ---------------------------------
            ind2 = find( param(ind1) >= meanParam - currentStd & ...
                         param(ind1) <= meanParam + currentStd);
            ind2 = ind1( ind2 );
        end
     
        smooth(i) = nanmean( param(ind2) );
    else
        smooth(i) = NaN;
    end
    nval( i ) = length( ind2 );
end