一、自适应滤波原理
所谓自适应滤波器,就是利用前一时刻已获得的滤波器参数,自动地调节现时刻的滤波器参数,以适应信号和噪声未知的或随时间变化的统计特性,从而实现最优滤波。根据环境的改变,使用自适应算法来改变滤波器的参数。
二、自适应LMS算法
根据小均方误差准则以及均方误差曲面,自然的我们会想到沿每一时刻均方误差的陡下降在权向量面上的投影方向更新,也就是通过目标函数ξ(k)的反梯度向量来反复迭代更新。由于均方误差性能曲面只有一个极小值,只要收敛步长选择恰当,不管初始权向量在哪,后都可以收敛到误差曲面的小点,或者是在它的一个邻域内。这种沿目标函数梯度反方向来解决小化问题的方法,我们一般称为速下降法,表达式如下:
基于随机梯度算法的小均方自适应滤波算法的完整表达式如下:
LMS自适应算法是一种特殊的梯度估计,不必重复使用数据,也不必对相关矩阵和互相关矩阵进行运算,只需要在每次迭代时利用输入向量和期望响应,结构简单,易于实现。虽然LMS收敛速度较慢,但在解决许多实际中的信号处理问题,LMS算法是仍然是好的选择。
三、LMS算法程序流程
- 初始化各种参量包括自适应滤波器(向量)W (n), 参考信号(向量) X(n)
- 获取参考信号x(n)和期望信号d(n)
- 更新参考信号(向量) X(n)
- 计算滤波信号 y(n) =W (n)X(n)
- 计算误差信号 e(n)=d(n)-y(n)
- 更新自适应滤波器 W(n+1)=W(n)+e(n)X(n)
- 回到第2步进行迭代
四、滤波器C语言代码
#include "math.h"
#include "stdio.h"
int N=16; //滤波器阶数
float u=0.005; //LMS的收敛步长
float pi=3.1415926;
int i,j;
float x[1039];
float y[1024];
float d[1024];
float e[1024];
float X[16];
float W[16];
void main()
{
for (i=0;i<1024;i++) //参考信号
{
x[i]=sin((9*i-36)*pi/180);
}
for (i=0;i<1024;i++) //期望信号
{
d[i]=x[i+N-1];
}
for (i=0;i<N;i++) //初始化滤波器参数
{
W[i]=0;
}
for (i=0;i<1024;i++)
{
y[i]=0;
for(j=0;j<N;j++)
{
X[j]=x[i+N-j-1];
}
for (j=0;j<N;j++)
{
y[i]=y[i]+W[j]*X[j]; //计算滤波信号
}
e[i]=d[i]-y[i];
for(j=0;j<N;j++)
{
W[j]=W[j]+2*u*e[i]*X[j]; //更新自适应滤波器
}
}
}
五、输出波形研究
参考信号是一个正弦波叠加信号,期望信号是参考信号的移相信号,移动了15个采样点,可以看出经过一段时间,自适应滤波器的输出便能够“跟踪”输入信号的频率和幅度,与滤波器的期望输出信号一致。