概述
纯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
最后
以上就是等待紫菜为你收集整理的iir滤波器直接ii型c语言优化实现,2阶节IIR算法C语言源码的全部内容,希望文章能够帮你解决iir滤波器直接ii型c语言优化实现,2阶节IIR算法C语言源码所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复