北邮22级信通院DSP:用C++程序实现给定参数下四种滤波器的Butterworth模拟滤波器设计:给定上下截频和衰减系数求H(p)和H(s)

北邮22信通一枚~

跟随课程进度更新北邮信通院DSP的笔记、代码和文章,欢迎关注~

获取更多文章,请访问专栏:

北邮22级信通院DSP_青山入墨雨如画的博客-CSDN博客

目录

一、 核心算法

1.1判断滤波器类型

1.2 带通滤波器BP

1.3带阻滤波器BS

1.4综合四种滤波器算法

1.5展示函数show()

1.6H(s)的显示(double_to_string)

1.6.1to_string方法

1.6.2 ostringstream方法

1.7自主输入函数input()

二、代码部分

2.1总体代码

2.2 测试1

2.3测试2


一、 核心算法

1.1判断滤波器类型

        拿到通带和阻带的上下截频之后,我们首先应该判断滤波器的类型。

        对带通带阻滤波器来说,如果s1<p1<p2<s2,则为带通滤波器;如果p1<s1<s2<p2,则为带阻滤波器。低通滤波器相当于通带下截频和阻带下截频都趋于负无穷,故对低通滤波器有p2<s2;同理对高通滤波器来说,相当于通带和阻带上截频趋于正无穷,故对高通滤波器有s1<p1。

        同时需要考虑检测掉所有不合理的情况。

#define ERROR 0
#define IS_LP 1
#define IS_HP 2
#define IS_BP 3
#define IS_BS 4

typedef long double  ld;

//判断选通滤波器类型
int check_types(ld p1, ld p2, ld s1, ld s2)
{
	if (p1 > p2 || s1 > s2 || s1 == p2 ||
		s2 == p1 || s1 == s2 || p1 == p2)
		return ERROR;
	if (s1 * p1 != 0)
		return (p2 > p1 && s2 > s1 && p1 != s1 && p2 != s2) ?
		((p1 > s1) ? IS_BP : IS_BS) : (ERROR);
	else
		return (s2 != p2) ? (s2 < p2 ? IS_HP : IS_LP) : (ERROR);
}

1.2 带通滤波器BP

        首先检测对称情况,更新通阻带上下截频信息。之后计算butterworth滤波器的阶数N,之后展示H(p)的表达式。表达式的展示算法放在1.5展示函数show()和1.6H(s)的显示(double_to_string)讲解。

#define ERROR 0
#define IS_LP 1
#define IS_HP 2
#define IS_BP 3
#define IS_BS 4

typedef long double  ld;

void BP(ld& p1, ld& p2, ld& Ap, ld& s1, ld& s2, ld& As)
{
	ld center = p1*p2;//保持通带
	cout << "通带中心频率为:" << sqrt(center) << "Hz;" << endl;
	//非中心对称改为中心对称
	if (p1 * p2 != s1 * s2)
		((center / s2) > s1) ? (s1 = (center / s2)) : (s2 = (center / s1));
	//计算N的值

	ld lambda_p = 1;
	ld lambda_s = (s2 - s1) / (p2 - p1);
	cout << "lambda_s的计算结果为:lambda_s = " << lambda_s << ";" << endl;
	double temp_1 = log10((pow(10, 0.1 * As) - 1) / (pow(10, 0.1 * Ap) - 1));
	double temp_2 = log10(lambda_s / lambda_p);
	int N = ceil(temp_1 / (2 * temp_2));
	//根据N的值查表得到低通滤波器归一化传输函数Hlp(p)分母表达式
	cout << "butterworth滤波器的阶数为:" << N << ";" << endl;
	show(N, "p");
}

1.3带阻滤波器BS

        如上同理。需要注意参数修正位置,因为是带阻滤波器的设计,所以为了保证阻带,修正的是p1和p2的值。同时λs的计算公式也应该修改。

#define ERROR 0
#define IS_LP 1
#define IS_HP 2
#define IS_BP 3
#define IS_BS 4

typedef long double  ld;

void BS(ld& p1, ld& p2, ld& Ap, ld& s1, ld& s2, ld& As)
{
	ld center = s1 * s2;//保持通带
	cout << "通带中心频率为:" << sqrt(center) << "Hz;" << endl;
	//非中心对称改为中心对称
	if (p1 * p2 != s1 * s2)
		((center / p2) > p1) ? (p1 = (center / p2)) : (p2 = (center / p1));
	//计算N的值
	
	ld lambda_p = 1;
	ld lambda_s =  (p2 - p1)/ (s2 - s1);
	cout << "lambda_s的计算结果为:lambda_s=" << lambda_s << ";" << endl;
	double temp_1 = log10((pow(10, 0.1 * As) - 1) / (pow(10, 0.1 * Ap) - 1));
	double temp_2 = log10(lambda_s / lambda_p);
	int N = ceil(temp_1 / (2 * temp_2));
	//根据N的值查表得到低通滤波器归一化传输函数Hlp(p)分母表达式
	cout << "butterworth滤波器的阶数为:" << N << ";" << endl;
	show(N, "p");
}

1.4综合四种滤波器算法

        如上同理。

        首先根据1.1判断滤波器类型判断是何种滤波器,并计算中心频率center^2。对选通滤波器(高通滤波器和低通滤波器的合称)来说,由于侧重点不同,对中心频率的计算是不同的。带通滤波器(BP)center^2 = p1 * p2,而带阻滤波器(BS)应为center^2 = s1 * s2。

        第二步:如果给定的通带阻带的上下截频不是自然几何对称的话,根据滤波器类型和中心频率修正相应的参数。

        第三步,计算λs的值。由于带通滤波器λs的计算方式为λs = ((s2 - s1) / (p2 - p1)),而低通滤波器的为s/p,相当于低通滤波器是s1=p1=0的情况,λs的值可以用同一个式子处理;同理带阻滤波器和高通滤波器(s2=p2=0)的λs的值也可以共用带阻滤波器的式子处理λs = ((p2 - p1) / (s2 - s1))。

        调用cmath头文件中的向上取整函数ceil,求得N值。

        第四步,展示H(p)和H(s),详见1.5展示函数show()和1.6H(s)的显示(double_to_string)

#define ERROR 0
#define IS_LP 1
#define IS_HP 2
#define IS_BP 3
#define IS_BS 4

typedef long double  ld;
void compilation(ld& p1, ld& p2, ld& Ap, ld& s1, ld& s2, ld& As)
{
	ld center = 0;
	//判断滤波器类型
	if (check_types(p1, p2, s1, s2))
	{
		cout << endl << "该滤波器的类型为";
		switch (check_types(p1, p2, s1, s2))
		{
		case IS_LP:cout << "低通滤波器;" << endl; break;
		case IS_HP:cout << "高通滤波器;" << endl; break;
		case IS_BP:cout << "带通滤波器;" << endl; break;
		case IS_BS:cout << "带阻滤波器;" << endl; break;
		default:
			cout << "error" << endl; break;
		}
		center = (check_types(p1, p2, s1, s2) == IS_BP) ? p1 * p2 : s1 * s2;
	}
	if(sqrt(center))
		cout << endl << "通带中心频率为:" << sqrt(center) << "Hz;" << endl;
	//非几何对称改为几何对称
	if (p1 * p2 != s1 * s2)
		(check_types(p1, p2, s1, s2) == IS_BP) ?
		(((center / s2) > s1) ? (s1 = (center / s2)) : (s2 = (center / s1))) :
		(((center / p2) > p1) ? (p1 = (center / p2)) : (p2 = (center / p1)));
	//计算N的值

	ld lambda_p = 1;
	ld lambda_s = (check_types(p1, p2, s1, s2) == (IS_BP||IS_LP)) ?
		((s2 - s1) / (p2 - p1)) : ((p2 - p1) / (s2 - s1));	
	cout << endl << "归一化截频lambda_s的计算结果为:lambda_s = " << lambda_s << ";" << endl;
	double temp_1 = log10((pow(10, 0.1 * As) - 1) / (pow(10, 0.1 * Ap) - 1));
	double temp_2 = log10(lambda_s / lambda_p);
	int N = ceil(temp_1 / (2 * temp_2));
	//根据N的值查表得到低通滤波器归一化传输函数Hlp(p)分母表达式
	cout << endl << "butterworth滤波器的阶数为N = " << N << ";" << endl;
	cout << endl << "归一化传输函数为:H(p) = ";
	show(N, "p");
	string show_next_level = is_p(check_types(p1, p2, s1, s2), p2-p1, center);
	cout << endl << "传输函数H(s) = ";
	show(N, show_next_level);
}

1.5展示函数show()

        事先导入H(p)分母多项式系数的表。可以用二维数组存储。

        输出表达式。

#define ERROR 0
#define IS_LP 1
#define IS_HP 2
#define IS_BP 3
#define IS_BS 4

typedef long double  ld;
double box[7][8] =
{
	{1.0000,1.0000,0.00000,0.00000,0.00000,0.00000,0.0000,0.0000},
	{1.0000,1.4140,1.00000,0.00000,0.00000,0.00000,0.0000,0.0000},
	{1.0000,2.0000,2.00000,1.00000,0.00000,0.00000,0.0000,0.0000},
	{1.0000,2.6131,3.41420,2.61310,1.00000,0.00000,0.0000,0.0000},
	{1.0000,3.2361,5.23610,5.23610,6.23610,1.00000,0.0000,0.0000},
	{1.0000,3.8637,7.46410,9.14160,7.46410,3.86370,1.0000,0.0000},
	{1.0000,4.4940,10.0978,14.5918,14.5918,10.0978,4.4940,1.0000}
};

void  show(int N, string p)
{
	cout << "1 / ( ";
	for (int i = 7; i >= 0; i--)
	{
		if(box[N - 1][i])//系数不为0时有输出
		{
			if (box[N - 1][i] != 1)
				cout << box[N - 1][i] << "*";
			switch (i)
			{
			case 0:
				cout << 1; break;
			case 1:
				cout << p << " + "; break;
			default:
				cout << p << "^" << i << " + "; break;
			}
		}
	}
	cout << " );" << endl;
}

1.6H(s)的显示(double_to_string)

用p=q(s)替代上述show函数中的“p”。带入中心频率。关键问题是浮点数如何转化为字符串。

给出两种解决方法:

1.6.1to_string方法

需要cstring头文件。

#include<cstring>
string is_p_1(int type, ld B, ld& center)
{
	string output;
	if (type == IS_LP)
		output = "(s/" + to_string(B) + ")";
	else if (type == IS_HP)
		output = "(" + to_string(B) + "/s";
	else if (type == IS_BP)
		output = "((s^2+" + to_string(pow(center, 2)) + ")/" +
		"(" + to_string(B) + "*s" + "))";
	else if (type == IS_BS)
		output = "((" + to_string(B) + "*s" + ")/" +
		"(s^2+" + to_string(pow(center, 2)) + "))";
	else
		output = "error";
	return output;
}

1.6.2 ostringstream方法

需要sstream头文件。

#include <sstream>
#include<iomanip>
using namespace std;
auto format_doble_value(double val, int fixed) {
	std::ostringstream oss;
	oss << std::setprecision(fixed) << val;
	return oss.str();
}

string is_p(int type, ld B, ld& center)
{
	string output;
	if (type == IS_LP)
		output = "(s/" + format_doble_value(B, define_setpercision) + ")";
	else if (type == IS_HP)
		output = "(" + format_doble_value(B, define_setpercision) + "/s";
	else if (type == IS_BP)
		output = "((s^2+" + format_doble_value(pow(center, 2), define_setpercision) + ")/" +
		"(" + format_doble_value(B, define_setpercision) + "*s" + "))";
	else if (type == IS_BS)
		output = "((" + format_doble_value(B, define_setpercision) + "*s" + ")/" +
		"(s^2+" + format_doble_value(pow(center, 2), define_setpercision) + "))";
	else
		output = "error";
	return output;
}

1.7自主输入函数input()

void input()
{
	cout << endl << "通带起始频率p1:"; cin >> p1;
	cout << endl << "通带截止频率p2:"; cin >> p2;
	cout << endl << "通带衰减系数(dB):"; cin >> Ap;
	cout << endl << "阻带起始频率s1:"; cin >> s1;
	cout << endl << "阻带截止频率s2:"; cin >> s2;
	cout << endl << "阻带衰减系数(dB):"; cin >> As;
	cout << endl;
	cout << "运算结果为:" << endl;
}

二、代码部分

2.1总体代码

#include<iostream>
#include<cmath>
#include<cstring>
#include <sstream>
#include<iomanip>
using namespace std;

#define ERROR 0
#define IS_LP 1
#define IS_HP 2
#define IS_BP 3
#define IS_BS 4

typedef long double  ld;
const double PI = acos(-1.0);
const int define_setpercision = 5;
double box[7][8] =
{
	{1.0000,1.0000,0.00000,0.00000,0.00000,0.00000,0.0000,0.0000},
	{1.0000,1.4140,1.00000,0.00000,0.00000,0.00000,0.0000,0.0000},
	{1.0000,2.0000,2.00000,1.00000,0.00000,0.00000,0.0000,0.0000},
	{1.0000,2.6131,3.41420,2.61310,1.00000,0.00000,0.0000,0.0000},
	{1.0000,3.2361,5.23610,5.23610,6.23610,1.00000,0.0000,0.0000},
	{1.0000,3.8637,7.46410,9.14160,7.46410,3.86370,1.0000,0.0000},
	{1.0000,4.4940,10.0978,14.5918,14.5918,10.0978,4.4940,1.0000}
};

ld p1, p2, s1, s2, Ap, As;

//判断选通滤波器类型
int check_types(ld p1, ld p2, ld s1, ld s2)
{
	if (p1 > p2 || s1 > s2 || s1 == p2 ||
		s2 == p1 || s1 == s2 || p1 == p2)
		return ERROR;
	if (s1 * p1 != 0)
		return (p2 > p1 && s2 > s1 && p1 != s1 && p2 != s2) ?
		((p1 > s1) ? IS_BP : IS_BS) : (ERROR);
	else
		return (s2 != p2) ? (s2 < p2 ? IS_HP : IS_LP) : (ERROR);
}

auto format_doble_value(double val, int fixed) {
	std::ostringstream oss;
	oss << std::setprecision(fixed) << val;
	return oss.str();
}

string is_p(int type, ld B, ld& center)
{
	string output;
	if (type == IS_LP)
		output = "(s/" + format_doble_value(B, define_setpercision) + ")";
	else if (type == IS_HP)
		output = "(" + format_doble_value(B, define_setpercision) + "/s";
	else if (type == IS_BP)
		output = "((s^2+" + format_doble_value(pow(center, 2), define_setpercision) + ")/" +
		"(" + format_doble_value(B, define_setpercision) + "*s" + "))";
	else if (type == IS_BS)
		output = "((" + format_doble_value(B, define_setpercision) + "*s" + ")/" +
		"(s^2+" + format_doble_value(pow(center, 2), define_setpercision) + "))";
	else
		output = "error";
	return output;
}

string is_p_1(int type, ld B, ld& center)
{
	string output;
	if (type == IS_LP)
		output = "(s/" + to_string(B) + ")";
	else if (type == IS_HP)
		output = "(" + to_string(B) + "/s";
	else if (type == IS_BP)
		output = "((s^2+" + to_string(pow(center, 2)) + ")/" +
		"(" + to_string(B) + "*s" + "))";
	else if (type == IS_BS)
		output = "((" + to_string(B) + "*s" + ")/" +
		"(s^2+" + to_string(pow(center, 2)) + "))";
	else
		output = "error";
	return output;
}

//标准输出
void  show(int N, string p)
{
	cout << "1 / ( ";
	for (int i = 7; i >= 0; i--)
	{
		if(box[N - 1][i])//系数不为0时有输出
		{
			if (box[N - 1][i] != 1)
				cout << box[N - 1][i] << "*";
			switch (i)
			{
			case 0:
				cout << 1; break;
			case 1:
				cout << p << " + "; break;
			default:
				cout << p << "^" << i << " + "; break;
			}
		}
	}
	cout << " );" << endl;
}

//带通滤波器算法
void BP(ld& p1, ld& p2, ld& Ap, ld& s1, ld& s2, ld& As)
{
	ld center = p1*p2;//保持通带
	cout << "通带中心频率为:" << sqrt(center) << "Hz;" << endl;
	//非中心对称改为中心对称
	if (p1 * p2 != s1 * s2)
		((center / s2) > s1) ? (s1 = (center / s2)) : (s2 = (center / s1));
	//计算N的值

	ld lambda_p = 1;
	ld lambda_s = (s2 - s1) / (p2 - p1);
	cout << "lambda_s的计算结果为:lambda_s = " << lambda_s << ";" << endl;
	double temp_1 = log10((pow(10, 0.1 * As) - 1) / (pow(10, 0.1 * Ap) - 1));
	double temp_2 = log10(lambda_s / lambda_p);
	int N = ceil(temp_1 / (2 * temp_2));
	//根据N的值查表得到低通滤波器归一化传输函数Hlp(p)分母表达式
	cout << "butterworth滤波器的阶数为:" << N << ";" << endl;
	show(N, "p");
}

void BS(ld& p1, ld& p2, ld& Ap, ld& s1, ld& s2, ld& As)
{
	ld center = s1 * s2;//保持通带
	cout << "通带中心频率为:" << sqrt(center) << "Hz;" << endl;
	//非中心对称改为中心对称
	if (p1 * p2 != s1 * s2)
		((center / p2) > p1) ? (p1 = (center / p2)) : (p2 = (center / p1));
	//计算N的值
	
	ld lambda_p = 1;
	ld lambda_s =  (p2 - p1)/ (s2 - s1);
	cout << "lambda_s的计算结果为:lambda_s=" << lambda_s << ";" << endl;
	double temp_1 = log10((pow(10, 0.1 * As) - 1) / (pow(10, 0.1 * Ap) - 1));
	double temp_2 = log10(lambda_s / lambda_p);
	int N = ceil(temp_1 / (2 * temp_2));
	//根据N的值查表得到低通滤波器归一化传输函数Hlp(p)分母表达式
	cout << "butterworth滤波器的阶数为:" << N << ";" << endl;
	show(N, "p");
}

void compilation(ld& p1, ld& p2, ld& Ap, ld& s1, ld& s2, ld& As)
{
	ld center = 0;
	//判断滤波器类型
	if (check_types(p1, p2, s1, s2))
	{
		cout << endl << "该滤波器的类型为";
		switch (check_types(p1, p2, s1, s2))
		{
		case IS_LP:cout << "低通滤波器;" << endl; break;
		case IS_HP:cout << "高通滤波器;" << endl; break;
		case IS_BP:cout << "带通滤波器;" << endl; break;
		case IS_BS:cout << "带阻滤波器;" << endl; break;
		default:
			cout << "error" << endl; break;
		}
		center = (check_types(p1, p2, s1, s2) == IS_BP) ? p1 * p2 : s1 * s2;
	}
	if(sqrt(center))
		cout << endl << "通带中心频率为:" << sqrt(center) << "Hz;" << endl;
	//非几何对称改为几何对称
	if (p1 * p2 != s1 * s2)
		(check_types(p1, p2, s1, s2) == IS_BP) ?
		(((center / s2) > s1) ? (s1 = (center / s2)) : (s2 = (center / s1))) :
		(((center / p2) > p1) ? (p1 = (center / p2)) : (p2 = (center / p1)));
	//计算N的值

	ld lambda_p = 1;
	ld lambda_s = (check_types(p1, p2, s1, s2) == (IS_BP||IS_LP)) ?
		((s2 - s1) / (p2 - p1)) : ((p2 - p1) / (s2 - s1));	
	cout << endl << "归一化截频lambda_s的计算结果为:lambda_s = " << lambda_s << ";" << endl;
	double temp_1 = log10((pow(10, 0.1 * As) - 1) / (pow(10, 0.1 * Ap) - 1));
	double temp_2 = log10(lambda_s / lambda_p);
	int N = ceil(temp_1 / (2 * temp_2));
	//根据N的值查表得到低通滤波器归一化传输函数Hlp(p)分母表达式
	cout << endl << "butterworth滤波器的阶数为N = " << N << ";" << endl;
	cout << endl << "归一化传输函数为:H(p) = ";
	show(N, "p");
	string show_next_level = is_p(check_types(p1, p2, s1, s2), p2-p1, center);
	cout << endl << "传输函数H(s) = ";
	show(N, show_next_level);
}

void input()
{
	cout << endl << "通带起始频率p1:"; cin >> p1;
	cout << endl << "通带截止频率p2:"; cin >> p2;
	cout << endl << "通带衰减系数(dB):"; cin >> Ap;
	cout << endl << "阻带起始频率s1:"; cin >> s1;
	cout << endl << "阻带截止频率s2:"; cin >> s2;
	cout << endl << "阻带衰减系数(dB):"; cin >> As;
	cout << endl;
	cout << "运算结果为:" << endl;
}

int main()
{
	system("color 0A");
	//输入六个参量
	input();
	//例子
	//p1 = 3.1e6; p2 = 5.5e6; Ap = 3; s1 = 3.8e6; s2 = 4.8e6; As = 20;
	//p1 = 0; p2 = 750; Ap = 3; s1 = 0; s2 = 1600; As = 7;
	p1 *= 2 * PI; p2 *= 2 * PI; s1 *= 2 * PI; s2 *= 2 * PI;
	compilation(p1, p2, Ap, s1, s2, As);

	return 0;
}

2.2 测试1

带阻滤波器:p1 = 3.1e6; p2 = 5.5e6; Ap = 3; s1 = 3.8e6; s2 = 4.8e6; As = 20;

2.3测试2

 低通滤波器:p1 = 0; p2 = 750; Ap = 3; s1 = 0; s2 = 1600; As = 7;

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/643103.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

634 · 单词矩阵

链接&#xff1a;LintCode 炼码 - ChatGPT&#xff01;更高效的学习体验&#xff01; . - 力扣&#xff08;LeetCode&#xff09; 题解&#xff1a; class Solution { public: struct Trie {Trie() {next.resize(26, nullptr);end false;} std::vector<Trie*> next; b…

信息系统项目管理师十大管理计划内容概览

目录 1.项目章程2.项目管理计划3.范围管理计划4.需求管理计划5.进度管理计划6.成本管理计划7.质量管理计划8.资源管理计划9.沟通管理计划10.风险管理计划11.采购管理计划12.干系人参与计划 点我去AIGIS公众号查看本文 1.项目章程 项目目标成功标准退出标准关键干系人名单发起人…

【基于springboot+vue的房屋租赁系统】

介绍 本系统是基于springbootvue的房屋租赁系统&#xff0c;数据库为mysql&#xff0c;可用于日常学习和毕设&#xff0c;系统分为管理员、房东、用户&#xff0c;部分截图如下所示&#xff1a; 部分界面截图 用户 管理员 联系我 微信&#xff1a;Zzllh_

【小沐学GIS】GDAL库安装和使用(C++、Python)

文章目录 1、简介2、下载和编译&#xff08;C&#xff09;2.1 二进制构建2.1.1 Conda2.1.2 Vcpkg 2.2 源代码构建2.2.1 nmake.opt方式构建2.2.2 generate_vcxproj.bat方式构建 2.3 命令行测试2.3.1 获取S57海图数据 2.4 代码测试2.4.1 读取tiff信息 3、Python3.1 安装3.2 测试3…

实时通信的方式——WebRTC

文章目录 基于WebRTC实现音视频通话P2P通信原理如何发现对方&#xff1f; 不同的音视频编解码能力如何沟通&#xff1f;&#xff08;媒体协商SDP&#xff09;如何联系上对方&#xff1f;&#xff08;网络协商&#xff09; 常用的API音视频采集getUserMedia核心对象RTCPeerConne…

对vue3/core源码ref.ts文件API的认识过程

对toRef()API的认识的过程: 最开始认识toRef()是从vue3源码中的ref.ts看见的,右侧GPT已经举了例子 然后根据例子,在控制台输出ref对象是什么样子的: 这就是ref对象了,我们根据对象中有没有__v_isRef来判断是不是一个ref对象,当对象存在且__v_isRef true的时候他就判定为是一个…

5.20Git

版本控制工具Git&#xff0c;其他的工具还有SVN 共享代码&#xff0c;追溯记录&#xff0c;存储.c文件 Git实现的功能&#xff1a;回溯&#xff08;以前某个时间节点的数据情况&#xff09;共享&#xff08;大家共享修改&#xff09; Git&#xff1a;80% SVN&#xff…

webpack编译过程

webpack编译过程 初始化 此阶段&#xff0c;webpack会将**CLI参数**、**配置文件**、**默认配置**进行融合&#xff0c;形成一个最终的配置对象。​ 对配置的处理过程是依托一个第三方库yargs完成的 ​ 此阶段相对比较简单&#xff0c;主要是为接下来的编译阶段做必要的准备 ​…

从 Word 文档中提取图像:docx和 wxPython 的强强联合

在文档处理领域&#xff0c;Word 文档通常包含嵌入的图像&#xff0c;这些图像可以增强视觉吸引力和有效地传达信息。然而&#xff0c;从 Word 文档中提取这些图像可能是一项耗时费力的任务&#xff0c;特别是当您需要处理多个文件时。此时&#xff0c;Python 和 wxPython 就派…

翻译AnyDoor: Zero-shot Object-level Image Customization

摘要 本研究介绍了AnyDoor&#xff0c;这是一款基于扩散模型的图像生成器&#xff0c;能够在用户指定的位置&#xff0c;以期望的形状将目标对象传送到新场景中。与为每个对象调整参数不同&#xff0c;我们的模型仅需训练一次&#xff0c;就能在推理阶段轻松地泛化到多样化的对…

使用git生成SSH公钥,并设置SSH公钥

1、在git命令行里输入以下命令 ssh-keygen -t rsa 2、按回车&#xff0c;然后会看到以下字眼 Generating public/private rsa key pair. Enter file in which to save the key (/c/Users/xxx/.ssh/id_rsa) 例&#xff1a; 3、继续回车&#xff0c;然后会看到以下字眼 Enter…

深入探索:移动云服务器的强大之处

文章目录 一 什么是移动云二 移动云服务器的使用三 移动云服务器的优点四 在移动云上部署node.js项目五 移动云服务器的应用场景六 移动云服务器的使用体验总结 一 什么是移动云 移动云是指用户可以通过移动设备访问云端的数据和应用&#xff0c;无需在本地设备上进行存储和处…

html通过数据改变,图片跟着改变

改变前 改变后 通过数据来控制样式展示 <template><div>通过num控制图标是否更改{{num}}<div class"box"><!-- 如果num大于1则是另一种&#xff0c;样式&#xff0c;如果小时1&#xff0c;则是另一种样式 --><div class"item&qu…

python-计算比赛最终成绩

【问题描述】学校举办“爱中华&#xff0c;爱经典”经典古诗词朗诵大赛&#xff0c;一共邀请了n位评委为每一名参赛选手评分&#xff0c;每位评委对某选手的评分从键盘输入&#xff0c;并存入一个列表中&#xff0c;去掉一个最高分&#xff0c;去掉一个最低分后&#xff0c;其余…

OWASP top10--SQL注入(一)

SQL注入式攻击技术&#xff0c;一般针对基于Web平台的应用程序.造成SQL注入攻击漏洞的原因&#xff0c;是由于程序员在编写Web程序时&#xff0c;没有对浏览器端提交的参数进行严格的过滤和判断。用户可以修改构造参数&#xff0c;提交SQL查询语句&#xff0c;并传递至服务器端…

深入探索Python基础:两个至关重要的函数

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、初学者的基石&#xff1a;print与input函数 二、类型转换&#xff1a;从字符串到浮点数…

牛客小白月赛94 解题报告 | 珂学家 | 茴字有36种写法

前言 很久没写题解了&#xff0c;有幸参加了94小白月赛内测&#xff0c;反馈是很nice&#xff0c;AK场。 争议的焦点在于哪题最难 D题E题(没有F题)F题(没有E题) 你选哪题呢&#xff1f; 题解 欢迎关注 珂朵莉 牛客周赛专栏 珂朵莉 牛客小白月赛专栏 A. 小苯的九宫格 思路…

element-ui 前端ui框架用法开发指南(2024-05-22)

Element&#xff0c;一套为开发者、设计师和产品经理准备的基于 Vue 2.0 的桌面端组件库 1、npm安装 // npm安装&#xff1a;npm install element-ui --save 能更好地和 webpack 打包工具配合使用 2、cdn在线引入 访问最新版本的资源地址 - element-uiThe CDN for element-u…

ComfyUI完全入门:图生图局部重绘

大家好&#xff0c;我是每天分享AI应用的萤火君&#xff01; 这篇文章的主题和美女有关&#xff0c;不过并不是教大家生产美女视频&#xff0c;而是讲解 ComfyUI 的图生图局部重绘&#xff0c;其中将会以美女图片为例&#xff0c;来展示局部重绘的强大威力。 先看看效果&…

[机缘参悟-187] - 《道家-水木然人间清醒1》读书笔记 - 真相本质 -10- 关系界限 - 一个人只有放下自我,才能看清世界的真相

目录 一、现实生活中&#xff0c;每个人都是盲人摸象 二、一个人认知的本质是神经网络的模型训练 三、每个人的认知具有局限 四、放下自我&#xff0c;就是跳出自我的认知局限 五、站在上帝的视角&#xff0c;俯瞰不同众生的千差万别的大脑认知系统 六、个体的独特性&…