天天看點

iir濾波器直接ii型c語言優化實作,2階節IIR算法C語言源碼

純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