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

我试着在不损坏信号的情况下移除这些尖峰信号,我尝试了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我已经去掉了尖峰,但信号的一些明显的峰值也消失了,如下图所示

如何以一种简单的方式实现最佳去噪?
谢谢
发布于 2017-03-22 16:21:26
您可以使用中值滤波器或移动平均滤波器。不管是什么过滤器,你都需要使用某种阈值。阈值尖峰,并用您的过滤结果替换它们。
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])

发布于 2017-03-22 21:36:42
如果您可以升级到R2017a,您可能想要检查filloutliers函数。有各种方法可以用来检测尖峰,类似地,关于如何填充尖峰也有各种各样的选择。
如果您希望基本上获得一个中值滤波器,但仅在尖峰上,那么您可以指定'movmedian'作为find方法,'center'作为fill方法。
https://stackoverflow.com/questions/42944461
复制相似问题