一、定义
1959年由Widrow和Hoff提出了最小均方(Least Mean Square,LMS)算法,LMS基于维纳滤波理论,采用瞬时值估计梯度矢量的算法,通过最小化误差信号的能量来更新自适应滤波器权值系数。最小二乘(Least Square)准则:以误差的平方和最小作为最佳准则的误差准则。
式中, ξ(n)是误差信号的平方和;ej是j时刻的误差信号,
dj是j时刻的期望信号,Xj是j时刻的输入信号构成的向量, W表示滤波器的权系数构成的向量。通过选择W,使ξ(n)取得最小值的滤波称为最小二乘(Least Square,简称LS)滤波,而满足E[e2j]取得最小值的滤波称为最小均方误差(Least Mean Square, 简称LMS)滤波。
二、原理
1.设计一个N 阶滤波器,它的参数为w(n),则滤波器输出为
$$y(n)=\sum_{i=0}^{N-1} w_{i}(n) x(n-i)=w^{T}(n)x(n)=x^{T}(n) w(n)$$
2. 期望输出为d(n),则误差信号可以定义为:
$$e(n)=d(n)-y(n)=d(n)-w^{T}(n) x(n)$$
3.我们的目标就是将误差e(n)最小化,采用最小均方误差(MMSE )准则,最小化目标函数:J(w)
$$J(w)=E\left\{|e(n)|^{2}\right\}=E\left\{\left|d(n)-w^{T}(n) x(n)\right|^{2}\right\}$$
4.计算目标函数J(w)对w的导数,令导数为0:
$$\nabla (J(w)) = \frac{{\partial [\mathop e\nolimits^2 (n)]}}{{\partial w(n)}} = - 2e(n)X(n)$$
5.则滤波器系数的更新公式可以写为:
$$w(n+1)=w(n)-\frac{1}{2}\mu [-\nabla (J(w))]=w(n)+\mu e(n)X(n)$$
上式中的u为步长因子。u值越大,算法收敛越快,但稳态误差也越大;u值越小,算法收敛越慢,但稳态误差也越小。为保证算法稳态收敛,应使u在以下范围取值:
$$0 < \mu < \frac{2}{{\sum\limits_{i = 1}^N {x(i)_{}^2} }}$$
三、FPGA实现
(一)matlab + RTL
使用matlab生成LMS滤波器所需系数,然后使用system generator调用fir滤波器IP搭建算法模型如下:
(二)纯RTL
完全使用system generator搭建滤波器算法模型如下:
四、实现效果
分别比较了自适应滤波器输入、预期输出、自适应滤波器matlab输出、自适应滤波器FPGA输出,经分析,使用fpga实现最小二乘法滤波还是挺不错的。 看起来图a效果要比图b效果好,那是因为图a抽头数20,图b抽头数8,后面有时间我将抽头数改为相同再比较试试。
图a:matlab + RTL
图b:纯RTL