完整的实验报告下载链接
一、实验原理
自适应滤波器由参数可调的数字滤波器和自适应算法两部分组成。 自适应滤波与维纳滤波、卡尔曼滤波最大的区别在于,自适应滤波在输出与滤波系统之间存在有反馈通道,根据某一时刻滤波器的输出与期望信号的误差调整滤波器的系数,从而实现滤波器系数的动态调整,实现最优滤波。
1.1 信号模型
自适应滤波的目的仍然是从观测信号中提取真实准确的期望信号,因此涉及到的信号有:1)期望信号 d(n)
2)输入信号 x(n)=d(n)+v(n)
3)输出信号 y(n)
1.2 算法原理
一个M阶滤波器,系数为w(m),则输出为:y(n)=Σw(m)x(n-m) m=0…M,写成矩阵形式:y(j)=WT(j)*X(j),n时刻的输出误差为: e(j)=d(j)-y(j)= d(j)- WT(j)*X(j),
定义目标函数为 E[e(j)^2],则有:J(j)=E[e(j)^2]= E[(d(j)- WT(j)*X(j))^2]。
当上述误差达到最小时,即实现最优滤波,这种目标函数确定的为最小方差自适应滤波。对于目标函数J(j),需要求得使其取到最小值对应的W,这里使用梯度下降法进行最优化:W(j+1)=W(j)+1/2*μ(-▽J(j))
▽J(j)=-2E[X(j)*( d(j)- WT(j)*X(j))]= -2E[X(j)e(j)]
W(j+1)=W(j)+μE[X(j)e(j)]
其中-2X(j)e(j)称为瞬时梯度,因为瞬时梯度是真实梯度的无偏估计,这里可以使用瞬时梯度代替真实梯度。W(j+1)=W(j)+μX(j)e(j)
由此,可以得到自适应滤波最佳系数的迭代公式。
二、实验内容
设计一个自适应滤波器,结合一定应用,对语音、图像、视频等某种对象进行处理。
三、实验过程及结果
此次实验拟对图像进行去噪操作,实现灰度图像复原。
3.1 准备含噪声图像
准备一张彩色图像,首先将彩色图像转化为灰度图像,代码操作如图3.1所示。
图3.1 彩色图转化为灰度图的代码句式
接着在原始图像上人为加入均值为0、标准差为0.1的高斯噪声,以供后续使用,效果展示如图3.2。
图3.2 产生含噪声图像效果
3.2 自适应滤波器去噪
选择窗口大小为9*9的自适应滤波器进行滤波处理,结果如图3.3所示。
图3.3 自适应滤波器滤波后的效果
通过对比,自适应滤波器处理后的图像明显比噪声图像清晰很多,界限也相对分明,效果显著。若将滤波后图像与原图像相比,随有处理不到位的地方,但几乎接近原图,效果显著。
四、总结与展望
通过实验实现自适应滤波器对图像去噪的处理,达到图像复原的效果。进一步体会到了自适应滤波器的原理,通过不断地缩小误差,以寻求最优化。此次实验较为简单,后续还可以尝试自适应滤波器对语音、视频等的处理,并添加一些如LMS等的算法,以求得更好结果。
五、附录
5.1 产生噪声图像的程序
function [gImg] = addGaussianNoise(avg,std)
img1=imread('E:\matlab\work\suijishuzixinhaochuli\colorful.jpg');
img=rgb2gray(img1);
[imgH,imgW]=size(img);
% 产生和图像维度相同的噪声,叠加到图像上
gImg=uint8((double(img)/255+avg+std*randn(imgH,imgW))*255);
figure();
subplot(2,2,1);
imshow(img),title('原始图像');
subplot(2,2,2);
imshow(gImg),title('均值为'+string(avg)+'标准差为'+string(std)+'的高斯噪声图像');
5.2 自适应滤波器图像复原的程序
function []=adaptFilter(fsize)
% 获取均值为0,标准差为0.1的高斯噪声图像
gImg = double(addGaussianNoise(0,0.1));
[imgH,imgW]=size(gImg);
gNewImg = gImg;
% 根据滤波器尺寸计算半长
if mod(fsize,2)
flength = (fsize-1)/2;
else
flength = fsize/2;
end
for i=1+flength:imgH-flength
for j=1+flength:imgW-flength
gTemp = gImg(i-flength:i+flength,j-flength:j+flength);
avg = mean(gTemp(:));
v = var(gTemp(:));
gNewImg(i,j)=gImg(i,j)-255*255*0.01/v*(gImg(i,j)-avg);
end
end
gImg = uint8(gImg);
gNewImg=uint8(gNewImg);
subplot(2,2,3); imshow(gImg),title('高斯噪声图像');
subplot(2,2,4); imshow(gNewImg),title('自适应滤波器(窗口大小为' + string(fsize) + ')处理后图像'); end