我有下面的信号,其中包含一些扭曲的数据
我想在不破坏信号的情况下移除这些刺钉我试过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
我已经摆脱了尖峰,但也有一些信号的明显的高峰不见了,如图所示,在波纹管
如何以简单的方式实现最佳去噪?
谢谢
3条答案
按热度按时间ufj5ltwl1#
您可以使用中值滤波器或移动平均滤波器。无论是哪种滤波器,您都需要使用某种阈值。对尖峰进行阈值处理,然后将其替换为您的滤波结果。
xeufq47z2#
如果你可以升级到R2017a,你可能想看看
filloutliers
功能。有各种方法可以用来检测尖峰,同样也有各种选择如何填充它们。如果您希望基本上得到一个中值滤波器,但仅针对尖峰,则可以指定
'movmedian'
作为find方法,'center'
作为fill方法。bqucvtff3#
您可以尝试使用一个小得多的窗口。由于尖峰的两个相邻值似乎都很好地代表了真实信号,因此长度为3的窗口可以解决您的问题。通常,较长的窗口会使您的信号失真更多。
此外,计算成本将大大减少与一个较小的窗口。