Matlab 消除信号中的尖峰

Matlab 消除信号中的尖峰,matlab,filtering,signal-processing,outliers,noise-reduction,Matlab,Filtering,Signal Processing,Outliers,Noise Reduction,我有以下信号,其中包含一些失真的数据 我试图在不破坏信号的情况下消除这些尖峰,我尝试了medfilt1功能,但它也平滑了不需要的正确信号。由于需要和不需要的信号之间存在频率重叠,因此无法使用滤波。我还尝试了一个移动窗口,该窗口会将该值与该窗口的中值进行比较,如果该点远高于该值,则会将其设置为中值,如下所示: %moving cleaning window y1_1= y1(1:100);%first window x=1; %cleaning loop while x<= leng

我有以下信号,其中包含一些失真的数据

我试图在不破坏信号的情况下消除这些尖峰,我尝试了
medfilt1
功能,但它也平滑了不需要的正确信号。由于需要和不需要的信号之间存在频率重叠,因此无法使用滤波。我还尝试了一个移动窗口,该窗口会将该值与该窗口的中值进行比较,如果该点远高于该值,则会将其设置为中值,如下所示:

%moving cleaning window
y1_1= y1(1:100);%first window
 x=1;
 %cleaning loop
while  x<= length(y1)
    if(y1(x)> 1.01*(median(y1_1))||y1(x) < 0.95*(median(y1_1)))
        y1(x)= median(y1_1);
    end
    if(x>= length(y1)-100)
        y1_1= y1(length(y1)-100:length(y1));
    else
     y1_1 = y1(x:x+100);
    end
     x=x+1;
end
%移动清洗窗口
y1_1=y1(1:100);%第一个窗口
x=1;
%清洗回路
而x1.01*(中位数(y1|u1))|y1(x)<0.95*(中位数(y1|u1)))
y1(x)=中值(y1_1);
结束
如果(x>=长度(y1)-100)
y1_1=y1(长度(y1)-100:长度(y1));
其他的
y1_1=y1(x:x+100);
结束
x=x+1;
结束
我已经去掉了尖峰,但是信号的一些明显的尖峰也消失了,如下图所示

如何以简单的方式实现最佳去噪


谢谢

您可以使用中值滤波器或移动平均滤波器。不管它是什么过滤器,都需要使用某种阈值。设置峰值阈值,并用筛选结果替换它们

s=rand(500,1)*5; 
s(ceil(rand(1,20)*500))=rand(1,20)*100; 
maxs=max(s);

figure
subplot(211); plot(s);

thr=10;
med_s=medfilt2(s,[10,1]); 
s(s>med_s+thr)=med_s(s>med_s+thr);
subplot(212); plot(s); ylim([0 maxs])

如果您可以升级到R2017a,您可能需要查看该功能。您可以使用各种方法来检测峰值,同样,也可以选择各种方法来填充峰值


如果您希望基本上获得中值滤波器,但仅在峰值上,则可以指定
'movmidian'
作为查找方法,指定
'center'
作为填充方法。

您是否尝试过:在这种特定情况下,并且仅当这是出于演示目的时,看起来您可以删除(或设置为
NaN
)所有值都在350以下和550以上。虽然我会将窗口集中在我感兴趣的点上,但您的代码看起来总体上是正常的。现在,您只需要在删除异常值时使用窗口和条件。尝试窗口为30,当点为2倍或中位数的一半时。或者改用findpeaks函数并使用它。@Dev-il我可以使用它,但我的信号可以有不同的电平(我将处理不同的信号)。齐兹·阿切尔,这可能是个好主意,我会试着把点放在窗口的中心,增加ot的尺寸。谢谢这是个好主意,我可能会下载试用版并查看结果。