LMS自适应波束形成算法(MATLAB)
文章目錄
- 前言
- 一、自適應波束形成的最佳權矢量
- 二、MATLAB實現
- 1.代碼邏輯
- 2.代碼實現
- 3.實驗結果
前言
記錄陣列信號處理的學習過程。
一、自適應波束形成的最佳權矢量
一般來說,并不希望直接求解方程,其理由如下:①由于移動用戶環境是時變的,所以權向量的解必須能及時更新;②由于估計最佳解需要的數據是含噪聲的,所以希望使用一種更新技術,可利用已求出的權向量求平滑最佳響應的估計,以減小噪聲的影響。因此,希望使用自適應算法周期更新權向量。
實際上就是自適應濾波的工程,使得輸出不斷向期望信號收斂。這里以MMSE(最小均方誤差)為例,說明如何把他變成一種自適應算法。
1.MMSE方法
MMSE準則就是使誤差y(k)?d(k)y(k)-d(k)y(k)?d(k)的均方值最小化,即代價函數取J(wq)=E[∣wqHx(k)?dq(k)∣2]J(w_q)=E[|w^H_qx(k) - d_q(k)|^2]J(wq?)=E[∣wqH?x(k)?dq?(k)∣2]實際上就是數學中的問題,給了y,要去求使得y取得最小最小值的x,在一維中我們直接求導數就可以,在二維和高維中,我們利用雅可比行列式,實際上是和一元差不多。在一元函數中,我們尋找最優點往往就是先給定初始xxx,然后以一個步長往梯度的反方向步進,在這里也是一樣。
我們將上式子展開
J(wq)=wHE[x(k)xH(k)]wq?E[dq(k)xH(k)]wq?wqHE[x(k)dq?(k)]+E[dq(k)dq?(k)]J(w_q)=w^HE[x(k)x^H(k)]w_q-E[d_q(k)x^H(k)]w_q-w_q^HE[x(k)d^*_q(k)]+E[d_q(k)d^*_q(k)]J(wq?)=wHE[x(k)xH(k)]wq??E[dq?(k)xH(k)]wq??wqH?E[x(k)dq??(k)]+E[dq?(k)dq??(k)]對上式子對wqw_qwq?求導數(矩陣求導,下次抽空了寫一下),求得
??wqJ(wq)=2E[x(k)xH(k)]wq?2E[x(k)dq?(k)]=2Rxwq?rxd\frac{\partial}{\partial w_q}J(w_q)=2E[x(k)x^H(k)]w_q-2E[x(k)d^*_q(k)]=2R_xw_q-r_{xd}?wq???J(wq?)=2E[x(k)xH(k)]wq??2E[x(k)dq??(k)]=2Rx?wq??rxd?
只要求出了梯度,我們就可以迭代,一步一步沿著梯度的方向去步進。
2.LMS算法
MMSE方法可以用LMS算法實現。
考慮隨機梯度算法,其更新權矢量的一般公式為
wq(k+1)=wq(k)?12u?w_q(k+1) = w_q(k) - \frac{1}{2}u\nabla wq?(k+1)=wq?(k)?21?u?
式中?=??wq(k)J(wq(k))\nabla = \frac{\partial}{\partial w_q(k)}J(w_q(k))?=?wq?(k)??J(wq?(k)),uuu是收斂因子,實際上就是步長,這個步長,選長了,容易收斂不了,就一直在最優點旁邊左右移動,選短了,需要的迭代次數增加。
上面已經求出
?=2(E[x(k)xH(k)]wq(k)?E[x(k)dq?(k)])\nabla = 2(E[x(k)x^H(k)]w_q(k) - E[x(k)d^*_q(k)])?=2(E[x(k)xH(k)]wq?(k)?E[x(k)dq??(k)])
但是E[]E[]E[]這個東西是個什么呢?在實際運算中,我們如何求EEE呢?實際上EEE是一個總體的特征,當樣本足夠多時,我們可以去估計它,但是我們現在要求實時更新,也就是采一次樣,那么就利用LMS算法去更新一次,現在有EEE是不可以的,LMS算法的基本思路是把數學期望用各自的瞬時值代替,即得到kkk時刻的梯度估計值如下
?~(k)=2x(k)[xH(k)wq(k)?dq?(k)]=?2x(k)f(k)\tilde{\nabla}(k) = 2x(k)[x^H(k)w_q(k)-d^*_q(k)]=-2x(k)f(k)?~(k)=2x(k)[xH(k)wq?(k)?dq??(k)]=?2x(k)f(k)實際上
E[?~]=?E[\tilde{\nabla} ] = \nablaE[?~]=?,即?~\tilde{\nabla}?~是?\nabla?的一個無偏估計,在某些情況下,我們是可以替代的。
我們將梯度值代回權矢量的更新公式,得到了LMS算法為
w(k+1)=w(k+1)+ux(k)f(k)w(k+1) = w(k+1)+ux(k)f(k)w(k+1)=w(k+1)+ux(k)f(k)
| LMS | w0=0w_0=0w0?=0 | y(k)=wH(k)x(k)f(k)=d(k)?y(k)w(k+1)=w(k)+ux(k)f?(k)y(k)=w^H(k)x(k) \\ f(k)=d(k)-y(k) \\ w(k+1) = w(k) + ux(k)f^*(k)y(k)=wH(k)x(k)f(k)=d(k)?y(k)w(k+1)=w(k)+ux(k)f?(k) |
二、MATLAB實現
1.代碼邏輯
實際上LMS實現比較簡單。
1.kkk時刻計算y(k)=wH(k)x(k)y(k)=w^H(k)x(k)y(k)=wH(k)x(k)
2.計算f(k)=d(k)?y(k)f(k)=d(k)-y(k)f(k)=d(k)?y(k)
3.更新權矢量w(k+1)=w(k)+ux(k)f?(k)w(k+1) = w(k) + ux(k)f^*(k)w(k+1)=w(k)+ux(k)f?(k)
4.進行第k+1k+1k+1次迭代
2.代碼實現
clear; clc; M = 16; thetas = [0 30 60]; lambda = 10; d = lambda /2;N = 1000; n = 0:N-1; f0 = 2000; s = [1*sin(2*pi*f0 *n/(8*f0));...2*sin(2*pi*2*f0 *n/(8*f0));...3*sin(2*pi*3*f0 *n/(8*f0))]; % 生成方向矢量 A = exp(-1i * 2 * pi * d * (0:M-1)' * sind(thetas) / lambda); St = A*s + randn(M,N); % LMS 算法 開始 進行自適應濾波 di = s(1,:); % 第一行為期望信號 u = 0.0005; w = zeros(M,1); % 初始化權重向量for k = 1:Ny(k) = w'*St(:,k);e(k) = di(k) - y(k);w = w + u * St(:,k) * conj(e(k)); end scan_theta = [-89:90]; beam = zeros(1,length(scan_theta)); for i = 1 :length(scan_theta)% 構造該方向的方向向量v = exp(-1i * 2 * pi *d* (0:M-1)'.*sind(scan_theta(i))/lambda);beam(i) = abs(w'*v); end figure; plot(scan_theta,20*log10(beam/max(beam))) title('方向圖') figure; for k = 1:Nen(k) = (abs(e(k)))^2; end semilogy(en); hold on; xlabel('迭代次數') ylabel('MSE') title('MSE')3.實驗結果
當以0度入射的信號為期望信號時
當以30度信號為期望信號時。
可見權值都收斂到了正確的方向圖方向。
主要參考:張小飛.陣列信號處理及MATLAB實現[M].電子工業出版社
總結
以上是生活随笔為你收集整理的LMS自适应波束形成算法(MATLAB)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 调试3G模块语音通话
- 下一篇: Qt那些事儿-Qt基础教程