首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从信号中去除尖峰信号Matlab

从信号中去除尖峰信号Matlab
EN

Stack Overflow用户
提问于 2017-03-22 14:43:09
回答 2查看 6.5K关注 0票数 1

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

我试着在不损坏信号的情况下移除这些尖峰信号,我尝试了medfilt1函数,但它也平滑了不需要的正确信号。由于想要的信号和不想要的信号之间存在频率重叠,因此不能使用滤波。我还尝试了一个移动窗口,它会将该值与该窗口的中位数进行比较,如果该点比它高得多,它会将其设置为中位数,如下所示:

代码语言:javascript
复制
%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

我已经去掉了尖峰,但信号的一些明显的峰值也消失了,如下图所示

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

谢谢

EN

回答 2

Stack Overflow用户

发布于 2017-03-22 16:21:26

您可以使用中值滤波器或移动平均滤波器。不管是什么过滤器,你都需要使用某种阈值。阈值尖峰,并用您的过滤结果替换它们。

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2017-03-22 21:36:42

如果您可以升级到R2017a,您可能想要检查filloutliers函数。有各种方法可以用来检测尖峰,类似地,关于如何填充尖峰也有各种各样的选择。

如果您希望基本上获得一个中值滤波器,但仅在尖峰上,那么您可以指定'movmedian'作为find方法,'center'作为fill方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42944461

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档