移动平均线的问题在于,平均值对异常值的存在并不稳健——因此您需要一个非常大的窗口大小来“稀释”异常值。
尝试使用非线性滤波器,例如中值滤波器:对信号应用中值滤波器 - 您需要至少 300 个样本的窗口大小。计算原始信号和中值滤波版本之间的差异。如果差值高于阈值,则将信号替换为中值滤波版本。
这是一些scilab
尝试实现此建议的代码。结果绘制在此处;它似乎可以很好地处理伪造的数据。

function sm = smooth(x,len)
sm = filter(ones(1,len)/len,1,x);
endfunction
N = 6000;
x = 0.1*rand(1,N,'normal');
y = cumsum(x);
y = smooth(y,100);
clf
subplot(211);
plot(y)
Njumps = 20;
jump_indices = round(rand(1,Njumps)*N);
jump_length = 0;
y2 = y;
for idx = jump_indices,
y2(min(N,idx:(idx+jump_length))) = y(min(N,idx:(idx+jump_length))) + 1;
//plot(min(N,idx:(idx+jump_length)),y2(min(N,idx:(idx+jump_length))),'r')
jump_length = jump_length + 1;
end
plot(y2,'g');
filter_length = 10;
y3 = y;
for k = 1:N,
y3(k) = median(y3(max(1,min(N,(k-filter_length/2):(k+filter_length/2)))));
end
plot(y3,'k')
subplot(212);
plot(y-y2);
plot(y-y3,'r');