介绍
随机信号包括了确定信号和随机噪声两部分。维纳滤波的本质是设计一组冲击响应的函数,抑制信号中的随机噪声部分,或者说非预期信号部分,使得信号与预期值的均方误差达到最小。
基本概念
在开始维纳滤波的介绍前,先描述一下几个基本的概念
以下只给出离散过程的公式
- 自相关函数
为了描述随机变量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(N−1)],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=0∑nh(m)x(n−m)
维纳滤波器的目标如下:
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(n−i))=0⇒E[s(n)x(n−i)]−E[m=0∑nh(m)x(n−m)∗x(n−i)]=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(n−i)]=Rsx(−i)=Rxs(i)E[h(m)x(n−m)∗x(n−i)]=h(m)E(x(n−m)∗x(n−i))=h(m)Rxx(m−i)Rxs(i)=m=0∑nh(m)Rxx(m−i)
对于长度为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(N−1)⎦⎥⎥⎥⎥⎥⎥⎤=⎣⎢⎢⎢⎢⎢⎢⎡Rxx(0)⋮Rxx(−i)⋮Rxx(1−N)⋯⋱⋯⋯Rxx(i)⋮Rxx(0)⋮Rxx(i−N+1)⋯⋯⋱⋯Rxx(N−1)⋮Rxx(N−1−i)⋮Rxx(0)⎦⎥⎥⎥⎥⎥⎥⎤⎣⎢⎢⎢⎢⎢⎢⎡h(0)⋮h(i)⋮h(N−1)⎦⎥⎥⎥⎥⎥⎥⎤
将上式进行简化,得到 R X S = R X X ∗ h ⇒ h = R X X − 1 R X S RXS =RXX*h \Rightarrow h = RXX^{-1}RXS RXS=RXX∗h⇒h=RXX−1RXS
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函数计算得到,这里为了完整地了解整个过程计算过程,使用自己编写的代码。