维纳(Wiener)滤波及Matlab代码
文章目錄
- 維納(Wiener)濾波
- 模型結構
- 使用條件
- 原理公式推導
- 仿真分析——Matlab代碼
- 一、參考信號d(n)d(n)d(n)為原始信號s(n)s(n)s(n)
- 二、參考信號d(n)d(n)d(n)為加性高斯白噪聲v(n)v(n)v(n)
- 三、參考信號d(n)d(n)d(n)為輸入信號自身x(n)x(n)x(n)
- 總結
維納(Wiener)濾波
Wiener濾波的核心目標就是使均方誤差最小,從而可以推導出維納-霍夫方程。
在信號處理中,濾波器可以分為FIR和IIR兩種,在這里主要介紹維納FIR濾波器,如下圖1所示。換句話說,就是要想方設法求出最優(yōu)濾波器的系數。
模型結構
首先,先來看一下wiener濾波器的一般結構,如下圖2所示。
其中s(n)s(n)s(n)是輸入的原始信號,經過噪聲信道v(n)v(n)v(n)后,變成了x(n)x(n)x(n),濾波器后輸出得到s′(n)s'(n)s′(n),期望響應是d(n)d(n)d(n) ,那誤差e(n)=d(n)?s′(n)e(n)=d(n)-s'(n)e(n)=d(n)?s′(n) ,濾波器的系數為h(n)h(n)h(n)。
對于信號s(n)s(n)s(n)和噪聲v(n)v(n)v(n)的混合體x(n)=s(n)+v(n)x(n)=s(n)+v(n)x(n)=s(n)+v(n),按照均方誤差最小的準則,從x(t)x(t)x(t)中分離出信號s(t)s(t)s(t)的理論,稱為維納濾波理論。
這里要著重說明的一點是,期望響應d(n)d(n)d(n)一般上來說是對原始信號的s(n)s(n)s(n)估計,后面會講到別的情況。如果你想要對一個未知的信號進行濾波,用wiener濾波的方法是不行的。因為,在設計濾波器系數的時候,必須用到期望信號d(n)d(n)d(n)。所以,必須要知道d(n)d(n)d(n),或者d(n)d(n)d(n)的一些其他的特征。
使用條件
1、輸入信號是寬平穩(wěn)信號。那么寬平穩(wěn)是什么呢?通俗的來說就是與時間無關的信號,或者與時間的起點無關,只與時間間隔有關。
2、必須知道期望信號,或者它的一些信號特征才行(具體看下面的公式推導部分)。
原理公式推導
為了簡便運算,假設所使用的信號是實信號。
輸出信號:s′(n)=h(n)?x(n)=∑k=?∞+∞h(n)x(n?k)s'(n)=h(n)*x(n)=\sum_{k=-\infty}^{+\infty} h(n) x(n-k)s′(n)=h(n)?x(n)=∑k=?∞+∞?h(n)x(n?k)
誤差:e(n)=d(n)?s′(n)==d(n)?∑k=?∞+∞h(n)x(n?k)e(n)=d(n)-s'(n)==d(n)-\sum_{k=-\infty}^{+\infty} h(n)x(n-k)e(n)=d(n)?s′(n)==d(n)?∑k=?∞+∞?h(n)x(n?k)
均方誤差:J(h)=E[e2(n)]J(h)=E[{e^2}(n)]J(h)=E[e2(n)]
為了使均方誤差最小,需要對JJJ進行求導,并讓導數為0,即可得到最佳濾波器的系數了。
?hJ=?2E[x(n?k)e(n)]{\nabla _h}J = - 2E[ x(n - k)e(n)] ?h?J=?2E[x(n?k)e(n)]
所以,
E[x(n?k)e(n)]=0(1)E[x(n - k)e(n)]=0\quad\quad\quad\quad\quad(1) E[x(n?k)e(n)]=0(1)
E[x(n?k)(d(n)?∑i=?∞∞h(i)x(n?i))]=0E\left[x(n-k)\left(d(n)-\sum_{i=-\infty}^{\infty} h(i)x(n-i)\right)\right]=0 E[x(n?k)(d(n)?i=?∞∑∞?h(i)x(n?i))]=0
∑i=?∞∞h(i)E[x(n?k)x(n?i)]=E[x(n?k)d(n)]\sum_{i=-\infty}^{\infty} h(i) E\left[x(n-k) x(n-i)\right]=E\left[x(n-k)d(n)\right] i=?∞∑∞?h(i)E[x(n?k)x(n?i)]=E[x(n?k)d(n)]
∑i=?∞∞h(i)rx(i?k)=rxd(?k)\sum_{i=-\infty}^{\infty} h(i)r_{x}(i-k)=r_{x d}(-k) i=?∞∑∞?h(i)rx?(i?k)=rxd?(?k)
針對MMM階FIR濾波器,維納-霍夫方程(Wiener-Hopf)為∑i=0M?1h(i)rx(i?k)=rxd(?k)\sum_{i=0}^{M-1} h(i)r_{x}(i-k)=r_{x d}(-k)∑i=0M?1?h(i)rx?(i?k)=rxd?(?k),那么,寫成矩陣的形式就是
Rh=rxdh=R?1rxd\begin{array}{l} Rh={r}_{x d} \\ h=R^{-1}{r}_{x d} \end{array} Rh=rxd?h=R?1rxd??
其中RRR是信號x(n)x(n)x(n)的自相關矩陣,rxdr_{x d}rxd?是信號x(n)和d(n)x(n)和d(n)x(n)和d(n)的互相關矩陣。
仿真分析——Matlab代碼
由于Wiener濾波器的參數求解過程中必須要用到參考信號,所以這里仿真采用的信號Signal為
s=A?sin(2πf1t)+B?sin(2πf2t)s = A*sin\left( {2\pi {f_1}t} \right){\rm{ }} + {\rm{ }}B*sin\left( {2\pi {f_2}t} \right)s=A?sin(2πf1?t)+B?sin(2πf2?t) ,
即為兩個疊加的正弦信號。其中A=10,B=15,f1=1000,f2=2000A = 10,B = 15,{f_1} = 1000,{f_2} = 2000A=10,B=15,f1?=1000,f2?=2000 。
根據采樣定理,這里假定采樣頻率fs=100000{f_s} = 100000fs?=100000,采樣間隔T=1/fsT = 1/{f_s}T=1/fs?,則sa(t)∣t=nT=sa(nT)(0≤n≤999){s_a}(t)\left| {_{t = nT}} \right. = {s_a}(nT){\rm{ }}(0 \le n \le 999)sa?(t)∣t=nT?=sa?(nT)(0≤n≤999)。
對于不同的nnn值,s(n)s(n)s(n)是一個有序的數字序列:s(n)={sa(0),sa(T),sa(2T),?}s(n) = \left\{ {{s_a}(0),{s_a}(T),{s_a}(2T), \cdots } \right\}s(n)={sa?(0),sa?(T),sa?(2T),?}。信號傳輸過程中,信道中的噪聲為加性高斯白噪聲。原始信噪比定義為SNR=3。
上面提到期望信號d(n)d(n)d(n)是必不可少的,所以,對期望信號的設定也會決定結果的好壞。所以,d(n)d(n)d(n)也可以稱作參考信號。有以下幾種不同的情況:
- 參考信號d(n)d(n)d(n)為原始信號s(n)s(n)s(n)
- 參考信號d(n)d(n)d(n)為加性高斯白噪聲v(n)v(n)v(n)
- 參考信號d(n)d(n)d(n)為輸入信號自身x(n)x(n)x(n)
下面對三種不同的情形進行仿真與對比分析, 其中濾波器系數長度N均為100。
(全部三種完整的MATLAB代碼整合版在我的資源“維納(Wiener)濾波及Matlab代碼”中)
一、參考信號d(n)d(n)d(n)為原始信號s(n)s(n)s(n)
%% wiener filter for different d(n) %% StarryHuang 2021.1.9 close all; clear; clc; %% 信號產生,對原始信號進行采樣 A=10; % 信號的幅值 B=15; % 信號的幅值 f1=1000; % 信號1的頻率 f2=2000; % 信號2的頻率 fs=10^5; % 采樣頻率 t=0:999; % 采樣點t = [0,999],長度1000 M = length(t); % 信號長度 s=A*sin(2*pi*f1*t/fs) + B*sin(2*pi*f2*t/fs); % 采樣正弦波信號為Signal SNR = 3; % 初始信噪比 x=awgn(s,SNR,'measured'); %觀測信號 x=s+v.,給正弦波信號加入信噪比為-3dB的高斯白噪聲 v=x - s; % 高斯白噪聲,誤差信號,每次運行都不一樣 %% 第一種情況——期望信號d(n)為感興趣的原信號Signal d = s; %% 第二種情況——期望信號d(n)為Noise v % d = v; %% 第三種情況—— 期望信號d(n)為x(n-1) % d = [x(1),x(1:end-1),]; % d(n)=x(n-1)%% 維納濾波 N = floor(length(x)*0.1); % 濾波器的階數,向下取整 % N=100; % 維納濾波器階數 Rxx=xcorr(x,N-1,'biased'); % 自相關函數1*(2N-1)維度,返回一個延遲范圍在[-N,N]的互相關函數序列,對稱的 % 變成矩陣 N*N維度 for i=1:Nfor j=1:NmRxx(i,j)=Rxx(N-i+j); % N*N維度end end%產生維納濾波中x 方向上觀測信號與期望信號d的互相關矩陣 Rxd=xcorr(x,d,N-1,'biased'); % 互相關函數1*(2N-1)維度% 變成矩陣1*N維度 for i=1:NmRxd(i)=Rxd(N-1+i); % 1*N維度 endh = inv(mRxx)*mRxd'; % 由wiener-Hopf方程得到濾波器最優(yōu)解, h是N*1維度%% 檢驗wiener濾波效果 y = conv(x,h); % 濾波后的輸出,長度為M+N-1,要截取前M個。 y = y(1:M); % yy = filter(h,1,x); % 用卷積或者直接用filter都可以 Py=sum(power(y,2))/M; %濾波后信號y的功率 e = d - y; % 輸出減去期望等于濾波誤差 J = sum(power(e,2))/M % 濾波后噪聲功率 SNR_after = 10*log10((Py-J)/J) % 濾波后信噪比 db單位 imv = 10*log10((Py-J)/J/power(10,SNR/10)) % 濾波后較濾波前信噪比提高了imv dB。%% 畫圖 % 原始信號x,噪聲v,觀測波形d figure(1), subplot(311) plot(t,s) % 輸入函數 title(' Signal原信號')subplot(312) plot(t,v) % 輸入函數 title(' Noise噪聲')subplot(313) plot(t,x) % 輸入函數 title(' X(n)觀測波形')%% d = s % 期望和濾波后的信號對比 figure(2), subplot(211) plot(t, d, 'r:', t, y, 'b-','LineWidth',1); legend('期望信號','濾波后結果'); title('期望信號與濾波結果對比'); xlabel('觀測點數');ylabel('信號幅度'); axis([0 1000 -50 50])subplot(212), plot(t, e); title('輸出誤差'); xlabel('觀測點數');ylabel('誤差幅度'); axis([0 1000 -50 50])% 濾波前后對比 figure(3), subplot(211) plot(t, x); title('維納濾波前'); xlabel('觀測點數');ylabel('信號幅度'); axis([0 1000 -50 50])subplot(212), plot(t, y); title('維納濾波后'); xlabel('觀測點數');ylabel('誤差幅度'); axis([0 1000 -50 50])
濾波后信噪比SNR_after = 13.187dB;濾波后較濾波前信噪比提高了10.4dB。
二、參考信號d(n)d(n)d(n)為加性高斯白噪聲v(n)v(n)v(n)
只要將代碼的開頭d換成v,畫圖函數修改為%% d=v部分即可。
% %% d = v % figure(2) % plot(t, d, 'r:', t, y, 'b-','LineWidth',1); % legend('期望信號','濾波后結果'); title('期望信號與濾波結果對比'); % xlabel('觀測點數');ylabel('信號幅度'); % axis([0 1000 -50 50]) % % figure(3) % plot(t, s, 'r:', t, x - y, 'b-','LineWidth',1); % legend('Signal原始信號','噪聲抵消后結果'); title('Signal原始信號與噪聲抵消后結果對比'); % xlabel('觀測點數');ylabel('信號幅度'); % axis([0 1000 -50 50])
濾波后信噪比SNR_after = 10.023dB;濾波后較濾波前信噪比提高了7dB。
三、參考信號d(n)d(n)d(n)為輸入信號自身x(n)x(n)x(n)
只要將代碼的開頭d換成x即可。
濾波后信噪比SNR_after = -0.812dB;濾波后較濾波前信噪比提高了-3.812dB。
總結
參考信號選為原始信號時的濾波效果最好。雖然在第三種方案中,參考信號選為自身信號時的濾波效果不好,第三種Wiener濾波器模型對于許多應用仍然具有很大的實用價值, 因為在許多實際應用中, 既無法提前獲知系統的期望響應, 也不具備獲得與輸入信號高相關噪聲的條件。
總結
以上是生活随笔為你收集整理的维纳(Wiener)滤波及Matlab代码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 双显示器 启动黑屏 黑苹果_教你注入ED
- 下一篇: 电气绘图软件-AutoCAD Elect