news 2026/10/10 17:12:28

跳变模态分解(JMD)核心原理、Matlab实现与故障诊断应用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
跳变模态分解(JMD)核心原理、Matlab实现与故障诊断应用

做设备故障诊断的人应该都遇到过这种尴尬:信号里明明有一个非常突出的冲击成分,周期性地在那儿“砰砰砰”,你拿EMD拆,拆出来的IMF是一团模糊的;换VMD拆,模态数调到让人崩溃,好不容易分出来的冲击分量幅度还少了一大截。我之前在处理滚动轴承内圈故障信号时就被这个问题反复折腾,直到年初看到一种新思路——跳变模态分解(Jump Mode Decomposition,JMD),它不再默认模态是“窄带光滑”的信号,而是把“跳变”当作一种独立模态显式建模,再用一套优化算法把光滑成分和跳变成分分开求解。这篇文章就把我研究JMD的过程完整捋一遍:它解决什么问题、数学原理怎么拆、Matlab代码怎么组织,以及在合成信号和真实数据上的实测对比。同样被瞬态、冲击、阶跃信号困扰的读者,应该能从里面找到能直接用的思路。

1. 为什么需要JMD:连续平稳假设撑不住的信号

1.1 EMD和VMD处理跳变信号时的两个“翻车”现场

EMD的核心假设是信号能被拆成本征模态函数,每个IMF要求极值点数量与过零点数量相等或相差一个,局部包络关于时间轴对称。这个假设对缓慢调幅调频信号很合适,但遇到尖锐冲击就不行了——冲击信号在局部会产生大量极值点,EMD会把它判定为高频振荡,进而把一个物理上完整的冲击分量打散到好几个IMF里,还连带着把正弦成分的边缘也带歪。我用一组仿真信号实测过:一个9 Hz正弦叠加周期冲击,冲击间隔100 ms,EMD第一层IMF基本全是冲击和噪声的混合,正弦IMF在冲击出现处明显凹陷,这就是典型的模态混叠。

VMD这边同样不省心。VMD把每个模态约束为围绕某个中心频率的窄带信号,用带宽惩罚把模态“挤”出来。冲击信号在频域恰恰是宽带的,能量铺得特别开,VMD为了压低带宽代价,往往会把冲击能量按比例摊到相邻的窄带模态里。我试过给VMD设K=3去分同样的冲击加双正弦信号,分出来的冲击分量虽然有一个模态,但幅值被削掉接近30%,模态边缘还出现振铃。更麻烦的是,VMD的结果对模态数K和惩罚系数alpha极其敏感,调参的时间比分析信号的时间还长。

这两个“翻车”现场指向同一个根源:传统方法本质上都假设要提取的模态是连续、平滑、可频带分离的。跳变分量天然违反这个假设,它在频域铺展极宽,和噪声频带严重重叠,用“带通”的思路去抓它,等于让渔夫用一张网眼固定的网去捞一个忽大忽小的鱼群——捞上来的永远是不完整的那部分。

1.2 跳变模态在现实世界中长什么样

“跳变模态”这个词听起来学术,我给一个不太严格但好用的定义:在大多数时间点上取值平缓,只有少量时间点发生快速幅度变化的分量。举个例子,滚动轴承出现局部剥落时,振动信号里会周期性出现冲击脉冲,每次冲击就是一个跳变;电力系统发生短路或雷击时,电压波形瞬间跌落再恢复,形成阶跃式暂态;心电信号里的QRS波群、肌电爆发,本质上也是一连串快速跳变叠加在缓慢基线上;结构健康监测里螺栓松动瞬间的应变突变同样属于这一类。

这些分量有个共同特点:时间上非常“稀疏”——大部分采样点不活跃,只有少数点爆发。但它们的信息量很关键,故障特征频率、暂态起止时刻、冲击强度全藏在里面。这种“稀疏但重要的异类”结构,恰好是L1稀疏正则最擅长捕捉的对象,也是JMD和传统方法产生本质差异的地方。

1.3 JMD的出发点:别再假设模态是光滑的了

JMD的设计思路是换个角度处理问题:不再把“跳变”当作需要被抑制的异常,而是把它显式写进信号模型。观测信号被写成“若干光滑模态之和 + 跳变模态 + 噪声”三项,光滑模态用二阶差分度量粗糙度,跳变模态用L1范数度量稀疏性。这样一个分解问题就落到了标准的凸优化框架里,比EMD的非线性迭代和VMD的启发式带宽剥离有更清晰的数学性质。你甚至可以认为,JMD是给信号分解里新增了一个“职位”——过去这个方法那个方法都在抢着干“抓平滑分量”的活儿,现在终于有人专门负责“抓突变分量”了。

2. JMD核心原理:把跳变写进数学模型

2.1 信号模型:三项分解的数学写法

JMD要解的假设其实很朴素:观测到的离散信号 x[n](n = 1, 2, …, N)可以分解成

x = f₁ + f₂ + … + f_K + j + e

其中f_k是光滑模态,每个都可以理解为在时域上变化缓慢的振荡,允许存在缓慢的幅值调制和频率调制,但不允许突然剧烈转折;j是跳变模态;e是噪声。注意这里的K只算光滑模态的个数,跳变模态是独立的一项,不占K的名额。这一点跟VMD的K含义不同——VMD的K是总模态数,JMD的K只管光滑部分。工程上你只需要估计“背景有几个主频成分”,冲击和阶跃交给j去处理,不需要为冲击预设一个频带。

为了把这个模型变成可计算的优化问题,必须把“光滑”和“跳变”都翻译成数学惩罚项,也就是目标函数里要同时有“让光滑分量更光滑”的推力和“让跳变分量更稀疏”的拉力。

2.2 目标函数:保真、光滑、稀疏三股力量

JMD的优化目标可以写成三项的叠加。第一项是保真项,就是“x减去所有光滑模态再减去跳变模态”的L2范数平方,强迫所有分解分量叠加回去之后接近原始信号。第二项是光滑性惩罚,写作α/2乘以每个光滑模态二阶差分L2范数的平方和。这里的二阶差分算子D₂作用在信号上,近似度量“相邻点的变化率的变化率”,也就是局部曲率;惩罚它,等价于要求光滑模态尽量“顺滑”,防止把噪声和冲击的陡峭折线包揽进去。第三项是跳变模态的稀疏约束,写作λ乘以跳变模态的L1范数,即所有采样点绝对值之和。

这里有个很重要的细节值得展开:为什么光滑性惩罚用二阶差分而不是一阶差分?一阶差分度量的是信号总变差,如果用它约束光滑模态,会强迫模态变成常数或分段常数——一个缓慢调幅的正弦波会被压成“方波包络”,信息损失非常大。二阶差分只惩罚“拐弯有多猛”,允许模态有整体斜坡趋势,这对带基线漂移的信号很友好。我一开始用一阶差分做测试,分解出来的调幅正弦模态上带明显的台阶,换成二阶差分很快就正常了。做实现时如果结果奇怪,先检查这一条。

2.3 ADMM求解:把联合优化拆成三个熟脸

目标函数里光滑模态和跳变模态耦合在保真项中,直接一起求最优很麻烦。常规做法是用ADMM(交替方向乘子法)拆开求解。思路很好理解:给跳变模态引入一个辅助变量v,约束j = v,然后用增广拉格朗日乘子处理这个约束,原问题就被拆成三个子问题,每个子问题都有闭式解。

第一个子问题是更新光滑模态f_k。对每个f_k而言,它要解决的是“在二阶差分的正则约束下,解释去掉其他模态和跳变后的残差”,本质是一个Tikhonov正则化最小二乘问题。第二个子问题是更新跳变分量j,在残差和辅助变量v之间做一个加权平均。第三个子问题是更新辅助变量v,这一步就是软阈值操作,也叫shrinkage。软阈值的公式很简洁:v = sign(u) · max(|u| − λ/ρ, 0),它会把绝对值小于阈值的点直接清零,把大于阈值的点按阈值收缩,真正把“稀疏”落实到位。

每次迭代还要更新对偶变量,作用相当于在“j和v必须一致”这条约束上持续累积误差,逼着两者最终收敛到同一个点。整个过程可以打个比方:两个人合作拼一幅图,一个铺大面积背景(光滑模态),一个贴零星装饰(跳变模态),拼着拼着发现背景多贴了一块、装饰少贴了一块,两人互相核对账目不断修正,直到整张图严丝合缝。

2.4 收敛性与复杂度:这个算法适合多大的信号

JMD的目标函数是凸的,ADMM两个子问题每步都取精确解,理论上能保证线性收敛到全局最优。实际运行中我观察到的规律是:前30到50次迭代残差下降很快,之后逐渐平缓;一般设100到200次迭代足够,不用跑满最大次数。单次迭代复杂度是O(KN log N),K是光滑模态数,N是信号长度,大头在FFT。以我常用的10240点信号、K=3为例,普通笔记本上跑150次迭代大概不到半秒,做批量离线分析完全够用。如果信号长度到十万点量级,建议先分段分解或者降采样,不然等待时间会明显拉长。

现实工程里没人会傻等算法自动收敛,代码里用“相对残差”作为停机准则:当两次迭代间j的变化量除以当前j的范数小于某个阈值(如1e-3),就可以停了。后面给的Matlab代码就是这么写的。

3. Matlab实现与关键参数解读

3.1 一个可以直接跑通的主函数

下面是我整理的JMD核心实现。为了照顾可读性,我把代码收敛成一个主函数,没有拆成一堆子文件,拿过去粘贴就能跑。代码本身基于我个人对算法的理解重写,逻辑上和标准ADMM框架保持一致。

function [modes, jump, info] = JMD(x, K, alpha, lambda, rho, tol, maxit) % JMD: Jump Mode Decomposition % 输入: % x - 1xN 观测信号 (行向量或列向量均可,内部统一为列向量) % K - 光滑模态个数 % alpha - 光滑性正则强度(二阶差分惩罚) % lambda - 跳变分量稀疏性正则强度 % rho - ADMM 惩罚参数 % tol - 相对收敛阈值 % maxit - 最大迭代次数 % 输出: % modes - KxN 矩阵,每一行是一个光滑模态 % jump - 1xN 跳变模态 % info - 结构体,记录迭代次数和残差轨迹 x = x(:); % 统一为列向量 N = length(x); if nargin < 6, tol = 1e-3; end if nargin < 7, maxit = 200; end % 二阶差分算子的频域响应:D2 对应 2 - 2*cos(w) w = (0:N-1)' * 2 * pi / N; D2freq = 2 - 2*cos(w); H = 1 ./ (1 + alpha * D2freq.^2); % 光滑模态维纳滤波核 % 初始化 modes = repmat(x'/K, K, 1); % 初始把信号均分给每个光滑模态 jump = zeros(N,1); v = zeros(N,1); % 跳变分量的辅助变量 theta = zeros(N,1); % 对偶变量 resHistory = zeros(maxit,1); for iter = 1:maxit % --- 1. 更新光滑模态 --- residual = x - jump - sum(modes,1)'; % 当前残差(扣除跳变) for k = 1:K other = sum(modes,1)' - modes(k,:)'; rk = x - jump - other; % 去掉第k个模态后应由该模态解释的部分 modes(k,:) = real(ifft(fft(rk) .* H))'; end % --- 2. 更新跳变分量 j --- s = x - sum(modes,1)'; j = (s + rho * v - theta) / (1 + rho); % --- 3. 更新辅助变量 v(软阈值) --- u = j + theta / rho; v = sign(u) .* max(abs(u) - lambda / rho, 0); % --- 4. 更新对偶变量 theta --- theta = theta + rho * (j - v); % --- 5. 收敛检查 --- res = norm(j - v, 2); resHistory(iter) = res; if res / norm(x, 2) < tol info.iter = iter; break; end end jump = j'; info.resHistory = resHistory(1:iter); info.alpha = alpha; info.lambda = lambda; info.rho = rho; end

这段代码的核心逻辑很紧凑。建议你保存为JMD.m,然后在命令行里用类似下面的方式调用:

fs = 1000; t = (0:4095)' / fs; x = sin(2*pi*5*t) + 0.8*sin(2*pi*20*t); impulse = zeros(4096,1); impulse(200:200:4000) = 2; x = x + impulse + 0.05*randn(4096,1); [modes, jump, info] = JMD(x, 2, 10, 0.05*std(x), 1, 1e-3, 200); subplot(3,1,1); plot(t, x); title('原始信号'); subplot(3,1,2); plot(t, modes'); title('光滑模态'); subplot(3,1,3); plot(t, jump); title('跳变模态');

跑通之后再去看数据,比对着屏幕看公式理解得快很多。

3.2 光滑模态更新的频域加速原理

代码里最核心的加速点在光滑模态更新那几行。更新第k个光滑模态时,原始问题要解一个线性系统 (I + α·D₂ᵀD₂) f_k = r_k。如果对N×N矩阵直接求逆,N=10240时基本没法用。巧的是D₂ᵀD₂是一个循环带状矩阵,在周期边界假设下可以被FFT对角化。二阶差分算子D₂在频域对应因子 2 − 2cos(ω),D₂ᵀD₂就对应它的平方,于是整个线性系统变成逐点相除:F_k(ω) = R_k(ω) / [1 + α·(2 − 2cos ω)²]。这就是代码里H那行的来历。

理解这一点很重要。很多刚接触这类算法的人会把H当成某种滤波器系数,其实它是“光滑模态在频域的维纳滤波核”。α越大,H在高频处衰减越厉害,光滑模态越平缓;α越小,光滑模态越贴近原始残差。这个频域视角也解释了为什么JMD对α的敏感度没有VMD那么神经质——它把带宽约束改成了软性的曲率惩罚,物理意义更直观。

3.3 软阈值那行的lambda/rho是怎么回事

很多第一次看ADMM代码的人会卡在lambda/rho这个除法上:我明明设置的lambda是稀疏强度,为什么实际阈值要除以rho?这要从增广拉格朗日说起。约束j=v的惩罚强度是rho,辅助变量v上的L1正则原本是lambda,经过ADMM的变量拆分后,作用在v上的等价阈值就变成了lambda/rho。换句话说,lambda和rho不是两个完全独立的参数,真正决定“跳变判断门槛”的是它们的比值。

这也带来一个调参技巧:如果你把lambda增大的同时把rho也等比例增大,最终提取出的跳变分量形态可能几乎不变。所以我通常把rho固定为1,只用lambda控制稀疏度,思路最简单,也最容易解释给别人听。只有遇到收敛震荡时才去动rho。

3.4 各参数的经验取值与调参顺序

参数设置是JMD使用中最容易劝退人的地方,这里给一个我从大量测试里整理出的经验区间:

参数含义经验范围我的初始值
K光滑模态个数2~6看频谱峰个数
alpha光滑性正则1~10010
lambda跳变稀疏强度0.01std(x) ~ 0.2std(x)0.05*std(x)
rhoADMM惩罚参数0.1~101
tol收敛阈值1e-4 ~ 1e-21e-3

调参顺序我建议固定一个套路:先定K,用原始信号频谱数出明显峰包的个数;再固定rho=1,alpha从10起步;最后扫lambda,从大到小观察跳变分量从无到有的过程,选择那个跳变形态刚刚稳定下来的值。不要一开始就四个参数一起动,否则出了问题根本分不清是谁的锅。这里要特别说明一下,这些区间是我在振动信号、电力暂态信号和部分生理信号上得到的经验值,不同信号类型可以适当外扩,但调参路径本身是通用的。

4. 性能测评:和传统方法比到底好在哪

4.1 合成信号的构造

为了公平对比,我构造了一组带精确真值的模拟信号。光滑模态1是5 Hz正弦波,恒定幅值1;光滑模态2是20 Hz正弦波,幅值从1缓慢提升到1.8,模拟调幅效应;跳变模态每200个采样点出现一次单位冲击,冲击宽度3个点,幅度2;最后叠加高斯白噪声。采样率1000 Hz,总长度4096点。信噪比按0 dB、10 dB、20 dB三档添加,另有一组完全无噪的数据作为基准。

这样设计的好处是每个分量都有理论真值,分解完之后可以直接算误差。所有测试信号都严格符合JMD的模型假设,所以这一轮测评的是“JMD在理想条件下能否达到设计目标”,后面真实数据再检查鲁棒性。

4.2 分解质量怎么评价

评价指标我用了四个,比单独看一个相关系数全面得多。第一是每个光滑模态与真实分量之间的相关系数,衡量波形保真度。第二是跳变分量恢复结果的均方根误差,衡量幅度保持能力——传统方法最吃亏的地方就是冲击幅值被削掉,只看相关系数发现不了这种问题。第三是分解模态叠加后与原始信号的相对能量误差,衡量整体重建精度。第四是计算耗时,用tic/toc统计。

在实际操作中,我习惯先看第二项。如果跳变分量的峰值误差超过10%,说明这个算法在“保住突变信息”这件事上是失败的,相关系数再高也没用。

4.3 三档信噪比下JMD的表现

无噪声情况下,JMD分解得非常干净:两个光滑模态的相关系数都在0.98以上,跳变分量和真实冲击几乎完全重合,重建误差低于1%。加入20 dB噪声,结果依然稳定;打到10 dB,光滑模态相关系数降到0.94左右,跳边分量边缘出现小的毛刺,但峰值幅度只损失约5%。到0 dB噪声时情况开始恶化——噪声能量和冲击能量同一量级,跳变分量里混入不少噪声尖峰,光滑模态相关系数掉到0.85以下。具体数据如下:

信噪比模态1相关系数模态2相关系数跳变峰值误差重建误差
无噪0.9850.978<1%0.4%
20 dB0.9710.9622.1%1.2%
10 dB0.9420.9315.3%2.8%
0 dB0.8310.81218.7%6.5%

这个结果说明,JMD在中等以上信噪比下非常可靠,但不要指望它在强噪声背景下还能直接输出干净的跳变信号,需要配合预处理。我自己在低信噪比场景下的具体做法,会在第5章详细说。

4.4 三方对比:JMD vs EMD vs VMD

我用同样的20 dB信号去跑EMD和VMD,结果对比如下:

方法模态1相关系数模态2相关系数跳变峰值误差耗时
JMD0.9710.9622.1%0.11 s
EMD0.8850.86127.4%0.45 s
VMD (K=3)0.9070.88223.6%0.08 s

EMD的问题和第1章描述一致:冲击被拆散到多个IMF里,两个正弦模态在冲击处凹陷,相关系数直线下降。VMD速度最快,但即便提前告诉它K=3(包含一个冲击模态),跳变峰值的恢复误差仍超过23%,说明它本质上就不适合提取宽带跳变分量。注意这是理想情况,实际使用VMD时K往往还要试很久,误差可能更大。JMD在每个指标上都领先,尤其跳变峰值的恢复优势非常明显,这正是我推荐它在瞬态信号场景下使用的原因。

4.5 真实数据验证:滚动轴承和电网暂态信号

合成信号跑完还得看真实数据。我拿了公开的滚动轴承内圈故障振动数据做测试,采样率12 kHz,故障特征频率约160 Hz。原始信号里冲击周期约0.006 s,幅值被噪声淹没得比较深。用JMD分解后,跳变模态里的冲击间隔非常规整,间隔换算成频率正好落在160 Hz附近,和理论故障特征频率一致;再做包络谱,故障频率及其二倍频都清晰可见。同一段数据用VMD处理,包络谱里混入两个干扰峰,特征不如JMD明显。

另外测了一段电网电压暂态信号,电压在0.15 s处发生短暂跌落。JMD的跳变模态在跌落和恢复两个时刻形成了两个明显的阶跃标记,起点定位很准确,这对故障时刻捕获非常有用。真实数据的结果不如合成信号那么干净,但优势方向是稳定的:跳变分量的时间位置和幅度保真度都比传统方法好一截。

5. 使用JMD容易踩的坑和适用边界

5.1 迭代不收敛?先检查rho和lambda/rho的关系

最常遇到的异常现象是残差曲线来回震荡,跑满maxit也不收敛,j和v始终对不上。绝大多数原因出在rho设置得不合适。rho太大时,约束项权重过高,j和v的变化被压得太过缓慢;rho太小时,对偶变量的更新像“打太极”,整体收敛非常慢。我的经验是rho先固定为1,如果震荡,把rho调大到5左右;如果收敛太慢,把rho调到0.2附近。但记住,rho一变,lambda/rho这个有效阈值也跟着变,lambda需要同步调整,否则跳变分量的稀疏程度会意外改变,表现得很像“跳变分量凭空变多了”。

5.2 信噪比低于10 dB时:先预滤波还是直接用JMD?

很多人会在低信噪比场景下反复调大alpha,希望把噪声压进光滑模态,结果分解出来的信号“太丝滑”,真实冲击的峰也被压扁了。我的做法是分两步:第一步对原始信号做一次轻度的滑动平均或小波软阈值预滤波,只抑制高频纯噪声,不要动低频结构和冲击;第二步再用JMD。这样拿到的跳变分量波形比直接用JMD干净很多。预滤波的窗口或阈值参数也不要太激进,目标是让信噪比恢复到10 dB以上,而不是把信号完全磨平。

5.3 模态数K的稳定化试探:别让跳变分量背黑锅

K的取值很难一次准。实际操作中判断K设得对不对,有个很有效的办法:固定其他参数,让K分别等于2、3、4,连续跑三次,重点看跳变分量j的形状是否基本稳定。如果j在这几个K下形态一致,只是幅度有微小变化,说明K取值不影响核心结果,可以放心用。如果j随着K变化剧烈,比如多一个K就多出一串冲击、或某个冲击消失,说明当前K把光滑模态和跳变模态的边界搞乱了,需要重新调整。

我自己的另一个经验是,K设得过大比设得过小更麻烦。K过小时,残余能量会被挤进跳变分量,j里会多出一些“凑数”的振荡,但整体形态还能辨认;K过大时,算法会造出虚的光滑模态,把真实冲击拆成若干振荡,再看j就完全失真了。遇到这种情况,宁可先把K估小,再根据j里的奇怪成分决定要不要加K。

5.4 什么情况别用JMD

JMD不是银弹。如果信号本身平稳窄带,没有明显跳变,用VMD甚至带通滤波更快更省心,没必要为了一个方法引入两个正则参数。如果信号是连续调频的线性调频信号且没有瞬态成分,JMD的优势也发挥不出来——那种场景下EMD或同步挤压变换反而更直观。实时性要求很高的嵌入式场景也要谨慎,JMD每次迭代都做FFT和全量更新,在MCU级别硬件上跑起来比较吃力,不如固定滤波器或查表法省事。

还有一个很容易被忽略的问题:JMD输出对参数有依赖,任何一次正式分析都要把K、alpha、lambda、rho完整记录下来。我前几次用JMD时吃过不记录参数的亏,隔几天换台机器重跑,结果对不上,浪费半天。现在凡是正式分析,第一件事就是在保存结果的同一个脚本里把所有参数写进文件名。

注意:JMD对参数是敏感的,开始批量测试之前,先固定一组参数跑通一条完整链路,再逐步探索这一组参数的影响,这样你的每一次调试才是有意义的。

老实说,比起EMD那种基本不需要设参数的老方法,JMD这类带正则化项的方法对使用者的要求高了一截,但换来的就是在跳变信号上的显著优势。值不值得,自己拿一组带冲击的数据跑个对比,很快就有答案。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/10 17:09:48

从HDFS到YARN:Hadoop核心原理与实战经验全解析

1. 十年过去&#xff0c;为什么我们还在反复讨论Hadoop先说实话&#xff0c;我第一次接触Hadoop是在一个数据量只有几百GB的项目里&#xff0c;当时完全是被"大数据"三个字唬住了。后来真正把集群搭起来跑任务&#xff0c;才明白这套生态能活十几年&#xff0c;靠的不…

作者头像 李华
网站建设 2026/10/10 17:07:43

PHP重载基础知识回顾

前言 先把题目前提说清楚&#xff1a;PHP 不支持 Java、C 那种「按参数签名区分同名方法」的编译期重载。你不可能在同一个类里写两个都叫 add() 的方法&#xff0c;一个收两个参数、一个收三个参数——PHP 会在编译阶段直接报致命错误。 那为什么 PHP 官方手册里有一整章叫「O…

作者头像 李华
网站建设 2026/10/10 17:04:34

InnoDB事务进阶:从MVCC、锁到redo/undo log的实战内功

先说个我碰到的真实经历。半夜被报警叫起来&#xff0c;说某条 update 卡了快十分钟没执行完&#xff0c;开发群里已经炸了。上去看的时候&#xff0c;锁等待提示显示的是另一笔已经跑了二十多分钟的长事务占着行锁不放。当时第一反应是“杀事务”&#xff0c;但真正让我后背发…

作者头像 李华
网站建设 2026/10/10 17:01:38

Rufus制作U盘启动盘完整教程:从配置到绕过TPM检测

1. 为什么还要折腾U盘启动盘很多人觉得现在装系统已经不需要U盘了&#xff0c;直接在线升级或者用恢复分区就能搞定。但实际干过运维或者经常帮人处理电脑问题的人都知道&#xff0c;U盘启动盘依然是绕不开的刚需。系统崩溃进不去桌面、新买的硬盘是空的、需要给多台机器批量部…

作者头像 李华
网站建设 2026/10/10 16:49:24

8款降AI率工具实测与完整改写链路,论文检测从99%降到5%

去年有段时间我的论文审稿卡在了降AI率这一步&#xff0c;某主流检测系统反复给出90%以上结果&#xff0c;试过很多改法都没用。后来陆续花了半个多月&#xff0c;把市面上口碑比较热的工具挨个试了一遍&#xff0c;前前后后测了几十篇文本片段&#xff0c;最后总算摸清了每种工…

作者头像 李华