2阶节IIR算法C语言源码

纯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



posted @ 2015-01-14 10:52  星沉地动  阅读(1614)  评论(0编辑  收藏  举报