维纳滤波及其简单实现

mac2024-03-26  31

文章目录

介绍基本概念简单实现过程matlab实现结果小结

介绍

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

基本概念

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

自相关函数 为了描述随机变量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)互相关函数 描述不同随机过程引入的随机序列的相互关系 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)维纳滤波原理 本质上,维纳滤波是设计一个冲击响应函数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矩阵的时候利用了这一点。

简单实现过程

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

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函数计算得到,这里为了完整地了解整个过程计算过程,使用自己编写的代码。

最新回复(0)