matlab cheb2ord函数 C实现

本文详细描述了一个名为cheb2ord的C语言函数,用于处理数值计算中的某种转换,与MATLAB函数进行对比并验证其功能。函数涉及内存分配、三角函数操作和数值优化算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

cheb2ord

void cheb2ord(double* w,int nw,double rp,double rs,int* order,double* wn)
{
    int type=0;
	double* wp=(double*)malloc(sizeof(double)*nw/2);
	double* temp=(double*)malloc(sizeof(double)*nw/2);
	double* ws=(double*)malloc(sizeof(double)*nw/2);
	double* WA=(double*)malloc(sizeof(double)*nw/2);
	double minWA;

	for(int i=0;i<nw/2;i++)
	{
		wp[i]=w[i];
		ws[i]=w[nw/2+i];
        temp[i]=ws[i];
	}

	if(nw==2)
	{
		type=0;
	}
	else if(nw==4)
	{
		type=2;
	}
	if(wp[0]<ws[0])
	{
		type+=1;
	}
	else
	{
		type+=2;
	}


	for(int i=0;i<nw/2;i++)
	{
		wp[i]=tan(PI*wp[i]/2.0);
		ws[i]=tan(PI*ws[i]/2.0);
	}

	if (type == 1)
	{
		for (int i = 0; i < nw / 2; i++)
		{
			WA[i] = ws[i] / wp[i];
		}
	}
	else if(type==2)
	{
		for (int i = 0; i < nw / 2; i++)
		{
			WA[i] = wp[i] / ws[i];
		}
	}
	else if (type == 3)
	{
		wp[0] = lclfminbnd(wp[0], ws[0] - 1e-12,0, wp, ws, rs, rp, 1);
		wp[1] = lclfminbnd(ws[1] + 1e-12, wp[1],1, wp, ws, rs, rp, 1);
		for (int i = 0; i < nw / 2; i++)
		{
			WA[i] = (ws[i] * (wp[0] - wp[1])) / (ws[i] * ws[i] - wp[0] * wp[1]);
		}
	}
	else if(type==4)
	{
		for (int i = 0; i < nw / 2; i++)
		{
			WA[i] = (ws[i] * ws[i] - wp[0] * wp[1]) / (ws[i] * (wp[0] - wp[1]));
		}
	}

	minWA=INFINITY;
	for (int i = 0; i < nw / 2; i++)
	{
		double absValue = fabs(WA[i]);
		minWA = fmin(minWA, absValue);
	}

    double argument = sqrt((pow(10, 0.1 * fabs(rs)) - 1) / (pow(10, 0.1 * fabs(rp)) - 1));
	*order =  ceil(acosh(argument) / acosh(minWA));

    for (int i = 0; i < nw / 2; i++)
    {
        wn[i]=temp[i];
    }
    

	free(wp);
	free(ws);
	free(WA);
}

其中lclfminbndmatlab buttord函数 C实现中已经实现。

和matlab函数对比,验证无误

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值