自適應濾波器中最重要的一個環節就是其係數的更新算法,若是不對自適應濾波器的係數更新的話,那麼它就只是一個普通的FIR濾波器了。係數更新算法有不少種類,最基本、經常使用、簡單的一種方法叫作NLMS(歸一化最小均方),讓咱們先來看看它的數學公式表達:.net
設置自適應濾波器係數h的全部初始值爲0,h的長度爲I。htm
對每一個取樣值進行以下計算,其中n=0, 1, 2, ...blog
自適應濾波器係數 是一個長度爲I的矢量,也就是一個長度爲I的FIR濾波器。在時刻n,濾波器的每一個係數對應的輸入信號爲 ,它也是一個長度爲I的矢量。這兩個矢量的點乘即爲濾波器的輸出和目標信號d(n)之間的差爲e(n),而後根據e(n)和 , 更新濾波器的係數。ip
數學公式老是使人難以理解的,下面咱們以圖示爲例進行說明:ci
圖中假設自適應濾波器h的長度爲4,在時刻7濾波器的輸出爲:get
u[7] = h[0]*x[7] + h[1]*x[6] + h[2]*x[5] + h[3]*x[4]數學
濾波器的輸入信號的平方和powerX爲:
powerX = x[4]*x[4] + x[5]*x[5] + x[6]*x[6] + x[7]*x[7]
未知系統的輸出d[7]和濾波器的輸出u[7]之間的差爲:
e[7] = d[7] - u[7]
使用u[7]和x[4]..x[7]對濾波器的係數更新:
h[4] = h[4] + u * e[7]*x[4]/powerX
h[4] = h[5] + u * e[7]*x[5]/powerX
h[4] = h[6] + u * e[7]*x[6]/powerX
h[4] = h[7] + u * e[7]*x[7]/powerX
其中參數u成爲更新系數,爲0到1之間的一個實數,此值越大系數更新的速度越快。對於每一個時刻i都須要進行上述的計算,所以濾波器的係數對於每一個參照信號x的取樣都更新一次。
參考:摘抄自《用Python作科學計算》http://sebug.net/paper/books/scipydoc/fast_nlms_in_python.html