维纳滤波及其简单实现
生活随笔
收集整理的這篇文章主要介紹了
维纳滤波及其简单实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 介紹
- 基本概念
- 簡單實現過程
- 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=0∑n?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=0∑n?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=0∑n?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矩陣的時候利用了這一點。
簡單實現過程
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函數計算得到,這里為了完整地了解整個過程計算過程,使用自己編寫的代碼。
總結
以上是生活随笔為你收集整理的维纳滤波及其简单实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 原理图端口符号_何为电气原理图和接线图?
- 下一篇: (测试可用)针式打印机打印WEB页面字体