从信号Matlab中删除尖峰

时间:2017-03-22 06:43:09

标签: matlab filtering signal-processing outliers noise-reduction

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

Raw signal

我试图在不损坏信号的情况下移除这些尖峰,我尝试了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

我已经摆脱了尖峰,但是一些信号的明显峰值消失了,如下图所示

Output of actual program

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

由于

2 个答案:

答案 0 :(得分: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])

enter image description here

答案 1 :(得分:1)

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

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