去除信号中的尖峰信号Matlab

gab6jxml  于 2023-04-12  发布在  Matlab
关注(0)|答案(3)|浏览(555)

我有下面的信号,其中包含一些扭曲的数据

我想在不破坏信号的情况下移除这些刺钉我试过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

我已经摆脱了尖峰,但也有一些信号的明显的高峰不见了,如图所示,在波纹管

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

ufj5ltwl

ufj5ltwl1#

您可以使用中值滤波器或移动平均滤波器。无论是哪种滤波器,您都需要使用某种阈值。对尖峰进行阈值处理,然后将其替换为您的滤波结果。

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])

xeufq47z

xeufq47z2#

如果你可以升级到R2017a,你可能想看看filloutliers功能。有各种方法可以用来检测尖峰,同样也有各种选择如何填充它们。
如果您希望基本上得到一个中值滤波器,但仅针对尖峰,则可以指定'movmedian'作为find方法,'center'作为fill方法。

bqucvtff

bqucvtff3#

您可以尝试使用一个小得多的窗口。由于尖峰的两个相邻值似乎都很好地代表了真实信号,因此长度为3的窗口可以解决您的问题。通常,较长的窗口会使您的信号失真更多。
此外,计算成本将大大减少与一个较小的窗口。

相关问题