ECG心电前级信号提取

由于ECG信号很微弱,处于mV级别,还有很多干扰信号,所以采集信号时需要进行滤波和放大处理,然后使用模数转换。为了滤波高频干扰和工频噪声,需要使用低通滤波器和陷波器抑制噪声,有时也要使用高通滤波器滤除低频噪声。信号滤除干净后有两种处理方式:

  • 放大后进行ADC处理

  • 使用高精度ADC采样

前者将信号放大几百倍,满足ADC的输入范围,这种情况用于低分辨率的ADC,比如16bit,大部分使用独立器件堆叠电路。

后者直接获取微弱信号,使用高分辨率ADC(一般为∑-ΔADC),比如24bit,精度可达到uV,一般使用集成器件。

在进入ADC之前的处理称为模拟前端。

根据ADI官网介绍,ECG信号的采集方式分为:交流耦合和直流耦合。具体资料见^1

ECG测量的基本电路框图如下所示。

ecg基本电路

其原理可以参考ECG信号内容。

一般其技术指标类似:

  1. 输入阻抗:≥5MΩ

  2. 输入偏置电流:<2nA

  3. 等效输入噪声:<30uVpp

  4. 共模抑制比:50Hz正弦信号的共模抑制比≥90dB

  5. 耐极化电压:±300mV

  6. 漏电流:<30uA

  7. 频带:0.05~100Hz

采集心电信号时,使用电极片贴在人体上,再连接到板卡上,通过滤波、放大后进入ADC,最终转换为电压信号。由于人体信号微弱,且人体存在一定的电阻,所以电极片与人体间会有极化电压^2;另外导联线通常是屏蔽线缆,线缆过长会有线缆阻抗,出现共模电压和差模电压,导致信号有直流量,影响放大电路的输入电压。故前端电路首先要处理的就是干扰、共模和差模信号,然后才是放大信号。

前置滤波多使用RC电路,根据ECG信号频率,可知心电信号截止频率为0.1Hz~200Hz处,通常将通带范围设定在该区域就可以保证获取到正常的心电信号。但是心电监护测量参数不仅仅包含心电信号,还有pace检测和呼吸波(呼吸阻抗测量)。

Note:
人体呼吸运动时,胸壁肌肉运动导致胸廓交替变形,肌体组织的电阻抗也交替变化,  
变化量约为0.1ohm~3ohm,称为呼吸阻抗。

pace信号为起搏器(pace maker)所产生,形态上为脉冲信号,宽度为0.1ms~2ms,频率约为500Hz~1kHz。

呼吸阻抗测量通常使用交流载波10kHz以上的信号。

综上,需要考虑是否需要测量pace和呼吸波,据此可以得出前置滤波电路截止频率设定一般为200Hz、1kHz、10kHz、30kHz、50kHz等。

使用TI TINA进行RC仿真,电路如下所示。

LPecg

仿真结果如下所示。

LPecgresult

可见三者截止频率(-3dB)分别为:2.37kHz,88kHz,4.8kHz。

第一个使用二级RC滤波电路,需要测量pace信号。

第二个使用一级RC滤波,需要测量pace和呼吸波。

第三个使用一级RC滤波,需要测量pace信号。

可见对于高于100kHz的信号均有抑制作用。

抗高频干扰¶

ECG信号通过导联线连接到电极上,电极粘贴在人体上。这部分信号会引入很多干扰,包括高频和低频信号。由于ECG有效信号为低频信号,故使用低通滤波器滤除高频信号。常使用RC滤波电路,有时为了增加滚降率(增强高频衰减)使用多级RC滤波电路。

如上图所示,若使用一级RC,则只有20dB/Decade,二级则有40dB/Decade,可以增强低通滤波器的抑制能力。

pace信号检测¶

标准对需要捕获的起搏器信号的高度和宽度等具体要求有所差异^3。

  • AAMI EC11:1991/(R)2001/(R)2007

  • EC13:2002/(R)2007, IEC60601-1 ed. 3.0b, 2005

  • IEC60601-2-25 ed. 1.0b

  • IEC60601-2-27 ed. 2.0, 2005

  • IEC60601-2-51 ed. 1.0, 2005

IEC60601-2-27规定:

设备须能够显示存在幅度为±2 mV至±700 mV、持续时间为0.5 ms至2.0 ms的起搏器脉冲的心电图信号。显示屏上的起搏器脉冲应清晰可见,折合到输入端(RTI)的幅度不得小于0.2 mV;

AAMI EC11则规定:

设备须能显示存在幅度为2 mV至250 mV、持续时间为0.1 ms至2.0 ms、上升时间少于100 µs且频率为100 脉冲/分的起搏器脉冲的心电图信号。对于持续时间为0.5 ms至2.0 ms(幅度、上升时间和频率参数如上一句所规定)的起搏器脉冲,必须在心电图中显示该起搏器脉冲;显示屏上应予以清晰的展现,折合到输入端的幅度不得小于0.2 mV。

因为pace信号中心频率为5kHz,为了拾取pace信号,带宽不能太低。若不需要pace信号,可以降低带宽到200Hz。

对于pace信号,选择5kHz之前的需要对pace信号进行放大处理,因为会被低通滤波器衰减。不过pace脉冲可达100mV,即使被衰减也不会比心电信号还难拾取,例如上图中2.5kHz截止频率造成pace信号变弱为0.22*100mV=22mV,但是考虑到小幅度的pace信号还是要考虑后级放大处理,同时也要抑制原始ECG信号防止被放大从而干扰pace检测,这也决定了通过硬件上检测时要使用带高通性质的微分电路^4。

使用微分电路的优点:

  • 滤除原始心电信号

  • 检测脉冲上升沿和下降沿,而不是电平

  • 隔离直流信号

能检测出脉冲波的形态,检测电平有可能会是阶跃信号,而阶跃信号不能识别为pace。

Note:
最小pace信号:100us/2mV
最大pace信号:2ms/700mV或者2ms/250mV

工作原理¶

具有放大功能的微分电路如下所示[^5]。

微分电路

高通的截止频率由C1和R1决定,C2进行相位补偿,R2调节比例。其中C1也可以称为“隔直电容”,用于通交流阻直流。脉冲信号的交流部分通过,直流部分被抑制。

在后面使用双路阈值(窗口阈值)比较电路进行输出(双阈值表示上升沿阈值和下降沿阈值),如下图所示。

双路阈值比较

使用2mV/100us的方波进行仿真简单的微分电路(高通滤波器),如下图所示。

Snipaste_2020-04-06_17-57-55

高通波形

微分电路仿真结果

在方波上升沿和下降沿都有电容放电现象,结果为斜波。下降/上升的时间与RC(时间常数)有关。

分析比较电路。V1>V2。Vout>V1时,输出低电平。Vout<V2时,输出低电平。V2<Vout<V1时,输出高电平。平时输出高电平。可见检测的是“尖尖”。当然如果放大倍数过高,可能“尖尖”会被削顶。需要考虑的是“尖尖”的宽度是否能被比较器检测到,以及太宽后导致比较器一直输出高电平,两者或多或少都会对判断产生影响。

从图上所示,经过高通后波形会变为负的,中心电平为0V。为了方便电路使用单电源给运放供电,需要将电平拉高到0V以上,放大到负电压时会强制拉低。

假设运放为3.3V供电,则偏置电压选为3.3V/2=1.65V能保证输入范围最大。假设最小信号放大A倍,则最小信号放大后的输出电压为:A*±2mV+1.65V。当A=825时,最小信号会放大到3.3V和0V,从上图可知在低电平地方宽度会大一些,可以将放大倍数提高,因为比较器可能无法捕捉到小脉宽的信号。

完整的仿真电路如下图所示。

pace检测电路

设定的阈值为2.7V/2.3V。

对2mV/100us脉冲进行时域仿真,结果如下图所示。

pace检测电路仿真结果

在低于2.3V后输出低电平,之后高于2.3V时输出高电平。

其幅频特性如下图所示。

pace检测电路幅频特性

最大放大倍数为44.38dB=165,最小电压为2.5-165*2m=2.17V,与仿真结果相差不大。

仿真原始文件见^6。

器件选择¶

阻容¶

使用1%精度电阻,同时需要左WCA分析(Worst Case Analysis),看最差情况下的阈值范围。

运放¶

小信号的pace幅度只有2mV,大信号有700mV,采用放大电路放大该斜波输入信号,则SR(压摆率)=V/t。放大电路中运放需要高带宽,高压摆率。

pace为高速信号,故宜采用高速比较器,同时tail-to-tail。

第二种电路¶

完整电路如下图所示。采用双电源供电,能保证负脉冲信号能检测导。

pace检测电路2

同样,仿真结果如下图所示。

pace检测电路2仿真结果

幅频特性如下图所示。

pace2检测电路幅频特性

最大放大倍数为46dB=200,最小电压为2.5-2m*200=2.1V,与仿真结果相差不大。

仿真原始文件见^7。

第三种电路¶

使用单电源,但是信号来源于PGA的输出。基本电路如下图所示。

image-20210208235549979

后面是将U2运放作为比较器使用,故当VM2为负电平时无法起到放大作用,而输出0(低电平)。该电路只能检测出pace信号上升沿,不能检测下降沿。R5为了保证输入信号平衡,为R4||R6=4.1k。

VM2处信号的幅频特性如下图所示。

image-20210208235938981

最大放大倍数为48.48dB=265,最小电压为2m*265=0.53V,与仿真结果相差不大。

仿真原始文件见^16。

抗工频干扰¶

工频干扰来自常规用电中的交流电。由于市电为交流电,所有使用市电的设备都会与人体产生同频的干扰,导致干扰会通过导联线进入系统。如下图所示。

共模干扰模型

市电网络与人体,人体和大地都有等效电容存在,而市电为交流,则人体上会有分压,频率与市电一样。其产生的微弱电流为“位移电流”。

以单导测量为例,分析“位移电流”的影响。如下图所示。

电缆工频干扰屏蔽驱动

位移电流idb会造成共模电位Vc=idb*ZG,该共模电压为Vc,阻抗为Zin。两个电极位置的阻抗分别为Z1和Z2,则Vout计算公式如下图所示。

位移电流计算

先后为差模电压放大Gd倍,然后是屏蔽电缆共模差压放大Gd倍,最后是差分信号放大Gd倍。

从公式中可知,Vc对输出有影响,其与运放的CMRR有关,与电极位置的阻抗和运放的输入阻抗有关。为了减小影响,可以做以下措施:

  • 提高CMRR

  • 提高输入阻抗

  • 降低电极位置的阻抗差异

对于浮地设备,电缆也会引入干扰。如下图所示。

电缆工频干扰

假定:引线1中的电流是id1,引线2中的电流是id2,接地回路的电流=id1+ id2。因Z1和Z2的不一致而转变为差模电位:V+ –V- = id1Z2 – id2Z1= id (Z2 –Z1)。为了降低电缆造成的干扰,可以做以下措施:

  • 降低电极位置的阻抗差异

  • 降低id,将屏蔽线接地

电缆上得分布电容C1、C2一般为100pF/m。

如果直接使用市电供电,一定会引入工频干扰。

针对措施有以下几种:

屏蔽驱动¶

电缆的干扰是由于市电与电缆,电缆和地之间有等效电容(屏蔽线接地),产生感应电流(或者也可以是电容分压)。如下图所示。

电缆工频干扰电流

加入共模电压为Vc,如下图所示。

电缆共模转差模jpg

由于Rs、C不一样,导致进入运放得Uic1和Uic2不一样,产生差模电压Uid。其产生原因如下图所示。

电缆共模转差模电流原因

在屏蔽线上得电压因为Rs、C不一样而不同,产生了电流ic(即id),导致输入电压不同。计算公式如下图所示。

电缆工频干扰电流值

其分母为共模电压。

通过屏蔽驱动,将中心电平反馈导屏蔽线上,使分布为心电信号。如下图所示。

电缆工频干扰电流消除

最终,分母为Uid(Uic+Uid/2-Uic=Uid/2),即心电信号,极大得降低了因分布电容和电阻不同导致得差模电压,消除了共模电压产生得差模电压。

屏蔽驱动是将差分输出的中心电压通过缓冲输出导屏蔽现上。

右腿驱动¶

右腿驱动电流消除人体“位移电流”产生的影响。原理图如下所示。

右腿驱动电路

人体位移电流产生的共模电压Vc,通过放大电路反向放大后输出Vo,其相位与Vc相反,从而达到抵消的作用(电流也是相反)。上图的等效公式如下所示。

右腿驱动电路计算公式.jpg

具体工作原理可参考[^8][^9]。

一般将屏蔽驱动的输出给右腿驱动的输入,进行反向放大。

使用过程中,要考虑整个系统因为屏蔽驱动和右腿驱动构成了二级反馈闭环系统,整个系统存在稳定性问题。其中右腿驱动电路为放大电路,需要做好相位补偿和稳定性分析。

TI提供了屏蔽驱动和右腿驱动的仿真电路,见[^10]

电气隔离¶

使用隔离变压器、隔离放大器、光耦,将市电与板卡隔离,可以有效的降低工频干扰。

等效输入阻抗¶

输入阻抗是指一个电路的输入端的等效阻抗。可以理解为在输入端加上电压源U,测量输入端电流I,输入阻抗Rin就等于U/I(将所有电路元件作用的效果总和,等效到一个电阻Rin上)。

等效输入阻抗对于前级电路的滤波电容有一定的要求,这个要根据标准要求进行合理设置。根据标准要求,单端输入阻抗要大于2.5Mohm@(0.67~40Hz,交流阻抗)。由于RC后级电路的阻抗一般很高(100M以上),故输入阻抗跟小值相关,即与RC有关,则输入阻抗为Rf+Cf=Rf+1/2ΠfCf≥2.5M,则Cf≤1/(2.5M-Rf)2Πf≤1/(2.5M*2Πf)=0.0016uF=1.6nF=1600pF,即使预留一倍空间也是800pF(其中不考虑Rf可以算小值)。

故RC电路的电容总值不能高于1600pF。

输入阻抗的要求对运放的选择进行了限制,因为心电信号微弱,人体阻抗高,所以必须用高阻抗的运放才可以分压分到足够多。一般使用仪表放大器。

ESD保护¶

在导联线连接板卡的入口加上ESD管对地或者对电源,进行静电保护。有时为了保护后端的放大器,需要使用TVS管进行钳位。

ESD保护和TVS管钳位都需要保证符合标准中对于人体漏电流的要求,即单个电极流入人体的电流为0.1uA和总电流为1uA。选择保护管时需保证反向漏电流为0.1uA以下。

ESD保护对于双电源结构的,需要正向和方向都进行保护。

抗除颤¶

除颤信号功率很大,会直接通过导联线进入系统,为了保护后端电路,有两种方式:

  • 导联线接口上埋入抗除颤电路

  • 板卡上在导联线接口出按照氖管

原理上都是尽量吸收掉除颤电流,前者通过电阻发热消耗掉,后者通过电容储能。

EC13关于除颤测试电路如下图所示。

除颤测试电路

C=32uF L=25mH R+RL≤11ohm RL为DC的内阻。

测试步骤:Charge the capacitor to 5000 V, with switch S1 in position A and switch S2 closed. Discharge is accomplished by actuating S1 to position B for a period of 200 ± 100 ms. The capacitor must be disconnected to remove residual voltages and allow recovery to commence. The discharge test is applied at 20 s intervals in those cases where more than one discharge is indicated 。

先S1拨到A,然后拨到B放电。测试过程中S2始终闭合保持10Hz信号源短路(用于多次除颤后测试设备是否正常的信号源)。持续100~300ms,间隔20s。

除颤电阻的选择¶

使用抗除颤电阻时,使用该电路仿真^15,计算除颤电阻的功率。仿真图如下所示。

抗除颤仿真电路

使用时控开关控制电源,从结果可以看出在抗除颤电阻R4上有个脉冲波形,产生了脉冲电流和电压。峰值功率为30W,峰值电压达到1.72kV,脉冲时间大概为20ms。电阻必须能耐受这样的条件,否则无法满足要求。

由于波形近似为三角波,需要等效为脉冲方波(一般Datasheet中会有脉冲方波与峰值功率的对于曲线)。等效原理如下图所示。

等效方波图

其他波形等效如下图所示。

波形等效图

放电时间常数

示例中时间常数t=7.15ms,故等效脉冲宽度T=7.15ms/2=3.575ms。

峰值功率为P=(1.72kV)^2/100k=29.584W,仿真结果为30W。

则100k电阻需满足:1.72kV/3.575ms脉宽的脉冲信号峰值功率能达到30W。

若考虑降额,比如以60%为准。则脉冲电压为1.72kV/0.6=2.87kV,脉冲功率为30W/0.6=50W。

详细说,可参考^11。

陶瓷气体放电管的选择¶

除颤脉冲信号峰值电压为5kV,可选择陶瓷气体放电管(氖管)将电压降低到几十伏,然后通过钳位二极管钳位到电源电压。(陶瓷气体放电管^12英文名称为Gas Discharge Tubes

一般来说,当击穿电压超过系统绝缘的耐电强度时,放电管被击穿放电,从而在短时间内限制浪涌电压及减少干扰 能量。当具有大电流处理能力的弧光放电时,由于弧光电压低至几十伏,可以防止浪涌电压进一步上升。气体放电 管即利用这一自然原理实现了对浪涌电压的限制^13。

GDT电容容量一般为pF级别,将仿真文件中的100k电阻换成1pF电容,仿真得电容两端得脉冲信号最大值为700V/19.6ms,该值为需要考虑得脉冲击穿电压。

由于GDT最终电压会在10~35V,此时需要考虑该电压与系统电压差造成得最终电流,是否会导致弧光放电状态持续,弧光放电持续会导致GDT处于“短路”状态(弧光形成形成通路)。

在快速脉冲冲击下,陶瓷气体放电管气体电离需要一定的时间(一般为0.2~0.3μs,最快的也有0.1μs左右),因而有一个幅度较高的尖脉冲会泄漏到后面去。若要抑制这个尖脉冲,有以下几种方法:a、在放电管上并联电容器或压敏电阻;b、在放电管后串联电感或留一段长度适当的传输线,使尖脉冲衰减到较低的电平;c、采用两级保护电路,以放电管作为第一级,以TVS管或半导体过压保护器作为第二级,两级之间用电阻、电感或自恢复保险丝隔离^14。

由于除颤仿真电路一样,可知GDT得脉冲击穿电压在600~800V之间。而直流击穿电压应该大于系统电源电压,否则会导致其直流击穿导通。TVS管选择直流击穿电压作为反向击穿值,钳位电压为系统电源电压,防止直流情况下GDT直流击穿导通。

抗电刀¶

电刀为高频干扰,为几百KHz频率。常用的做法是,电缆中埋电感,使用低通滤波器抑制高频。同时电刀有辐射干扰,给模拟电路甚至整个板卡装上屏蔽罩都是需要的。

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

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

相关文章

大三学生实习面试经历(1)

最近听了一位学长的建议&#xff0c;不能等一切都准备好再去开始&#xff0c;于是就开始了简历投递&#xff0c;恰好简历过了某小厂的初筛&#xff0c;开启了线上面试&#xff0c;记录了一些问题&#xff1a; &#xff08;通过面试也确实了解到了自己在某些方面确实做的还不够…

【Android】逆向开发与反逆向开发入门知识(一)

目录 逆向开发反编译 & 反混淆反编译工具反编译反混淆 修改预置资源文件抓包前期准备二次打包重签名 如何预防 App 被逆向开发&#xff1f;代码混淆应用加固防止动态调试Root 检测二次打包检测 警告&#xff1a;逆向开发相关知识请在法律规定范围内使用&#xff0c;请勿使用…

华为Mate 70临近上市:代理IP与抢购攻略

随着科技的飞速发展&#xff0c;智能手机已经成为我们日常生活中不可或缺的一部分。而在众多智能手机品牌中&#xff0c;华为一直以其卓越的技术和创新力引领着行业的发展。近日&#xff0c;华为Mate 70系列手机的发布会正式定档在11月26日&#xff0c;这一消息引发了众多科技爱…

SQLite 和 MySQL语法区别

SQLite 和 MySQL 在 SQL 语法上有一些差异&#xff0c;这些差异主要体现在数据类型、函数、表和索引的管理等方面。以下是一些主要的不同之处&#xff1a; 1. 数据类型 SQLite 支持的数据类型包括&#xff1a;TEXT, INTEGER, REAL, BLOB。动态类型系统&#xff0c;允许在插入…

【Linux之权限】理论篇

前言 Linux的权限是我们学习Linux初期非常重要的基础知识&#xff0c;接下来我将通过一个系列【Linux之权限】&#xff0c;共三篇文章&#xff0c;对此进行较为全面和详细的解说。 sudo 情况&#xff1a;如果我们不是超级管理员&#xff0c;但是想执行一个权限级别比较高的指…

[C++] 智能指针

文章目录 智能指针的使用原因及场景分析为什么需要智能指针&#xff1f;异常抛出导致的资源泄漏问题分析 智能指针与RAIIC常用智能指针 使用智能指针优化代码优化后的代码优化点分析 析构函数中的异常问题解决方法 RAII 和智能指针的设计思路详解什么是 RAII&#xff1f;RAII 的…

spark性能优化调优指导性文件

1.让我们看一下前面的核心参数设置&#xff1a; num-executors10||20&#xff0c;executor-cores1||2&#xff0c;executor-memory10||20&#xff0c;driver-memory20&#xff0c;spark.default.parallelism64 假设我们的火花队列资源如下&#xff1a; 内存1T&#xff0c;内…

视频流媒体播放器EasyPlayer.js RTSP播放器视频颜色变灰色/渲染发绿的原因分析

EasyPlayer.js RTSP播放器属于一款高效、精炼、稳定且免费的流媒体播放器&#xff0c;可支持多种流媒体协议播放&#xff0c;无须安装任何插件&#xff0c;起播快、延迟低、兼容性强&#xff0c;使用非常便捷。 EasyPlayer.js播放器不仅支持H.264与H.265视频编码格式&#xff0…

GRE数学高频难记词(个人考前重点复习版)

numerator 分子 denominator 分母 mixed number 带分数 reduce 约分 reciprocal 倒数 consecutive integer 连续整数 terminal decimal 有限小数 repeating decimal 循环小数 ones/units 个位数 origin 原点 quadrant 象限 slope 斜率 intercept 截距 rise over run 上升运动 p…

零售项目管理的核心问题:如何让协作更高效?

在零售行业&#xff0c;团队协作的效率直接影响到市场反应速度和客户满意度。商品的上下架、库存管理、促销活动的策划与执行、跨部门的沟通与协作……每一个环节都需要精准的协调。而在这些纷繁复杂的任务中&#xff0c;项目管理软件正成为零售行业的关键工具&#xff0c;帮助…

用appinventor制作艾宾浩斯遗忘曲线app

&#xff08;呕心沥血 仅供参考&#xff09; 测试效果演示 用appinventor制作课本记背应用程序&#xff08;基于遗忘曲线设计&#xff09; 目录 效果演示 项目重难点 总体设计 系统功能模块设计 总体结构如下图所示&#xff1a; 功能模块 详细设计与实现 登录界面 界…

【设计模式】行为型模式(三):责任链模式、状态模式

行为型模式&#xff08;三&#xff09;&#xff1a;责任链模式、状态模式 5.责任链模式&#xff08;Chain of Responsibility&#xff09;5.1 通俗易懂的解释5.2 具体步骤5.3 代码示例5.3.1 处理者接口5.3.2 具体处理者5.3.3 测试类5.3.4 输出 5.4 总结 6.状态模式&#xff08;…

Docker compose部署RocketMQ(单机版)

整个工具的代码都在Gitee或者Github地址内 gitee&#xff1a;solomon-parent: 这个项目主要是总结了工作上遇到的问题以及学习一些框架用于整合例如:rabbitMq、reids、Mqtt、S3协议的文件服务器、mongodb github&#xff1a;GitHub - ZeroNing/solomon-parent: 这个项目主要是…

Ubuntu20.4系统编译瑞芯微RK3568 SDK

Ubuntu20.4系统编译瑞芯微RK3568 SDK ubuntu20.4系统中编译SDK时&#xff0c;需要安装部分依赖。除了官方给出的依赖之外&#xff0c;要先安装如下依赖&#xff0c;否则会报错 sudo apt-get install libatk-bridge2.0-02.34.1-3 -y sudo apt-get install libgtk-3-dev -y完整…

CC3学习记录

&#x1f338; CC3 之前学习到的cc1和cc6都是通过Runtime进行命令执行的&#xff0c;如果Runtime被加入黑名单的话&#xff0c;整个链子也就失效了。而cc3则是通过动态类加载机制进行任意代码执行的。 &#x1f338; 版本限制 JDK版本&#xff1a;8u65 Commons-Collections…

flutter字体大小切换案例 小字体,标准字体,大字体,超大字体案例

flutter字体大小切换案例 小字体&#xff0c;标准字体&#xff0c;大字体&#xff0c;超大字体案例 Android iOS设备带有选择记录 我的flutter项目版本 environment: sdk: ‘>3.4.4 <4.0.0’ 图片案例 pubspec.yaml 添加依赖 # 屏幕尺寸适配 https://github.com/OpenF…

设计模式(四)装饰器模式与命令模式

一、装饰器模式 1、意图 动态增加功能&#xff0c;相比于继承更加灵活 2、类图 Component(VisualComponent)&#xff1a;定义一个对象接口&#xff0c;可以给这些对象动态地添加职责。ConcreteComponent(TextView)&#xff1a;定义一个对象&#xff0c;可以给这个对象添加一…

django入门【05】模型介绍(二)——字段选项

文章目录 1、null 和 blank示例说明⭐ null 和 blank 结合使用的几种情况总结&#xff1a; 2、choices**choices 在 Django 中有以下几种形式&#xff1a;**&#xff08;1&#xff09; **简单的列表或元组形式**&#xff08;2&#xff09; **字典映射形式**&#xff08;3&#…

C++清除所有输出【DEV-C++】所有编辑器通用 | 算法基础NO.1

各位小伙伴们&#xff0c;上一期的保留小数位数教学够用一辈子&#xff0c;有不错的点赞量&#xff0c;可我连一个粉丝铁粉都没有&#xff0c;你愿意做我的第一个铁粉吗&#xff1f;OK废话不多说&#xff0c;开始&#xff01; 温故与知心 可能你也学过&#xff0c;且是工作者…

Android 中的 Zygote 和 Copy-on-Write 机制详解

在 Android 系统中&#xff0c;Zygote 是一个关键的进程&#xff0c;几乎所有的应用进程都是通过它 fork&#xff08;派生&#xff09;出来的。通过 Zygote 启动新进程的方式带来了显著的性能优势&#xff0c;这得益于 fork 操作和 Linux 中的 Copy-on-Write&#xff08;COW&am…