Wiener维纳滤波基本原理及其算法实现

To learn, to share, to debate, then comes progress.

1.算法背景:

信号滤波的实质为从观测信号中提取有效信号,随着数学理论的发展与实际应用的需求,基于不同原理的滤波方法被不断地提出来,虽然依据的准则,推导的过程各有差异,但最终的目的均是减小信号估计的误差,使滤波系统的输出信号尽可能地接近实际信号。
Wiener滤波是第二次世界大战中,为了解决火力控制系统精确跟踪问题,Wiener相继提出了平稳随机过程的最优线性滤波理论,首次将数理统计知识和线性系统理论联系起来,形成了对随机信号作平滑,滤波和预测的最新估计理论。在此后的发展中,Wiener滤波被应用于更多的领域,并沿用至今。

2.算法原理:

(1)有限长滤波器
对于一列输入信号x,一般的无限长线性滤波器输出为:

  • y(n)= Σh(m)x(n-m) m=0…∞

实际中,滤波器的长度,即阶数是有限长的,设为M,则有:

  • y(n)= Σh(m)x(n-m) m=0…M

即滤波器的当前时刻输出为前M个时刻的值经过加权之后得到的。
为便于书写与理解,上式可以写为矩阵形式:

  • y(n)=H(m)*X(n)

如果期望信号d已知,则可以计算输出与期望信号之间的误差:

  • e(n)=d(n)-y(n)= d(n)- H(m)*X(n) m=0…M

Wiener滤波的目标就是,如何确定一个长为M的系数序列H,使得上述误差值最小。
(2)最小均方误差滤波
根据目标函数的不同,又可以将滤波算法细分为不同的类别,一般来说有最小均方误差,最小二乘误差等等,这里只讨论最小均方误差。
令目标函数为:

  • Min E[e(n)^2]= E[(d(n)- H(m)*X(n))^2]

当滤波器的系数最优时,目标函数对系数的倒数应该为0,即:

  • dE[e(n)^2]/dH=0
  • 2 E[ (d(n)- H(m)X(n))] X(n)=0
  • E[(d(n) X(n))- H(m)E[X(n)X(n)]=0

根据随机过程的知识,上式可以表达为:

  • Rxd-H*Rxx=0

其中Rxd与Rxx分别为输入信号与期望信号的相关矩阵与输入信号的自相关矩阵。
从而有:

  • H=Rxx-1*Rxd

至此,便得到了Wiener滤波的基本原理与公式推导。

3.算法应用与实现

理解了算法的原理之后,下边举一个小的例子来考察如何应用Wienar滤波处理实际问题。
问题背景:一个点目标在x,y平面上绕单位圆做圆周运动,由于外界干扰,其运动轨迹发生了偏移。其中,x方向的干扰为均值为0,方差为0.05的高斯噪声;y方向干扰为均值为0,方差为0.06的高斯噪声。
问题分析与思路:
将物体的运动轨迹分解为X方向和Y方向,并假设两个方向上运动相互独立。分别将运动轨迹离散为一系列点,作为滤波器的输入,分别在两个方向上进行滤波,最终再合成运动轨迹。
程序设计思路:
生成期望信号-添加噪声-计算相关矩阵-求解最佳滤波器系数-滤波运算-输出信号-合成轨迹

4.源代码

%***********************************************
%该程序使用Wiener滤波方法对圆周运动轨迹进行控制
%信号模型:d=s+no  观测信号=期望信号+噪声信号
%进行一次Wiener滤波,得到最佳滤波器系数
17.4  by Howie
clear
close all
N=500;
theta=linspace(0,2*pi,N);           %极坐标参数
s_x=cos(theta);                     %x,y方向上的期望信号
s_y=sin(theta);
no_x=normrnd(0,sqrt(0.05),1,N);     %高斯白噪声
no_y=normrnd(0,sqrt(0.06),1,N);
d_x=s_x+no_x;                       %观测信号
d_y=s_y+no_y;
M=500;%M为滤波器的阶数
%% 对x方向上数据进行滤波
rxx=xcorr(d_x);
Rxx=zeros(N);
% temp=toeplitz(rxx);
for i=1:N                             %观测信号的相关矩阵
    for j=1:N
        Rxx(i,j)=rxx(N+i-j);
    end
end

rxd=xcorr(s_x,d_x);                      %观测信号与期望信号的相关矩阵
Rxd=rxd(N:N+M-1);                        %向量而非矩阵
hopt_x=Rxx\Rxd';
% de_x=conv(hopt_x,d_x);
de_x=zeros(1,N);
for n=1:N
   for i=1:n-1
       de_x(n)=de_x(n)+hopt_x(i)*d_x(n-i);
   end
end
de_x(1:2)=d_x(1:2);
ems_x=sum(d_x.^2)-Rxd*hopt_x;
e_x=de_x-s_x;
% de_x(N-1:N)=d_x(N-1:N);
%% 对y方向上数据进行滤波 处理思路同x方向
ryy=xcorr(d_y);
Ryy=zeros(N);
for i=1:N
    for j=1:N
        Ryy(i,j)=ryy(N+i-j);
    end
end
% temp=toeplitz(ryy);
% Ryy=temp(1:M,N:N+M-1);

ryd=xcorr(s_y,d_y);
% temp=toeplitz(ryd);
% Ryd=temp(1:N,N:length(temp));
Ryd=ryd(N:N+M-1);
hopt_y=Ryy\Ryd';
% de_y=conv(hopt_y,d_y);
de_y=zeros(1,N);
for n=1:N
   for i=1:n-1
       de_y(n)=de_y(n)+hopt_y(i)*d_y(n-i);
   end
end
de_y(1:2)=d_y(1:2);
ems_y=sum(d_y.^2)-Ryd*hopt_y;
e_y=de_y-s_y;
% de_y(N-1:N)=d_y(N-1:N);
%% plot
figure
plot(s_x,s_y,'r','linewidth',2)
hold on
plot(d_x,d_y,'b')
hold on
plot(de_x,de_y,'k-')
title('维纳滤波预测轨迹')
legend('期望轨迹','观测轨迹','滤波轨迹')
%% %% x方向上绘图
figure
suptitle('X方向上维纳滤波效果')
subplot(321)
plot(s_x)
title('期望信号')
subplot(322)
plot(no_x)
title('噪声信号')
subplot(323)
plot(d_x)
title('观测信号')
subplot(324)
plot(de_x)
title('滤波后信号')
subplot(325)
plot(ems_x,'o')
title('最小均方误差')
subplot(326)
plot(e_x)
title('绝对误差')
%% y方向上绘图
figure
suptitle('Y方向上维纳滤波效果')
subplot(321)
plot(s_y)
title('期望信号')
subplot(322)
plot(no_y)
title('噪声信号')
subplot(323)
plot(d_y)
title('观测信号')
subplot(324)
plot(de_y)
title('滤波后信号')
subplot(325)
plot(ems_y,'o')
title('最小均方误差')
subplot(326)
plot(e_y)
  • 26
    点赞
  • 197
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
维纳滤波Wiener filtering)是一种常用的图像复原算法,用于消除由噪声引起的图像模糊。在MATLAB中,维纳滤波可以通过以下步骤实现: 1. 读取待处理的图像,并将其转换为灰度图像(如果不是灰度图像)。 2. 对图像进行傅里叶变换,得到图像的频谱。 3. 计算噪声功率谱,可以通过对噪声进行统计估计或使用预先知道的噪声模型。 4. 根据维纳滤波公式,计算滤波函数的频域表达式。 5. 将滤波函数应用于图像的频谱。 6. 对滤波后的频谱进行逆傅里叶变换,得到复原后的图像。 下面是一个简单的MATLAB示例代码,演示了如何使用维纳滤波算法对图像进行复原: ```matlab % 读取待处理图像 originalImage = imread('input_image.jpg'); grayImage = rgb2gray(originalImage); % 傅里叶变换 fftImage = fftshift(fft2(double(grayImage))); % 估计噪声功率谱 noisePowerSpectrum = ... abs(fftshift(fft2(double(imnoise(grayImage, 'gaussian', 0, 0.01))))).^2; % 计算滤波函数的频域表达式 filter = conj(fftImage) ./ (abs(fftImage).^2 + noisePowerSpectrum); % 对频谱进行滤波 filteredImage = real(ifft2(ifftshift(filter .* fftImage))); % 显示原始图像和复原后的图像 figure; subplot(1, 2, 1); imshow(grayImage); title('原始图像'); subplot(1, 2, 2); imshow(filteredImage, []); title('复原后的图像'); ``` 请注意,这只是一个简单的示例,实际应用中可能需要根据具体情况进行一些参数和处理的调整。另外,这个示例代码假设噪声为高斯白噪声,如果噪声类型不同,可能需要进行相应的调整。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值