LMS算法实现自适应滤波器
#include "LMS.h"
float * LMS_Filter(int itr, const float *xn, const float *dn, double mu, int length)
{
static int i = 0;
static int k = 0;
static float y = 0.0;
static float en[F_COUNT];
static float W[M][F_COUNT];
static float x[M];
static float yn[F_COUNT];
for (i=0; i<itr; i++)
{
en[i] = 0;
}
for (i=0; i<M; i++)
for (k=0; k<itr; k++)
W[i][k] = 0;
for (i=0; i<M; i++)
x[i] = 0;
for (k=M; k<=itr; k++)
{
for (i=0; i<M; i++)
{
x[i] = xn[k-i-1];
y += W[i][k-2] * x[i];
}
en[k-1] = dn[k-1] - y;
for (i=0; i<M; i++)
{
W[i][k-1] = W[i][k-2] + 2*mu*en[k-1]*x[i];
}
y = 0.0;
}
for (i=0; i<itr; i++)
{
yn[i] = 0.0;
}
for (k=M; k<=length; k++)
{
for (i=0; i<M; i++)
{
x[i] = xn[k-i-1];
y += W[i][itr-1]*x[i];
}
yn[k-1] = y;
y = 0.0;
}
return yn;
}
#ifndef _LMS_H_
#define _LMS_H_
#include <stdio.h>
#include <float.h>
#include <math.h>
#include <string.h>
#define F_COUNT 1024
#define M 20
float * LMS_Filter(int itr, const float *xn, const float *dn, double mu, int length);
#endif