数字带通滤波器c语言程序,IIR数字滤波器C语言

1.模拟滤波器的设计

1.1巴特沃斯滤波器的次数

根据给定的参数设计模拟滤波器,然后进行变数变换,求取数字滤波器的方法,称为滤波器的间接设计。做为数字滤波器的设计基础的模拟滤波器,称之为原型滤波器。这里,我们首先介绍的是最简单最基础的原型滤波器,巴特沃斯低通滤波器。由于IIR滤波器不具有线性相位特性,因此不必考虑相位特性,直接考虑其振幅特性。

83673448_1

在这里,N是滤波器的次数,Ωc是截止频率。从上式的振幅特性可以看出,这个是单调递减的函数,其振幅特性是不存在纹波的。设计的时候,一般需要先计算跟所需要设计参数相符合的次数N。首先,就需要先由阻带频率,计算出阻带衰减

83673448_2

将巴特沃斯低通滤波器的振幅特性,直接带入上式,则有

83673448_3

最后,可以解得次数N为

83673448_4

当然,这里的N只能为正数,因此,若结果为小数,则舍弃小数,向上取整。

1.2巴特沃斯滤波器的传递函数

巴特沃斯低通滤波器的传递函数,可由其振幅特性的分母多项式求得。其分母多项式

83673448_5

根据S解开,可以得到极点。这里,为了方便处理,我们分为两种情况去解这个方程。当N为偶数的时候,

83673448_6

这里,使用了欧拉公式

83673448_7。同样的,当N为奇数的时候,

83673448_8

同样的,这里也使用了欧拉公式。归纳以上,极点的解为

83673448_9

上式所求得的极点,是在s平面内,在半径为Ωc的圆上等间距的点,其数量为2N个。为了使得其IIR滤波器稳定,那么,只能选取极点在S平面左半平面的点。选定了稳定的极点之后,其模拟滤波器的传递函数就可由下式求得。

83673448_10

1.3巴特沃斯滤波器的实现(C语言)

首先,是次数的计算。次数的计算,我们可以由下式求得。

83673448_4

其对应的C语言程序为

N = Ceil(0.5*( log10 ( pow (10, Stopband_attenuation/10) - 1) /

log10 (Stopband/Cotoff) ));

然后是极点的选择,这里由于涉及到复数的操作,我们就声明一个复数结构体就可以了。最重要的是,极点的计算含有自然指数函数,这点对于计算机来讲,不是太方便,所以,我们将其替换为三角函数,

83673448_11

这样的话,实部与虚部就还可以分开来计算。其代码实现为

typedefstruct

{

doubleReal_part;

doubleImag_Part;

} COMPLEX;

COMPLEX poles[N];

for(k = 0;k <= ((2*N)-1) ; k++)

{

if(Cotoff*cos((k+dk)*(pi/N)) 

{

poles[count].Real_part = -Cotoff*cos((k+dk)*(pi/N));

poles[count].Imag_Part= -Cotoff*sin((k+dk)*(pi/N));

count++;

if(count == N)break;

}

}

计算出稳定的极点之后,就可以进行传递函数的计算了。传递的函数的计算,就像下式一样

83673448_10

这里,为了得到模拟滤波器的系数,需要将分母乘开。很显然,这里的极点不一定是整数,或者来说,这里的乘开需要做复数运算。其复数的乘法代码如下,

intComplex_Multiple(COMPLEX a,COMPLEX b,

double*Res_Real,double*Res_Imag)

{

*(Res_Real) =  (a.Real_part)*(b.Real_part) - (a.Imag_Part)*(b.Imag_Part);

*(Res_Imag)=  (a.Imag_Part)*(b.Real_part) + (a.Real_part)*(b.Imag_Part);

return(int)1;

}

有了乘法代码之后,我们现在简单的情况下,看看其如何计算其滤波器系数。我们做如下假设

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
float DigFil(invar, setic) float invar; int setic; /******************************************************************************/ /* Filter Solutions Version 2009 Nuhertz Technologies, L.L.C. */ /* www.nuhertz.com */ /* +1 602-279-2448 */ /* 3rd Order Band Pass Butterworth */ /* Bilinear Transformation with Prewarping */ /* Sample Frequency = 5.000 KHz */ /* Standard Form */ /* Arithmetic Precision = 4 Digits */ /* */ /* Center Frequency = 300.0 Rad/Sec */ /* Pass Band Width = 20.00 Rad/Sec */ /* */ /******************************************************************************/ /* */ /* Input Variable Definitions: */ /* Inputs: */ /* invar float The input to the filter */ /* setic int 1 to initialize the filter to zero */ /* */ /* Option Selections: */ /* Standard C; Initializable; Internal States; Not Optimized; */ /* */ /* There is no requirement to ever initialize the filter. */ /* The default initialization is zero when the filter is first called */ /* */ /******************************************************************************/ /* */ /* This software is automatically generated by Filter Solutions */ /* no restrictions from Nuhertz Technologies, L.L.C. regarding the use and */ /* distributions of this software. */ /* */ /******************************************************************************/ { float sumnum=0.0, sumden=0.0; int i=0; static float states[6] = {0.0,0.0,0.0,0.0,0.0,0.0}; static float znum[7] = { -7.968e-09, 0.0, 2.39e-08, 0.0, -2.39e-08, 0.0, 7.968e-09 }; static float zden[6] = { .992, -5.949, 14.88, -19.86, 14.92, -5.981 }; if (setic==1){ for (i=0;i<6;i++) states[i] = [i] = [i]*invar; return 0.0; } else{ sumnum = sumden = 0.0; for (i=0;i<6;i++){ sumden += states[i]*zden[i]; sumnum += states[i]*znum[i]; if (i<5) states[i] = states[i+1]; } states[5] = invar-sumden; sumnum += states[5]*znum[6]; return sumnum; } }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值