function X=remove_spikes(X,dX_lim);
% чистка единичных выбросов (импульсов, spike) - заменой на NaN
%
%     X=remove_spikes(X,dX_lim);
%
% X - ряд вычищаемых данных (на выходе - почищенный ряд)
% dX_lim - величина выброса, при которой он выбраковывается (заменяется
%           на NaN);
%
% ВНИМАНИЕ! При быстрых изменениях данных возможны удаления лишних значений

% 18.09.2010 - С.Ю.Хомутов, Новосибирск
% 06.06.2015 - исправлено для рядов с сильными градиентами

if nargin<2,
    error('!!! Не все входные параметры заданы !!!');
end

k_nan=sum(isnan(X));

kp=diff(X)>dX_lim; km=diff(X)<=-dX_lim;
% Ищем положительные импульсы
k1=find(and(kp(1:length(kp)-1), km(2:length(km))))+1;
% Ищем отрицательные импульсы
k2=find(and(kp(2:length(kp)), km(1:length(km)-1)))+1;
X(k1)=NaN; X(k2)=NaN;

% чистим крайние значения
% предполагается, что если только ОДНО крайнее значение вылетает, то это не
% СКАЧОК
if abs(X(1)-X(2))>dX_lim,
    X(1)=NaN;
end
if abs(X(length(X))-X(length(X)-1))>dX_lim,
    X(length(X))=NaN;
end

k_nan_new=sum(isnan(X))-k_nan;
if k_nan_new>0,
    disp([sprintf('Чистка выбросов по уровню %7.2f -> %d',dX_lim,k_nan_new) ' значения заменены на NaN ...'])
end
