/* * Helper function to calculate how much data to put into page i of n. * Only first and last pages are special. */ static inline off_t xfsize(int i, int n, off_t off, off_t len) { if (i == 0) return (omin(PAGE_SIZE - (off & PAGE_MASK), len)); if (i == n - 1 && ((off + len) & PAGE_MASK) > 0) return ((off + len) & PAGE_MASK); return (PAGE_SIZE); }
void Opendsp_iirFilterCalculater(int ifilt,int band,int ns,int n,double f1,double f2,double f3,double f4,double db,double b[],double a[]) { /* 函数名称: * 巴特沃兹滤波器与切比雪夫滤波器传递函数计算函数 * 函数功能: * 计算对应函数的传递参数 * 参数说明: * ifilt——>整形变量。滤波器的类型。 * 1表示切比雪夫滤波器,2表示逆切比雪夫滤波器 * 3表示巴特沃兹滤波器。 * band——>整形变量。滤波器的类型。 * 1表示低通滤波器;2表示高通滤波器; * 3表示带通滤波器;4表示带阻滤波器。 * ns——>整形变量。滤波器的N阶数。 * n——>整形变量。滤波器每节的阶数。 * 低通/高通滤波器,n=2; * 带通/带阻滤波器,n=4; * f1——>双精度实型变量。 * f2——>双精度实型变量。 * f3——>双精度实型变量。 * f4——>双精度实型变量。 * db——>双精度实型变量。滤波器的阻带衰减。单位:DB * b——>双精度实型一维数组。体积为ns*(n+1)。 * 用于存放滤波器分子多项式的系数。 * a——>双精度实型一维数组。体积为ns*(n+1)。 * 用于存放滤波器分母多项式的系数。 * * 说明: * */ int k; double omega,lamda,epslon,fl,fh; double d[5],c[5]; if((band==1)||(band==4)) fl=f1; else //if((band==2)||(band==3)) fl=f2; if(band<=3) fh=f3; else //if(band==4) fh=f4; if(ifilt<3) { switch(band) { case 1:case 2: omega=warp(f2)/warp(f1);break; case 3: omega=omin(bpsub(warp(f1),fh,fl),bpsub(warp(f4),fh,fl));break; default: //band==4 omega=omin(1.0/bpsub(warp(f2),fh,fl),1.0/bpsub(warp(f3),fh,fl));break; } } else omega=0; lamda=pow(10.0,(db/20.0)); epslon=lamda/cosh(2*ns*cosh1(omega)); for(k=0;k<ns;k++) { switch(ifilt) { case 1:chebyi(2*ns,k,4,epslon,d,c);break; case 2:chebyii(2*ns,k,4,omega,lamda,d,c);break; case 3:bwtf(2*ns,k,4,d,c);break; } fblt(d,c,n,band,fl,fh,&b[k*(n+1)+0],&a[k*(n+1)+0]); } }