文章转载自:http://blog.sina.com.cn/s/blog_bb81c2230102xdbl.html  如果有侵权,请联系博主删除

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.结果与分析

5.源代码

%***********************************************

%该程序使用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)

title('绝对误差')

Wiener维纳滤波基本原理及其算法实现相关推荐

  1. 基于维纳滤波的语音增强算法 matlab,基于维纳滤波语音增强算法的改进实现

    通过对维纳滤波的介绍,实现了基本维纳滤波效果;利用两级维纳滤波和两级滤波器组滤波方法实现了语音增强,达到了良好的效果. 维普资讯 http://doc.docsou.com 文章编号:0 2 8 8 ...

  2. 传统语音增强——基于先验信噪比的维纳滤波语音降噪算法

    一.基于先验信噪比的维纳滤波语音降噪算法的基本概念 改进的维纳滤波器为基于先验信噪比的维纳滤波器,其原理框图下图所示. 对于第m帧带噪语音信号ym(n)=sm(n)+nm(n) 式中,sm(n)是第m ...

  3. 传统语音增强——基本的维纳滤波语音降噪算法

    一.维纳滤波的基本原理 基本维纳滤波就是用来解决从噪声中提取信号问题的一种过滤(或滤波)方法.它基于平稳随机过程模型,且假设退化模型为线性空间不变系统的.实际上这种线性滤波问题,可以看成是一种估计问题 ...

  4. 神经网络的基本原理,神经网络算法三大类

    1.神经网络是什么? 生物神经网络主要是指人脑的神经网络,它是人工神经网络的技术原型. 人脑是人类思维的物质基础,思维的功能定位在大脑皮层,后者含有大约10^11个神经元,每个神经元又通过神经突触与大 ...

  5. java jvm垃圾回收算法_深入理解JVM虚拟机2:JVM垃圾回收基本原理和算法

    本文转自互联网,侵删 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 喜欢的话麻烦点下Star哈 文章将同步到我的个人博客: www.how ...

  6. 深入理解JVM虚拟机2:JVM垃圾回收基本原理和算法

    JVM GC基本原理与GC算法 Java的内存分配与回收全部由JVM垃圾回收进程自动完成.与C语言不同,Java开发者不需要自己编写代码实现垃圾回收.这是Java深受大家欢迎的众多特性之一,能够帮助程 ...

  7. 限流的基本原理及算法实现

    一.限流的基本原理 它的目的是确保系统高效.稳定地运行,确保请求能够快速处理的同时,保障系统不被流量压垮. 限流通常是利用某种算法实现限流器,来达到限制流量的目的.通常,限流器中会有一个定时器,它主要 ...

  8. python算法的基本原理_kNN算法基本原理与Python代码实践

    kNN是一种常见的监督学习方法.工作机制简单:给定测试样本,基于某种距离度量找出训练集中与其最靠近的k各训练样本,然后基于这k个"邻居"的信息来进行预测,通常,在分类任务中可使用& ...

  9. 神经网络算法的基本原理,神经网络算法通俗解释

    神经网络算法原理 4.2.1概述人工神经网络的研究与计算机的研究几乎是同步发展的. 1943年心理学家McCulloch和数学家Pitts合作提出了形式神经元的数学模型,20世纪50年代末,Rosen ...

最新文章

  1. [Java] 基本資料包裝類別 Wrapper Classes
  2. python编程培训多少钱-线下python培训要多少钱?
  3. Spring Security(一):整合JWT
  4. boost::fusion::make_unfused用法的测试程序
  5. Python脚本监控线上AMQ Number of Pending Messages数量
  6. 职高计算机自我鉴定800字,中专生自我鉴定800字与中专生计算机专业自我鉴定汇编...
  7. Eclipse中看不到jsp的页面效果
  8. 10 个十分难得的 javascript 开发经验
  9. java多线程批量读取文件(七)
  10. 关于java和C语言i=i++问题描述
  11. fluent并行 linux_windows 系统下启动linux主机群的fluent并行操作.docx
  12. Java NIO 基础
  13. 计算机管理系统工具共享文件夹,win7一键共享工具【管理方式】
  14. 使用大神写的wz框架
  15. a-table及相关组件的使用
  16. 技术部团队及英文简称
  17. MATLAB绘制xyz的分段函数,matlab绘制分段函数
  18. 【视频分类】3D-ResNets-PyTorch复现
  19. Android开发 之 线性渲染 LinearGradient
  20. Android 测试知识点总结

热门文章

  1. python-成都Python课程
  2. python练手经典100例-Python入门练手100例
  3. Android科大讯飞语音识别源码及API下载
  4. ICRoute 语音识别芯片/声控芯片 用声音去沟通 LD332X系列语音识别芯片
  5. 语音识别技术原理是什么 讯飞语音识别技术特点介绍【详解】
  6. 杭州有那些APP外包公司?
  7. Vue源码分析 - observer.js
  8. json日期格式化 java_java_Java Web程序中利用Spring框架返回JSON格式的日期,返回Json时格式化日期Date 第一 - phpStudy...
  9. 光伏机器人最前线_高工机器人走进光伏:数字化车间未来可期
  10. 【java笔记】类/接口作为成员变量类型