예제 #1
0
/*
 * 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);
}
예제 #2
0
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]);
	}

	}