matlab 实现中值滤波

平均滤波器不能滤除信号中的脉冲噪声,而中值滤波器可以消除部分脉冲噪声
中值滤波器的原理:
按照样本的幅值排序,然后选择其中的中值,作为滤波器的输出

代码实现如下:

clear all; clf
N=200;
n=0:N-1;

%产生200个脉冲噪声,生成脉冲噪声数组
for m=1:N,
    d=randn(1, 1);
    if d >= 0.95,
        noise(m)=-1.5;
    else
        noise(m)=0;
    end
end

%画噪声信号
subplot(511);
t=0:1:N-1;
plot(t, noise);
title('噪声信号');

%画原信号
x=[2*cos(pi*n(1:100)/256) zeros(1, 100)];
subplot(512);
t=0:1:N-1;
plot(t, x);
title('原信号');

%画噪声信号+原信号
y1=x+noise;
subplot(513);
t=0:1:N-1;
plot(t, y1);
title('噪声信号+原信号');

%画均值滤波后的信号
z2=average(15, y1);
subplot(514);
t=0:1:N-1;
plot(t, z2);
title('均值滤波后的信号');

%y1(-2)y1(3) 进行中值滤波,得到z1(1)
z1(1)=median([0 0 y1(1)  y1(2) y1(3)]);
%y1(-1)y1(4) 进行中值滤波,得到z1(2)
z1(2)=median([0 y1(1)  y1(2) y1(3) y1(4)]);
%y1(197)y1(201) 进行中值滤波,得到z1(199)
z1(N-1)=median([y1(N-3)  y1(N-2)  y1(N-1)  y1(N)  0]);
%y1(198)y1(202) 进行中值滤波,得到z1(200)
z1(N)=median([y1(N-2)  y1(N-1)  y1(N)  0  0]);
%y1(1)y1(200) 进行中值滤波,得到其他值z1(3)z1(198)
for k=3:N-2,
    z1(k)=median([y1(k-2)  y1(k-1)  y1(k)  y1(k+1) y1(k+2)]);
end

%画中值滤波后的信号
subplot(515);
t=0:1:N-1;
plot(t, z1);
title('中值滤波后的信号');

function y=average(M, x)
    b=1/M*ones(1, M);
    y=filter(b, 1, x);
end

在这里插入图片描述

可以看出中值滤波比平均滤波效果好一些

这里不得不补充说明:中值滤波的好坏取决于脉冲噪声的宽度,如果生成的脉冲宽度很窄,那么中值滤波的效果就会很好。(因为脉冲噪声信号的生成是随机的,所以中值滤波的效果也不能保证。)

运行多此后总会生成一个比较适合中值滤波处理的脉冲噪声

在这里插入图片描述

  • 2
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值