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



转载于:https://www.cnblogs.com/kerndev/p/5537389.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值