純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