matlab 实现中值滤波

Posted 胡刚2016

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

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

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

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

以上是关于matlab 实现中值滤波的主要内容,如果未能解决你的问题,请参考以下文章

STM32H7的DSP教程第48章 STM32H7的中值滤波器实现,适合噪声和脉冲过滤(支持逐个数据的实时滤波)

MATLAB-中值滤波原理实现及应用

MATLAB-中值滤波原理实现及应用

MATLAB-中值滤波原理实现及应用

STM32F429的DSP教程第48章 STM32F429的中值滤波器实现,适合噪声和脉冲过滤(支持逐个数据的实时滤波)

STM32F407的DSP教程第48章 STM32F407的中值滤波器实现,适合噪声和脉冲过滤(支持逐个数据的实时滤波)