我有以下包含一些失真数据的信号
我试图在不损坏信号的情况下移除这些尖峰,我尝试了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
我已经摆脱了尖峰,但是一些信号的明显峰值消失了,如下图所示
如何以简单的方式实现最佳去噪?
由于
答案 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])
答案 1 :(得分:1)
如果您可以升级到R2017a,您可能需要查看filloutliers
功能。您可以使用各种方法来检测尖峰,同样可以选择多种方法来填充尖峰。
如果您希望基本上获得中值过滤器,但仅限于峰值,则可以指定'movmedian'
作为查找方法,'center'
作为填充方法。