純C語言軟體算法,沒有做過多優化,隻是實作了基本IIR算法
#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
#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