function F=pos_correct_all(F,err,t,max_diff);
% Замена данных с кодом ошибки ~= 80 (линейной интерполЯцией)
% и отдельного выброса (импульса) с амплитудой больше заданной
%
%      F=pos_correct_all(F,err,t[,max_diff]);
%
%        F - исходные данные
%      err - коды ошибок [80] - нормальное измерение
%        t - вектор времени измерениЯ (в условных единицах)
% max_diff - допустимое отклонение единичного выброса (импульса), 
%            по умолчанию = 7

% 15.01.2004 -  1) ввод значениЯ max_diff как аргумента
%               2) выброс обрабатываетсЯ, если градиенты имеют разные знаки
% 27.07.2006 -  код ошибки [84] (низкое отношение сигнал/шум) не
%               обрабатывается

% set difference limit to default value
if nargin<4,
   max_diff=7;
end

% Correct the measurements with abnormal conditions (Err~=80)
kerr=err~=80 & err~=84;  % abnormal measurements
tmp=interp1(t(~kerr),F(~kerr),t(kerr));
F(kerr)=tmp;
if sum(kerr)>0,
   disp(['"pos_correct_all.m" -> Correction of ERR~=80 & ERR~=84 ... ' num2str(sum(kerr))])
end
   
% Correct the measurements with single large deviations
%max_diff=7; % limits of deviations
tmp=[]; nsum=0;
dF=diff(F);
ks=find(abs(dF)>=max_diff)+1;
if sum(ks)>0,
   kdiff=ks(diff(ks)==1);   % indeces of single deviated measurements
   nsum=0;
   for k=1:length(kdiff),
       % учитываем, только если градиенты имеют разные знаки
        if sign(dF(kdiff(k)-1))~=sign(dF(kdiff(k))),
            F(kdiff(k))=mean([F(kdiff(k)-1) F(kdiff(k)+1)]);
            nsum=nsum+1;
		tmp(nsum)=kdiff(k);
        end
   end
end
if nsum>0,
   disp(['"pos_correct_all.m" -> Correction diff(F) >= ' ...
      num2str(max_diff) ' nT ... ' num2str(nsum)])
end

% сохранЯем длЯ протокола
fid=fopen('pos_correct_log.tmp','w');
fprintf(fid,'%d\n',tmp');
fclose(fid);
%save pos_correct_protocol.tmp tmp -ascii