日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

维纳滤波及其简单实现

發布時間:2023/12/14 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 维纳滤波及其简单实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 介紹
    • 基本概念
    • 簡單實現過程
    • matlab實現
    • 結果
    • 小結

介紹

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

基本概念

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

  • 自相關函數
    為了描述隨機變量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)] Rxx?(t)=E[X(n)?X(n+t)]
    作為一種預期,這里自相關函數只與間隔有關,與起始時間無關。同時,要注意到,自相關函數是關于時間間隔t的偶函數,既有Rxx(t)=Rxx(?t)R_{xx}(t)=R_{xx}(-t)Rxx?(t)=Rxx?(?t)
  • 互相關函數
    描述不同隨機過程引入的隨機序列的相互關系
    RXY(t)=E[X(n)?Y(n+t)]R_{XY} (t)= E[X(n)*Y(n+t)] RXY?(t)=E[X(n)?Y(n+t)]
    并且滿足:RXY(t)=RYX(?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)∈RS = [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=0nh(m)x(n?m)\hat{s}(n) = \sum_{m=0}^{n}h(m)x(n-m) s^(n)=m=0n?h(m)x(n?m)
    維納濾波器的目標如下:
    minE(en2)=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=0nh(m)x(n?m)?x(n?i)]=0E([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=0n?h(m)x(n?m)?x(n?i)]=0
    整理上式,結合相關函數的性質可以得到
    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=0nh(m)Rxx(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=0n?h(m)Rxx?(m?i)
    對于長度為N的濾波器h,則有
    [Rxs(0)?Rxs(i)?Rxs(N?1)]=[Rxx(0)?Rxx(i)?Rxx(N?1)????Rxx(?i)?Rxx(0)?Rxx(N?1?i)????Rxx(1?N)?Rxx(i?N+1)?Rxx(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)??????????
    將上式進行簡化,得到 RXS=RXX?h?h=RXX?1RXSRXS =RXX*h \Rightarrow h = RXX^{-1}RXSRXS=RXX?h?h=RXX?1RXS
    RXXRXXRXX是一個對稱矩陣,且對角線元素都是Rxx(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:Nfrag1 = 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:nRV(i) = RelateValue(x,x,i-1); end for i = 1:1:nfor j = i+1:1:nRxx(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:nRxs(i) = RelateValue(x,s,i-1); end end

    結果

    小結

    和卡爾曼濾波一樣,維納濾波是信號處理中一種經典的濾波算法。上述的互相關函數可以借用matlab的xcorr函數計算得到,這里為了完整地了解整個過程計算過程,使用自己編寫的代碼。

    總結

    以上是生活随笔為你收集整理的维纳滤波及其简单实现的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。