北邮22级信通院DSP:IIR_DF系统3.0版:从H(p)到H(s):一种更为严谨精确的运算模式

北邮22信通一枚~

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

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

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

承接上一篇博客

北邮22级信通院DSP:IIR_DF系统2.0版:用C++程序自主写题——第四章IIR_DF设计的大部分题目——给定参量和选用的方法,设计出IIR_DF,一直进行到得出H(s)-CSDN博客

在原有的基础上,应对通带衰减系数不是3dB的情况,提出了一种更为严谨精确的计算模式。

先来展示运行效果

一、更为严谨精确的complication()函数

因为对butterworth滤波器来说,表达式为:

\frac{1}{1+(\frac{\Omega }{\Omega_{c}})^{2N}}

        所以如果用butterworth滤波器进行拟合,就需要确定参量N和Ωc,其中Ωc的意思是通带3dB截止频率。没有引入频率归一化定义时,对N的计算公式应为:

N\geqslant \frac{lg(\frac{10^{0.1As}-1}{10^{0.1Ap}-1})}{2lg(\frac{\Omega_{s}}{\Omega_{p}})}

频率归一化的工作,主要是为了“查表法”操作的可实现性。λs定义为:

\lambda _{s}=\frac{\Omega_{s}}{\Omega_{c}}

        所以如果通带衰减不是3dB,不能笼统的认为Ωp=Ωc,而是应该应用公式计算Ωc。在查表法将H(p)转换为H(s)时,对低通滤波器应该将p换为s/Ωc,对高通滤波器应该将p换成Ωc/s。

对Ωc的计算有两种方法,分别是利用通带截频、通带衰减系数和阻带截频、阻带衰减系数来计算Ωc的值。

\Omega _{c}=\frac{\Omega _{p}}{\sqrt[2N]{10^{0.1Ap}-1}}

\Omega _{c}=\frac{\Omega _{s}}{\sqrt[2N]{10^{0.1As}-1}}

        由于N向上取整,所以两种方法的计算结果会略有不同。

        原码对所有测试用例均正确的原因是,由于衰减系数和阶数对Ωc和Ωp的近似程度影响较小,对λs的影响也就较小。带入归一化频率公式:

N\geqslant \frac{lg(\frac{10^{0.1As}-1}{10^{0.1Ap}-1})}{2lg(\frac{\lambda _{s}}{\lambda _{p}})}

        对由于分母进行取对数运算,导致误差影响更小,以至于对N的影响几乎为0。

        但是将H(p)转为H(s)时候就“露馅”了,因为对低通滤波器和高通滤波器来说,我们需要将p分别替换的是s/Ωc和Ωc/s。

        所以综上,对于通带截频不是3dB的情况,我们还是应该首先计算Ωc的值

        如果不是通带截频不是3dB的话,我们就需要确定Ωc——>确定λs——>从而用归一化频率的N计算式来确定N,但是我们在确定Ωc的时候就需要使用N这个值,所以——

        对更为严谨精确的运算过程,我们应该采用的是非归一化频率的N计算式,得到N之后,判断通带衰减系数是不是3dB,如果不是,我们计算Ωc,并最终应用于H(p)转H(s)的过程中。

         所以我们需要改动的函数是complication()。

        原码:

void compilation()
{ld center = 0;input();change();//判断滤波器类型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:throw"error:参数不符合滤波器特征"; break;}cout << endl << "参量下滤波器存在性与对应方法局限性自检成功…" << endl;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 || check_types(p1, p2, s1, s2) == 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 compilation()
{ld center = 0;input();change();//判断滤波器类型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:throw"error:参数不符合滤波器特征"; break;}cout << endl << "参量下滤波器存在性与对应方法局限性自检成功…" << endl;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的值double temp_1 = log10((pow(10, 0.1 * As) - 1) / (pow(10, 0.1 * Ap) - 1));double temp_2 = log10(abs(s2 - s1) / abs(p2 - p1));//cout << temp_1 << endl;//cout << temp_2 << endl;int N = ceil(temp_1 / (2 * temp_2));//计算3dB截频Acp = (Ap == 3) ? abs(p2 - p1) : (abs(p2 - p1) / pow((pow(10, 0.1 * Ap) - 1), 0.5 / N));Acs = (Ap == 3) ? abs(s2 - s1) : (abs(s2 - s1) / pow((pow(10, 0.1 * As) - 1), 0.5 / N));cout << endl << "用通带截频和衰减系数计算Ωc得:" << Acp << endl;cout << endl << "用阻带截频和衰减系数计算Ωc得:" << Acs << endl;//根据N的值查表得到低通滤波器归一化传输函数Hlp(p)分母表达式cout << endl << "butterworth滤波器的阶数为N = " << N << ";" << endl;cout << endl << "归一化传输函数为:H(p) = ";show(N, "p");cout << "用Ωp计算得到的";string show_next_level_Acp = is_p(check_types(p1, p2, s1, s2), Acp, center);string show_next_level_Acs = is_p(check_types(p1, p2, s1, s2), Acs, center);cout << endl << "传输函数H(s) = ";show(N, show_next_level_Acp);cout << "用Ωs计算得到的";cout << endl << "传输函数H(s) = ";show(N, show_next_level_Acs);
}

其中,新增的变量Acp和Acs分别对应:用通带参量计算出的Ωc和用阻带参量计算出的Ωc。

二、总体代码

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
#define UN_KNOWN 5#define USING_IIM 6
#define USING_BLT 7typedef 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}
};int filter_type;
int operate_type;
ld p1, p2, s1, s2, Ap, As, fs, Acp, Acs;//标准输出
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;
}//判断选通滤波器类型
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);elsereturn (s2 != p2) ? (s2 < p2 ? IS_HP : IS_LP) : (ERROR);
}void change()
{p1 *= 2 * PI; p2 *= 2 * PI; s1 *= 2 * PI; s2 *= 2 * PI;//如果是双线性变换法,需要进行预畸变处理。//如果是低通或高通,原本是0的数字频率经预处理后还是0不变,归一化了。if (operate_type == USING_BLT){p1 = 2 * fs * tan(0.5 * p1 / fs);p2 = 2 * fs * tan(0.5 * p2 / fs);s1 = 2 * fs * tan(0.5 * s1 / fs);s2 = 2 * fs * tan(0.5 * s2 / fs);}//cout << p1 << endl << p2 << endl << s1 << endl << s2 << endl;//如果是冲激响应不变法,则不用进行预畸变处理。//由于冲激响应不变法不能处理高通和带阻滤波器,//所以当程序判断为高通或带阻滤波器时,应报错。filter_type = check_types(p1, p2, s1, s2);if (operate_type == USING_IIM)if (filter_type == IS_HP || filter_type == IS_BS)throw"error:冲激响应不变法不能用于设计高通或带阻滤波器";
}auto format_double_value(double val, int fixed) {std::ostringstream oss;oss << std::setprecision(fixed) << val;return oss.str();
}string is_p(int type, ld bindwith, ld& center)
{string output;if (type == IS_LP)output = "(s/" + format_double_value(bindwith, define_setpercision) + ")";else if (type == IS_HP)output = "(" + format_double_value(bindwith, define_setpercision) + "/s";else if (type == IS_BP)output = "((s^2+" + format_double_value(pow(center, 2), define_setpercision) + ")/" +"(" + format_double_value(abs(p2 - p1), define_setpercision) + "*s" + "))";else if (type == IS_BS)output = "((" + format_double_value(abs(p2 - p1), define_setpercision) + "*s" + ")/" +"(s^2+" + format_double_value(pow(center, 2), define_setpercision) + "))";elseoutput = "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)) + "))";elseoutput = "error";return output;
}void input()
{string get_input;cout << endl << "欢迎登录IIR_DF设计系统!" << endl;cout << endl << "我们需要获取您的一些数据要求~" << endl;cout << endl << "请问您想使用哪种方法设计IID_DF?" << endl;cout << "如果想使用冲激响应不变法,请输入iim;\\n如果想使用双线性不变法,请输入blt:" << endl;cin >> get_input;(get_input == "iim" || get_input == "blt") ?(operate_type = (get_input == "iim") ? USING_IIM : USING_BLT) :(throw "error:输入错误!");cout << endl << "下面我们将获取您希望最终得到的数字指标。" << endl;cout << "请输入您想设计的数字滤波器类型(包括LP、HP、BP、BS、UNKNOWN):";cin >> get_input;if (get_input == "LP")filter_type = IS_LP;else if (get_input == "HP")filter_type = IS_HP;else if (get_input == "BP")filter_type = IS_BP;else if (get_input == "BS")filter_type = IS_BS;else if (get_input == "UNKNOWN") filter_type == UN_KNOWN;else { cout << "error:输入错误!"; exit(0); }cout << endl << "下面是关于键入频率和衰减系数的指标的一些声明。\n\
声明:\n\
因为在模拟域中,低通滤波器的通带和阻带下截止频率均趋于负无穷,\n\
所以在数字域中,低通滤波器的通带和阻带下截止频率均趋于0,\n\
所以如果是低通滤波器,程序默认在通带和阻带下截频位置(p1、s1)键入0;\n\
同理,\n\
因为在模拟域中,高通滤波器的通带和阻带上截止频率均趋于正无穷,\n\
所以在数字域中,高通滤波器的通带和阻带上截止频率均趋于0,\n\
所以如果是低通滤波器,程序默认在通带和阻带上截频位置(p2、s2)键入0;" << endl;cout << endl << "请输入取样频率(Hz):"; cin >> fs;cout << endl << "请输入通带起始频率p1(Hz):";if (filter_type == IS_LP) { p1 = 0; cout << p1; }else cin >> p1;cout << endl << "请输入通带截止频率p2(Hz):";if (filter_type == IS_HP) { p2 = 0; cout << p2; }else cin >> p2;cout << endl << "请输入通带衰减系数(dB):"; cin >> Ap;cout << endl << "请输入阻带起始频率s1(Hz):";if (filter_type == IS_LP) { s1 = 0; cout << s1; }else cin >> s1;cout << endl << "请输入阻带截止频率s2(Hz):";if (filter_type == IS_HP) { s2 = 0; cout << s2; }else cin >> s2;cout << endl << "请输入阻带衰减系数(dB):"; cin >> As;cout << endl;cout << "运算结果为:" << endl;
}void compilation()
{ld center = 0;input();change();//判断滤波器类型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:throw"error:参数不符合滤波器特征"; break;}cout << endl << "参量下滤波器存在性与对应方法局限性自检成功…" << endl;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的值double temp_1 = log10((pow(10, 0.1 * As) - 1) / (pow(10, 0.1 * Ap) - 1));double temp_2 = log10(abs(s2 - s1) / abs(p2 - p1));//cout << temp_1 << endl;//cout << temp_2 << endl;int N = ceil(temp_1 / (2 * temp_2));//计算3dB截频Acp = (Ap == 3) ? abs(p2 - p1) : (abs(p2 - p1) / pow((pow(10, 0.1 * Ap) - 1), 0.5 / N));Acs = (Ap == 3) ? abs(s2 - s1) : (abs(s2 - s1) / pow((pow(10, 0.1 * As) - 1), 0.5 / N));cout << endl << "用通带截频和衰减系数计算Ωc得:" << Acp << endl;cout << endl << "用阻带截频和衰减系数计算Ωc得:" << Acs << endl;//根据N的值查表得到低通滤波器归一化传输函数Hlp(p)分母表达式cout << endl << "butterworth滤波器的阶数为N = " << N << ";" << endl;cout << endl << "归一化传输函数为:H(p) = ";show(N, "p");cout << "用Ωp计算得到的";string show_next_level_Acp = is_p(check_types(p1, p2, s1, s2), Acp, center);string show_next_level_Acs = is_p(check_types(p1, p2, s1, s2), Acs, center);cout << endl << "传输函数H(s) = ";show(N, show_next_level_Acp);cout << "用Ωs计算得到的";cout << endl << "传输函数H(s) = ";show(N, show_next_level_Acs);
}int main()
{system("color 0A");try{compilation();}catch (const char* cc){cout << cc;exit(0);}return 0;
}

2.2执行效果 例题4-10

除了H(s),其余均与 北邮22级信通院DSP:IIR_DF系统2.0版:用C++程序自主写题——第四章IIR_DF设计的大部分题目——给定参量和选用的方法,设计出IIR_DF,一直进行到得出H(s)-CSDN博客

中的执行效果相同。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用Python优雅地写LaTeX

latexify用于生成 LaTeX 数学公式的 Python 库。LaTeX 是一种基于 ΤΕΧ 的排版系统&#xff0c;对于展示复杂的数学公式表现极为出色。该项目可以用 Python 函数&#xff0c;轻松生成复杂的 LaTeX 数学公式描述。 安装库 查看版本号 0.4.2 案例演示 我们需要以装饰器的形式…

Nginx实战:浏览器缓存

浏览器缓存 浏览器缓存是为了加速浏览&#xff0c;浏览器在用户磁盘上&#xff0c;对最近请求过 的文档进行存储。当访问者再次请求这个页面时&#xff0c;浏览器就可以从 本地磁盘显示文档&#xff0c;这样&#xff0c;就可以加速页面的阅览&#xff0c;缓存的方式节 约了网络…

报表工具DataEase技术方案(二)

一、DataEase报表功能开发流程 1. 创建数据源 2. 创建数据集 可以创建多种来源的数据集&#xff0c;这里以SQL数据集为例。 数据集SQL中可以添加参数&#xff0c;仪表板展示数据时可以根据参数来筛选数据。 数据集添加计算字段 3. 创建仪表板 &#xff08;1&#xff09;组合…

参数设置错误导致的 OOM

参数设置错误导致的 OOM 前言事故分析事故原因事故复盘 前言 2024 年 5 月 10 日 14 时 19 分&#xff0c;C 公司开发人员向 A 公司开发人员反映某开放接口从 2024 年 5 月 10 日 14 时许开始无法访问和使用。该系统为某基础数据接口服务&#xff0c;基于 HTTP 协议进行通信。…

linux安装MYSQL后,利用grep查看MYSQL初始密码

问题描述 linux安装mysql获取初始密码 解决方案&#xff1a; 通过查看日志获取初始密码 grep "password" /var/log/mysqld.loggrep 是一个用于在文本中查找特定字符串的工具。 /var/log/mysqld.log 是要搜索的文件路径&#xff0c;"password" 是要查找的…

CMake的作用域:public/private/interface

在 CMake 中&#xff0c;public、private和 interface是用来指定目标属性的作用域的关键字&#xff0c;这三个有什么区别呢&#xff1f;这些关键字用于控制属性的可见性和传递性&#xff0c;影响了目标之间的依赖关系和属性传递。 public 如果在一个目标上使用 public关键字时…

CTFHUB-信息泄露-目录遍历和PHPINFO

目录 目录遍历 PHPINFO 目录遍历 很简单&#xff0c;挨着把每个目录都点开看一下 发现2目录下有个 flag.txt 文件&#xff0c;点开发现了本关的flag PHPINFO 这关也很简单&#xff0c;进来之后是一个phpinfo页面&#xff0c;按 CTRL F键打开查询&#xff0c;输入flag&#…

window本地部署Dify

Dify与之前的MaxKB不同&#xff0c;MaxKB可以实现基础的问答以及知识库功能&#xff0c;但是如果要开发一个Agent&#xff0c;或者工作流就还是需要额外开发&#xff0c;而Dify 是一个开源 LLM 应用开发平台。其直观的界面结合了 AI 工作流、RAG 管道、代理功能、模型管理、可观…

一个不错的讲解做竞品分析的方法

比如选了竞品1&#xff0c;竞品2&#xff0c;然后每个功能项&#xff0c;选定1个做标准被比较的锚点&#xff0c;比如外观&#xff0c;用竞品2&#xff0c;设置为1分&#xff0c;然后看竞品1&#xff0c;在外观的评分上&#xff0c;相比竞品2&#xff0c;是分数低点还是高点&am…

缓冲区溢出攻击

缓冲区溢出攻击 缓冲区溢出概述基础概念缓冲区溢出根源缓冲区溢出危害性&普遍性 缓冲区溢出攻击原理内存分配模式缓冲区溢出攻击缓冲区溢出攻击原理缓冲区溢出攻击分类堆栈溢出堆栈相关知识攻击原理 堆溢出攻击堆简介堆溢出DWORD SHOOT BSS段溢出 缓冲区溢出攻击防御措施防…

Frida使用与解题

对于 Android 逆向&#xff0c;首先需要熟悉对于 adb 基本命令使用 1.C:\Users\sun>adb shell ASUS_I003DD:/ # getprop ro.product.cpu.abi x86_64 查看架构 exit 退出 2. adb push "E:\reverse\ida\IDA_Pro_7.7\IDA_Pro_7.7\IDA_Pro_7.7\dbgsrv\android_x86_ser…

LeetCode162寻找峰值元素

题目描述 峰值元素是指其值严格大于左右相邻值的元素。给你一个整数数组 nums&#xff0c;找到峰值元素并返回其索引。数组可能包含多个峰值&#xff0c;在这种情况下&#xff0c;返回 任何一个峰值 所在位置即可。你可以假设 nums[-1] nums[n] -∞ 。你必须实现时间复杂度为…

09Linux GDB学习笔记

Linux GDB使用 目录 文章目录 Linux GDB使用先编译文件1.检查安装1.1 安装GDB 2.启动GDB3.退出GDB4.设置断点4.1 在指定行号处设置断点4.2 在指定函数名处设置断点4.3 在指定源文件和行号处设置断点 4.4查看断点信息4.5删除断点5.运行5.1 <font color#ff0000>逐过程&am…

认识JAVA中的异常

目录&#xff1a; 一. 异常概念与体系结构 二. 异常的处理 三. 自定义异常类 一. 异常概念与体系结构: 1 异常的概念:在 Java 中&#xff0c;将程序执行过程中发生的 不正常行为 称为异常&#xff0c; 如&#xff1a;算数异常&#xff1a; ArithmeticException System.out.pri…

大豆、棉花深度学习数据集大合集

最近收集了一大波关于大豆和棉花的深度学习数据集&#xff0c;主要有叶片的识别、分类、计数以及病害检测等。 数据集的价值 科研价值&#xff1a;这些数据集为植物学、农业信息技术、机器学习等领域的科研人员提供了宝贵的资源。它们可以用于训练和优化各种深度学习模型&…

CCF CAT- 全国算法精英大赛(2024第二场)往届真题练习 4 | 珂学家

前言 餐馆 思路&#xff1a;可撤销的0-1背包 考察了多个知识点&#xff0c;包括 差分技巧离线思路0-1背包 不过这题卡语言&#xff0c;尤其卡python import java.io.*; import java.util.*; import java.util.stream.Collectors; import java.util.stream.IntStream;public…

C#开发的应用升级更新服务器端工具 - 开源研究系列文章 - 个人小作品

笔者开发过一些小应用&#xff0c;然后这些应用就需要有升级更新的功能&#xff0c;但是如果每个都集成进去也行&#xff0c;但是就是得写死更新的代码了。于是就想写一个应用升级更新的管理器&#xff0c;以前看到过Github上有一个AutoUpdate.Net&#xff0c;不过它那个要集成…

2024最新VMware Workstation Pro下载教程

自从2024年5月份之后&#xff0c;VMware workstation player就不能直接在vm官网下载,需要到broadcom博通网站上下载 下面介绍最新下载步骤&#xff1a; 百度直接搜索vmware 进入官网点击Workstation Pro链接 博通注册对应的账号 现在下载都需到博通注册对应的账号 登录邮…

展台设计需要注意哪些问题

一、明确设计目标与主题 在设计之前需要明确展台设计目标和主题。设计目标是指展台设计所要达到的目的和效果&#xff0c;提高企业知名度、促进产品销售等&#xff1b;设计主题则是展台设计的核心和灵魂&#xff0c;贯穿整个展台设计的风格和形式。参展企业需要清晰地界定设计目…

Linux常用环境Docker安装

一、mysql安装 简单安装 docker run -d \--name mysql \-p 3306:3306 \-e TZAsia/Shanghai \-e MYSQL_ROOT_PASSWORD123 \mysql mysql容器本地挂载 cd /usr mkdir mysql cd mysql/ mkdir data mkdir conf mkdir init可以手动导入自己的数据库信息 docker run -d \--name mys…