5、维纳滤波
维纳滤波是一种二维自适应除噪滤波器,根据局部方差来调整滤波器效果。对于去除高斯噪声效果明显。
维纳滤波的两个函数wiener2与deconvwnr都能够完成维纳滤波的功能,但两者具有差异性,感兴趣的可以自己去了解,MATLAB中维纳滤波代码如下:
y=wiener2(x,[m,n]);
x指原始CSI的幅值;y指维纳滤波后的幅值;[m,n]指定滤波器窗口大小为m*n,默认值为3*3。
load('raw_amp'); m=5; n=5; best_amp3=wiener2(raw_amp,[m,n]); figure(7) plot(raw_amp); title('原始幅值'); ylabel('幅值'); figure(8) plot(best_amp3); title('维纳滤波'); ylabel('幅值');
维纳滤波处理前后的幅值图像:
图9 维纳滤波处理前
图10 维纳滤波处理后
6、状态统计滤波器
它的滤波概念是中值滤波的推广,中值滤波是对于给定的n个数值{al ,a2,...,an},将它们按大小顺序排列,取中间的那个值作为滤波器的输出。而状态统计滤波器将n个非零数值按小到大排序后处于第k个位置的元素作为滤波器的输出。MATLAB中状态统计滤波器可以用ordfilt2函数表示:
y=ordfilt2(x,order,domain);
x指原始CSI的幅值;y指状态统计滤波后的幅值;order 为滤波器输出的顺序值;domain为滤波窗口;
(1)y=ordfilt2(x,13,ones(5,5)),在模板内的像素值都为非零时,相当于模板为5×5的中值滤波(order=13,刚好为窗口的中间值);
(2)y=ordfilt2(x,1,ones(5,5)),在模板内的像素值都为非零时,相当于5×5的最小值滤波(order=1,刚好为窗口的最小值);
(3)y=ordfilt2(x,25,ones(5,5)),在模板内的像素值都为非零时,相当于5×5的最大值滤波(order=25,刚好为窗口的最大值);
load('raw_amp'); order = 10; domain = ones(5,5); best_amp4=ordfilt2(raw_amp,order,domain); figure(8) plot(raw_amp); title('原始幅值'); ylabel('幅值'); figure(9) plot(best_amp4); title('状态统计滤波器'); ylabel('幅值');
状态统计滤波器处理前后的幅值图像:
图11 状态统计滤波器处理前
图12 状态统计滤波器处理后