維納濾波及其簡單實現

介紹

隨機信號包括了確定信號和隨機噪聲兩部分。維納濾波的本質是設計一組衝擊響應的函數,抑制信號中的隨機噪聲部分,或者說非預期信號部分,使得信號與預期值的均方誤差達到最小。

基本概念

在開始維納濾波的介紹前,先描述一下幾個基本的概念
以下只給出離散過程的公式

  1. 自相關函數
    爲了描述隨機變量X(n),X(n+t),在不同時刻下的相互聯繫,引入了自相關函數
    t爲間隔,t>0。
    Rxx(t)=E[X(n)X(n+t)] R_{xx}(t) = E[X(n)*X(n+t)]
    作爲一種預期,這裏自相關函數只與間隔有關,與起始時間無關。同時,要注意到,自相關函數是關於時間間隔t的偶函數,既有Rxx(t)=Rxx(t)R_{xx}(t)=R_{xx}(-t)
  2. 互相關函數
    描述不同隨機過程引入的隨機序列的相互關係
    RXY(t)=E[X(n)Y(n+t)] R_{XY} (t)= E[X(n)*Y(n+t)]
    並且滿足:RXY(t)=RYX(t)R_{XY} (t)= R_{YX} (-t)
  3. 維納濾波原理
    本質上,維納濾波是設計一個衝擊響應函數h,對觀察到的信號序列X進行濾波,使得其與期望信號S的最小平方和達到最小值。
    假設信號S的長度爲N,下標從0開始計算,S=[s(0),,s(N1)],s(i)RS = [s(0),\cdots,s(N-1)],s(i) \in \mathbb{R},
    對於濾波器h而言,其濾波過程如下,
    對n時刻的信號估計值
    s^(n)=m=0nh(m)x(nm) \hat{s}(n) = \sum_{m=0}^{n}h(m)x(n-m)
    維納濾波器的目標如下:
    min E(en2)=E([s(n)s^(n)]2) min \ E(e_n^2) = E([s(n)-\hat{s}(n)]^2)
    h(i)h(i)對上式進行求導,由最小值條件得到
    E([s(n)s^(n)]x(ni))=0E[s(n)x(ni)]E[m=0nh(m)x(nm)x(ni)]=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)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) 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)
    對於長度爲N的濾波器h,則有
    [Rxs(0)Rxs(i)Rxs(N1)]=[Rxx(0)Rxx(i)Rxx(N1)Rxx(i)Rxx(0)Rxx(N1i)Rxx(1N)Rxx(iN+1)Rxx(0)][h(0)h(i)h(N1)] \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=RXXhh=RXX1RXSRXS =RXX*h \Rightarrow h = RXX^{-1}RXS
    RXXRXX是一個對稱矩陣,且對角線元素都是Rxx(0)R_{xx}(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函數計算得到,這裏爲了完整地瞭解整個過程計算過程,使用自己編寫的代碼。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章