纯C语言软件算法,没有做过多优化,只是实现了基本IIR算法
/******************************************************************************
* 二阶IIR滤波器单元,采用直接II型
* 由多个2阶节,可以组成更多高阶的滤波器
* 根据参数的不同,可以生成低通,高通,带通,带阻
******************************************************************************/
#include "iir.h"//初始化IIR数据
void IIR_Init(IIR_Typedef *pIIR, IIR_COEF* pCoef)
{int i;for (i=0; i<3; i++){pIIR->fCoefA[i] = pCoef->fCoefA[i];pIIR->fCoefB[i] = pCoef->fCoefB[i];pIIR->fTemp[i] = 0;}
}//复位历史值
void IIR_Reset(IIR_Typedef *pIIR)
{pIIR->fTemp[0] = 0;pIIR->fTemp[1] = 0;pIIR->fTemp[2] = 0;
}//IIR滤波
float IIR_Filter(IIR_Typedef *pIIR, float fInput)
{float fOutput;//计算输入值pIIR->fTemp[0] = fInput;pIIR->fTemp[0] = pIIR->fTemp[0] - pIIR->fCoefA[1] * pIIR->fTemp[1];pIIR->fTemp[0] = pIIR->fTemp[0] - pIIR->fCoefA[2] * pIIR->fTemp[2];//计算输出值fOutput = 0; fOutput = fOutput + pIIR->fCoefB[0] * pIIR->fTemp[0]; fOutput = fOutput + pIIR->fCoefB[1] * pIIR->fTemp[1]; fOutput = fOutput + pIIR->fCoefB[2] * pIIR->fTemp[2]; //移动历史值pIIR->fTemp[2] = pIIR->fTemp[1]; pIIR->fTemp[1] = pIIR->fTemp[0];return fOutput;
}
头文件iir.h
/******************************************************************************
* 二阶IIR滤波器单元,采用直接II型
* 由多个2阶节,可以组成更多高阶的滤波器
* 根据参数的不同,可以生成低通,高通,带通,带阻
******************************************************************************/#ifndef _IIR_H
#define _IIR_H//二阶IIR滤波器参数,和2个历史值
//参数由设计软件直接计算得出
typedef struct
{float fCoefA[3]; //分母多项式的系数Denominatorfloat fCoefB[3]; //分子多项式的系数Numeratorfloat fTemp[3]; //历史值
}IIR_Typedef;//IIR 2阶节的系数
typedef struct
{float fCoefA[3];float fCoefB[3];
}IIR_COEF;//初始化IIR数据
void IIR_Init(IIR_Typedef *pIIR, IIR_COEF* pCoef);//复位历史值
void IIR_Reset(IIR_Typedef *pIIR);//IIR滤波
float IIR_Filter(IIR_Typedef *pIIR, float fInput);#endif // _IIR_H