DSP

2阶节IIR算法C语言源码

2019-07-13 14:54发布

纯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]; //分母多项式的系数Denominator float fCoefB[3]; //分子多项式的系数Numerator float 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