维纳滤波及其简单实现

介绍

随机信号包括了确定信号和随机噪声两部分。维纳滤波的本质是设计一组冲击响应的函数,抑制信号中的随机噪声部分,或者说非预期信号部分,使得信号与预期值的均方误差达到最小。

基本概念

在开始维纳滤波的介绍前,先描述一下几个基本的概念
以下只给出离散过程的公式

  1. 自相关函数
    为了描述随机变量X(n),X(n+t),在不同时刻下的相互联系,引入了自相关函数
    t为间隔,t>0。
    R x x ( t ) = E [ X ( n ) ∗ X ( n + t ) ] R_{xx}(t) = E[X(n)*X(n+t)] Rxx(t)=E[X(n)X(n+t)]
    作为一种预期,这里自相关函数只与间隔有关,与起始时间无关。同时,要注意到,自相关函数是关于时间间隔t的偶函数,既有 R x x ( t ) = R x x ( − t ) R_{xx}(t)=R_{xx}(-t) Rxx(t)=Rxx(t)
  2. 互相关函数
    描述不同随机过程引入的随机序列的相互关系
    R X Y ( t ) = E [ X ( n ) ∗ Y ( n + t ) ] R_{XY} (t)= E[X(n)*Y(n+t)] RXY(t)=E[X(n)Y(n+t)]
    并且满足: R X Y ( t ) = R Y X ( − t ) R_{XY} (t)= R_{YX} (-t) RXY(t)=RYX(t)
  3. 维纳滤波原理
    本质上,维纳滤波是设计一个冲击响应函数h,对观察到的信号序列X进行滤波,使得其与期望信号S的最小平方和达到最小值。
    假设信号S的长度为N,下标从0开始计算, S = [ s ( 0 ) , ⋯   , s ( N − 1 ) ] , s ( i ) ∈ R S = [s(0),\cdots,s(N-1)],s(i) \in \mathbb{R} S=[s(0),,s(N1)],s(i)R,
    对于滤波器h而言,其滤波过程如下,
    对n时刻的信号估计值
    s ^ ( n ) = ∑ m = 0 n h ( m ) x ( n − m ) \hat{s}(n) = \sum_{m=0}^{n}h(m)x(n-m) s^(n)=m=0nh(m)x(nm)
    维纳滤波器的目标如下:
    m i n   E ( e n 2 ) = E ( [ s ( n ) − s ^ ( n ) ] 2 ) min \ E(e_n^2) = E([s(n)-\hat{s}(n)]^2) min E(en2)=E([s(n)s^(n)]2)
    h ( i ) h(i) h(i)对上式进行求导,由最小值条件得到
    E ( [ s ( n ) − s ^ ( n ) ] ∗ x ( n − i ) ) = 0 ⇒ E [ s ( n ) x ( n − i ) ] − E [ ∑ m = 0 n h ( m ) x ( n − m ) ∗ x ( n − i ) ] = 0 E([s(n)-\hat{s}(n)]*x(n-i) )= 0 \Rightarrow \\ E[s(n)x(n-i)]- E[\sum_{m=0}^{n}h(m)x(n-m)*x(n-i)] =0 E([s(n)s^(n)]x(ni))=0E[s(n)x(ni)]E[m=0nh(m)x(nm)x(ni)]=0
    整理上式,结合相关函数的性质可以得到
    E [ s ( n ) x ( n − i ) ] = R s x ( − i ) = R x s ( i ) E [ h ( m ) x ( n − m ) ∗ x ( n − i ) ] = h ( m ) E ( x ( n − m ) ∗ x ( n − i ) ) = h ( m ) R x x ( m − i ) R x s ( i ) = ∑ m = 0 n h ( m ) R x x ( m − i ) E[s(n)x(n-i)] = R_{sx}(-i) =R_{xs}(i) \\ E[h(m)x(n-m)*x(n-i)] = h(m)E(x(n-m)*x(n-i)) = h(m)R_{xx}(m-i) \\ R_{xs}(i) = \sum_{m=0}^{n}h(m)R_{xx}(m-i) E[s(n)x(ni)]=Rsx(i)=Rxs(i)E[h(m)x(nm)x(ni)]=h(m)E(x(nm)x(ni))=h(m)Rxx(mi)Rxs(i)=m=0nh(m)Rxx(mi)
    对于长度为N的滤波器h,则有
    [ R x s ( 0 ) ⋮ R x s ( i ) ⋮ R x s ( N − 1 ) ] = [ R x x ( 0 ) ⋯ R x x ( i ) ⋯ R x x ( N − 1 ) ⋮ ⋱ ⋮ ⋮ R x x ( − i ) ⋯ R x x ( 0 ) ⋯ R x x ( N − 1 − i ) ⋮ ⋮ ⋱ ⋮ R x x ( 1 − N ) ⋯ R x x ( i − N + 1 ) ⋯ R x x ( 0 ) ] [ h ( 0 ) ⋮ h ( i ) ⋮ h ( N − 1 ) ] \begin{bmatrix} R_{xs}(0) \\ \vdots \\ R_{xs}(i) \\ \vdots \\R_{xs}(N-1) \end{bmatrix}= \begin{bmatrix} R_{xx}(0)& \cdots & R_{xx}(i) & \cdots & R_{xx}(N-1)\\ \vdots&\ddots & \vdots& & \vdots\\ R_{xx}(-i) & \cdots & R_{xx}(0) & \cdots & R_{xx}(N-1-i)\\ \vdots& & \vdots &\ddots & \vdots\\ R_{xx}(1-N) & \cdots & R_{xx}(i-N+1) & \cdots & R_{xx}(0) \end{bmatrix} \begin{bmatrix} h(0) \\ \vdots \\ h(i) \\ \vdots \\h(N-1) \end{bmatrix} Rxs(0)Rxs(i)Rxs(N1)=Rxx(0)Rxx(i)Rxx(1N)Rxx(i)Rxx(0)Rxx(iN+1)Rxx(N1)Rxx(N1i)Rxx(0)h(0)h(i)h(N1)
    将上式进行简化,得到 R X S = R X X ∗ h ⇒ h = R X X − 1 R X S RXS =RXX*h \Rightarrow h = RXX^{-1}RXS RXS=RXXhh=RXX1RXS
    R X X RXX RXX是一个对称矩阵,且对角线元素都是 R x x ( 0 ) R_{xx}(0) Rxx(0),在下面构造RXX矩阵的时候利用了这一点。

简单实现过程

  1. 构造正弦信号s
  2. 加入白噪声noise
  3. 合成最终信号 x = s+noise
  4. 生成RXX矩阵和RXS向量
  5. 计算h滤波器
  6. 信号还原并显示计算结果

matlab实现

clear;
N=600;               %data size and filter size
theta=linspace(0,2*pi,N);
s=sin(theta);
noise=normrnd(0,sqrt(0.05),1,N);    %noise
x = s+noise;
RXX = ConstructRxxMatrix(x);
RXS = ConstructRxsVector(x,s);
h = RXX\RXS;
%recovery s1 from x using h filter
s1 = zeros(N,1);
for i = 1:1:N
    frag1 = h(1:i);frag2 = x(i:-1:1);
    s1(i) = dot(frag1,frag2);
end
subplot(2,2,1);plot(s);title('expected signal');
subplot(2,2,2);plot(x);title('real signal');
subplot(2,2,3);plot(noise);title('white noise');
subplot(2,2,4);plot(s1);title('denoise signal');
%Calc Rxs(t)  && only handle t>0 
function r = RelateValue(x,s,t)
n  = length(x);
frag1 = s(1+t:n);frag2 = x(1:(n-t));
r = dot(frag1,frag2);
end
%Construct Rxx Matrix%
function Rxx = ConstructRxxMatrix(x)
n = length(x);
Rxx = zeros(n);
RV = zeros(n,1);
for i = 1:1:n
    RV(i)  = RelateValue(x,x,i-1);
end
for i = 1:1:n
    for j = i+1:1:n
        Rxx(i,j) = RV(j-i+1);
    end
end
Rxx = Rxx+Rxx'+diag(ones(n,1))*RV(1);
end
function Rxs = ConstructRxsVector(x,s)
n = length(x);
Rxs = zeros(n,1);
for i = 1:1:n
    Rxs(i) = RelateValue(x,s,i-1);
end
end

结果

在这里插入图片描述

小结

和卡尔曼滤波一样,维纳滤波是信号处理中一种经典的滤波算法。上述的互相关函数可以借用matlab的xcorr函数计算得到,这里为了完整地了解整个过程计算过程,使用自己编写的代码。

  • 11
    点赞
  • 92
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值