LMS算法實現自適應濾波器

LMS算法實現自適應濾波器

// LMS.c

#include "LMS.h"

/* xn--------輸入的信號序列(列向量)
 * itr-------迭代次數,標量,默認爲xn的長度,M<itr<sizeof(xn)
 * en--------誤差序列(itr*1)列向量
 * dn--------所期望的響應序列(列向量)
 * M---------濾波器的階數(標量)
 * mu--------收斂因子(步長)標量
 * W---------濾波器權值矩陣,大小爲M*itr
 * yn--------實際輸出序列(列向量)*/


/*LMS具體算法*/
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];

    /*創建一個en全零矩陣,en(k)表示第k次迭代時預期輸出與實際輸入的誤差*/
    for (i=0; i<itr; i++)
    {
        en[i] = 0;
    }

    /*創建一個W全零矩陣,每一行代表一個加權參量,每一列代表一次迭代*/
    for (i=0; i<M; i++)
        for (k=0; k<itr; k++)
            W[i][k] = 0;

    /*創建一個x全零矩陣*/
    for (i=0; i<M; i++)
        x[i] = 0;

    /*迭代計算*/
    for (k=M; k<=itr; k++)
    {
        /* 濾波器M個抽頭的輸入:從xn第k-1個值倒序取出M個樣點的值放入x
         * y爲濾波器輸出:W的第K-2列與x的積的和*/
        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;  //第k次迭代的誤差

        /*濾波器權值計算的迭代式*/
        for (i=0; i<M; i++)
        {
            W[i][k-1] = W[i][k-2] + 2*mu*en[k-1]*x[i];
        }

        y = 0.0;
    }

    /*創建一個yn全無窮大矩陣,維數與xn一樣*/
    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;
}
// LMS.h

#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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章