SSA-FMD参数优化:麻雀搜索算法与特征模态分解的故障诊断实践
简介面向机械故障诊断与信号处理研究者这份资源提供了麻雀搜索算法SSA优化特征模态分解FMD的完整MATLAB实现针对传统分解方法模态混叠、端点效应及参数难调等痛点可直接用于振动信号的自适应分解与故障特征提取适用于研究生、科研人员及工程技术人员。包内共8个文件以6个.m脚本为主覆盖初始化、目标函数计算、SSA主程序、FMD分解与绘图模块另含2个Excel测试数据便于运行验证资源整体约61KB轻量易用无需额外配置适合MATLAB R2020b及以上环境。目前已有74人下载学习。读者可基于此快速复现SSA-FMD流程替换自己的单列信号数据并支持包络熵、排列熵、样本熵等多种适应度函数以及迭代曲线、幅值谱、功率谱、Hilbert谱等可视化输出深入理解参数优化与分解结果分析的关键环节。1. SSA-FMD优化特征模态分解为什么参数K和L是故障诊断里最磨人的坎把SSA-FMD这串名字拆开看就是麻雀搜索算法SSA去优化特征模态分解FMD的两个关键参数再用优化后的参数去分解振动信号把滚动轴承、齿轮箱里那点被噪声淹没的故障特征频率捞出来。FMD本身是个好方法它比EMD、VMD更能扛强噪声和变转速但它的模态数K和滤波器长度L太敏感了手调的时候就像对着黑匣子猜同一个信号不同人试出来的结果能差出一整条包络谱。我身边有做设备健康监测的同事为了调这两个参数半天时间全耗在试数上最后忍不住把优化算法搬进来让程序自己找最优组合。这套思路的落地路径很清晰SSA负责全局寻优FMD负责信号分解目标函数用包络熵或者包络谐噪比来衡量分解效果全程Matlab实现有完整代码就能复现。适合正在做故障诊断、毕业设计或者想把振动信号处理方案落地到实际项目里的开发者。2. FMD特征模态分解的核心逻辑滤波器组迭代、EHNR筛选与3个关键参数2.1 FMD和VMD/EMD的本质差异不是把信号拆开是用滤波器把最优模态筛出来特征模态分解Feature Mode Decomposition的核心思路和EMD、VMD完全不同。EMD靠极值包络插值递归筛出本征模态函数VMD靠变分约束把信号一次分解成K个窄带分量它们都是“把信号拆开”。FMD不是拆而是“筛”。FMD的做法是先构造一个滤波器组对信号进行滤波滤波后的结果被看作候选模态然后计算每个候选模态的包络谐噪比Envelope Harmonic-to-Noise Ratio简称EHNR这个指标越高说明该模态里的周期性冲击成分越突出越像真正的故障特征模态。接着用EHNR的梯度信息去更新滤波器系数反复迭代让滤波器不断逼近那个能筛出最优模态的状态。迭代收敛之后最好的那个模态就被筛出来了。所以FMD的输出往往不是一组模态而是“最优的那个模态及其残余信号”。K代表你要同时维护多少个候选滤波器L代表滤波器长度。这个是理解后面所有参数设置的基石弄反了就会把FMD当成VMD用分解结果自然不对。2.2 K、L、N三个参数哪一个拍脑袋定错了都会让你白跑一天FMD对参数敏感尤其是下面三个。我平时调试时的经验区间如下参数含义经验范围影响K滤波器组中并行维护的候选模态数212K太小搜索不到特征模态K太大相邻模态频带重叠LFIR滤波器长度1001000与信号长度相关L越长频率分辨率越高但计算量和内存占用快速上升N滤波器迭代次数520太小不收敛太大浪费时间且可能过拟合噪声K的取值直接影响模态混叠K设成3和设成8分解出的最优模态可能落在完全不同的频带上。L更让人头疼它决定了滤波器组的频率分辨率L太小两个相邻频率成分分不开L太大自相关矩阵规模膨胀Matlab里直接内存溢出。N是内部迭代次数一般取10左右就够现场数据噪声大时可以加到15。这些参数之间还存在耦合K增大时L最好也适当增大否则滤波器组覆盖不均匀。手动调参时最难的就是这种耦合关系你改了K又得回去调L来回折腾。这也是后来我坚持用智能优化算法的直接原因。2.3 适应度函数为什么选包络熵而不是谱相关峭度用SSA优化FMD第一步是定义一个“评分数值”让优化算法知道什么样的参数组合是好的。这个数值就是适应度函数。FMD的参数优化里最常见的适应度是包络熵和EHNR的倒数。包络熵的计算方式是对分解出的模态做Hilbert变换取包络再把包络归一化看成概率分布计算其信息熵。理想情况下故障冲击信号在时域上表现为稀疏的周期尖峰包络会集中在少数时刻熵值就低。噪声大时包络变得平坦熵值升高。所以目标就是最小化包络熵。为什么不直接最大化EHNR呢EHNR在强噪声环境下的计算容易受倍频干扰一个模态可能在特征频率处有峰值但谐波杂乱算出来的EHNR反而虚高。包络熵更稳定对噪声的容忍度也更好。如果信号里存在明显的多故障耦合我会在包络熵基础上加一个峭度惩罚项但这个操作会让优化时间翻倍单故障场景用纯包络熵就够了。3. 麻雀搜索算法SSA寻优机制为什么它比网格搜索和粒子群更适合FMD选参3.1 发现者、加入者、侦察者SSA是怎么在搜索空间里找最优[K, L]的麻雀搜索算法是一种群体智能优化算法模拟麻雀觅食时的分工协作行为。种群里的每只麻雀代表一组候选解也就是一组[K, L]。麻雀分为三个角色发现者负责大范围探索适应度高的个体优先当发现者加入者跟在发现者附近觅食同时有几率争夺最优位置侦察者占种群的一小部分它们察觉危险时会引导整个群体跳跃到新的搜索区域。每一代迭代分三步走。第一步发现者位置更新如果预警值R2小于安全阈值ST说明当前区域安全发现者会向最优位置靠近并缩小搜索半径如果R2大于ST说明存在危险所有发现者会飞离当前位置到大范围随机搜索。第二步加入者更新适应度排名靠后的个体离开最优区域向外围搜索排名靠前的个体则向最优发现者靠拢。第三步侦察者更新随机选取约20%的个体做侦察如果它当前的位置不够好就向全局最优跳跃否则在自身附近随机游走。这套机制对FMD参数优化很合适。发现者保证了搜索的收敛速度侦察者保证了跳出局部最优的能力。相比之下粒子群算法PSO依赖个体极值和全局极值引导惯性权重调不好就容易早熟收敛网格搜索则在[K, L]二维空间里暴力遍历FMD每次分解都要迭代N轮完全跑不动。SSA需要设置的参数只有种群规模、发现者比例、预警阈值和最大迭代次数通用性很强。3.2 把[K, L]编码成麻雀位置把包络熵变成适应度完整寻优路径用SSA优化FMD参数的步骤可以拆成六步。第一步确定搜索空间根据信号长度和采样频率设定K的搜索区间比如[2, 12]设定L的搜索区间比如[100, 800]。K取整数L取整数这两个维度在位置更新时需要取整。第二步初始化种群在搜索空间内随机生成popSize个二维坐标每个坐标就是一只麻雀对应一组[K, L]。第三步计算适应度对每一只麻雀调用FMD函数分解原始振动信号得到最优模态后计算包络熵包络熵作为该麻雀的适应度值。第四步角色分配与位置更新按适应度排序前70%的麻雀作为发现者后30%作为加入者再随机抽取20%作为侦察者按照3.1中的规则更新位置。更新后检查是否越界越界的参数拉回边界。第五步重新计算适应度记录全局最优位置和最优适应度。第六步循环迭代直到达到最大迭代次数输出全局最优的K和L再用这组参数做一次最终的FMD分解得到故障特征模态。这个流程中FMD分解被反复调用有多少只麻雀就要跑多少次FMD。假设种群规模20、迭代10次总共要跑200次FMD分解每次FMD内部还要迭代10轮。如果信号很长总耗时可能从几分钟到十几分钟不等。所以实际落地时种群规模和迭代次数需要权衡而不是一味加大。4. Matlab实现SSA-FMD主循环、目标函数与FMD核心代码拆解4.1 主函数框架SSA初始化、位置更新与边界处理下面给出一个可运行的SSA-FMD主框架。代码里FMD部分用一个简化函数fmd_decompose代替下一小节再展开它的核心逻辑。整体代码基于Matlab R2019a以上版本不需要额外工具箱。function [bestK, bestL, bestEntropy, convCurve] ssa_fmd_main(signal, fs) % SSA-FMD: 麻雀搜索算法优化特征模态分解参数 % 输入: % signal - 振动信号列向量 % fs - 采样频率(Hz)用于后续包络谱分析 % 输出: % bestK, bestL - 优化得到的最优模态数与滤波器长度 % bestEntropy - 最优包络熵 % convCurve - 收敛曲线 % 固定随机种子保证结果可复现 rng(42); % ---------- SSA参数设置 ---------- popSize 20; % 麻雀种群规模 maxIter 15; % 最大迭代次数 dim 2; % 优化维度: K 和 L PD 0.7; % 发现者比例 ST 0.8; % 预警阈值 N_fmd 10; % FMD内部迭代次数 Kmin 2; Kmax 12; % K搜索区间 Lmin 100; Lmax 800; % L搜索区间 lb [Kmin, Lmin]; ub [Kmax, Lmax]; % ---------- 初始化麻雀种群 ---------- X zeros(popSize, dim); for i 1:popSize X(i,1) round(lb(1) (ub(1)-lb(1)) * rand); % K取整 X(i,2) round(lb(2) (ub(2)-lb(2)) * rand); % L取整 end % 计算初始适应度 fitness zeros(popSize, 1); for i 1:popSize fitness(i) fmd_objective(signal, X(i,1), X(i,2), N_fmd); end [bestEntropy, bestIdx] min(fitness); bestK X(bestIdx, 1); bestL X(bestIdx, 2); convCurve zeros(maxIter, 1); % ---------- 主迭代 ---------- for t 1:maxIter [~, sortIdx] sort(fitness); bestF fitness(sortIdx(1)); worstF fitness(sortIdx(end)); % 1) 发现者更新 R2 rand; nDiscover ceil(popSize * PD); for i 1:nDiscover if R2 ST % 安全: 向全局最优收缩 X_new X(i,:) .* exp(-i / (rand * maxIter)); else % 危险: 随机大范围逃离 X_new X(i,:) randn(1, dim) .* (ub - lb) * 0.1; end X(i,:) boundary_check(X_new, lb, ub); end % 2) 加入者更新 for i (nDiscover 1):popSize if i popSize / 2 % 位置差的加入者去外围搜索 X_new randn(1, dim) .* exp((X(i,:) - X(sortIdx(end),:)) / i^2); else % 位置好的加入者向最优个体靠拢 X_new X(sortIdx(1),:) abs(X(i,:) - X(sortIdx(1),:)) .* randn(1, dim); end X(i,:) boundary_check(X_new, lb, ub); end % 3) 侦察者更新 for i 1:popSize if rand 0.2 if fitness(i) bestF % 离最优解远: 向全局最优靠近 X_new X(sortIdx(1),:) randn(1, dim) .* abs(X(i,:) - X(sortIdx(1),:)); else % 离最优解近: 在自身附近随机游走 X_new X(i,:) 2 * randn(1, dim) .* abs(X(i,:) - X(sortIdx(end),:)); end X(i,:) boundary_check(X_new, lb, ub); end end % 重新计算适应度 for i 1:popSize fitness(i) fmd_objective(signal, X(i,1), X(i,2), N_fmd); end % 更新全局最优 [curBest, curIdx] min(fitness); if curBest bestEntropy bestEntropy curBest; bestK X(curIdx, 1); bestL X(curIdx, 2); end convCurve(t) bestEntropy; end end function X boundary_check(X_new, lb, ub) % 边界处理: 越界后拉回边界并保证K为整数 X X_new; X(1) max(min(round(X_new(1)), ub(1)), lb(1)); X(2) max(min(round(X_new(2)), ub(2)), lb(2)); end这段代码的逻辑要点有三处。第一种群位置X的每一行都是一个候选参数组合第一列是模态数K第二列是滤波器长度L所有位置更新后都通过boundary_check取整和限幅避免出现K3.7这种非法值。第二发现者更新使用了指数衰减项让算法前期大步搜索、后期小步逼近。如果迭代后期发现适应度曲线还在明显下降可以把maxIter调大到25但不要超过30不然FMD调用次数增长太快。第三侦察者比例用的是固定值0.2也就是每个个体有20%的随机概率扮演侦察者这一项是跳出局部最优的关键不建议去掉。4.2 FMD核心函数与包络熵目标函数SSA主循环里反复调用的fmd_objective需要自己实现。它做的事是调用FMD分解出最优模态再计算包络熵返回给SSA作为适应度。代码结构如下。function fitness fmd_objective(signal, K, L, N) % 以最小包络熵为目标函数的FMD参数评价函数 % 输入: signal-原始信号, K-模态数, L-滤波器长度, N-迭代次数 % 输出: fitness-包络熵值 % 调用FMD分解返回最优模态分量 mode fmd_decompose(signal, K, L, N); % Hilbert变换获取包络 env abs(hilbert(mode)); % 计算包络熵: 包络归一化后求信息熵 p env / sum(env); fitness -sum(p .* log(p eps)); end这里的fmd_decompose是FMD的核心完整的FMD实现会包含滤波器组初始化、迭代更新EHNR、收敛判据等环节代码量在几百行左右。如果在阅读时找不到完整的FMD源码也可以用下面的思路自写一个可用的精简版本用K个汉明窗带通滤波器初始化滤波器组对信号滤波得到K个候选模态对每个候选模态做Hilbert变换取包络计算包络谱的谐噪比选出EHNR最高的模态用它对应的频带位置更新滤波器中心频率重复N次后返回最优模态。这在教学数据和中等长度的仿真信号上效果足够好。当你拿到自己的数据后建议先跑通这个精简版再逐步替换为完整版能省下不少排查时间。4.3 一次完整运行从读取振动信号到输出包络谱有了主函数和目标函数运行脚本就很简单。下面这段脚本演示读入数据、调用SSA-FMD、绘制收敛曲线和包络谱的完整流程。% 运行脚本: run_ssa_fmd.m load(bearing_fault_signal.mat); % 假设数据文件包含signal和fs signal signal(:); % 确保列向量 % 调用SSA-FMD [bestK, bestL, bestEntropy, convCurve] ssa_fmd_main(signal, fs); % 用最优参数做最终分解 mode fmd_decompose(signal, bestK, bestL, 10); % 绘制收敛曲线 figure; plot(convCurve, LineWidth, 1.5); xlabel(迭代次数); ylabel(包络熵); title([SSA收敛曲线, 最优K num2str(bestK) , L num2str(bestL)]); grid on; % 包络谱分析 env abs(hilbert(mode)); f_axis (0:length(env)-1) / length(env) * fs; env_spec abs(fft(env)); figure; plot(f_axis(1:fs/2), env_spec(1:fs/2)); % 只看正半轴 xlabel(频率(Hz)); ylabel(幅值); title(最优模态的包络谱);这段脚本中load假设你手头有振动数据文件实际使用时替换成自己的数据路径即可。包络谱横轴的频率分辨率是fs / length(signal)信号越长越能分辨出低速轴承的微弱特征频率。如果信号长度只有几千点建议先把采样频率和信号长度打印出来确认一下否则包络谱上特征频率附近的谱线间隔太粗根本看不出边频带。5. SSA-FMD常见问题与排查收敛停滞、模态混叠、L过大翻车的4条记录5.1 现象适应度曲线前几代纹丝不动整体收敛极慢我刚开始跑这个程序时第一代到第五代的bestEntropy完全没变化曲线像一条平线当时还以为是程序死了。后来发现原因是FMD分解对参数变化不敏感K和L在小范围内变化时包络熵的梯度非常平缓SSA的发现者更新步长太小探索不动。解决思路是把发现者的更新公式改得更激进一些。把X_new X(i,:) .* exp(-i / (rand * maxIter))里的指数项分母调小比如改成exp(-i / (0.5 * maxIter))搜索步长会明显变大。另外初始化种群时用LHS拉丁超立方抽样替代纯随机抽样能让初始解更均匀地覆盖搜索空间。我做过的对比测试里光这一步就把收敛代数从15代压缩到了8代左右。5.2 现象最优K总是贴着搜索边界分解出的模态频带重叠有一种很常见的翻车情况优化结果K12或者K2刚好卡在你设定的边界上。这说明搜索区间设置不合理最优解在区间外面。K12时滤波器组划分出12个频带相邻模态在包络谱上共享谱线模态之间出现混叠而K2时又可能漏掉特征模态包络谱里找不到故障频率。排查方法是把优化后的K值打印出来看它是否落在区间内部。如果贴着上边界就扩大Kmax再跑一次如果贴着下边界说明信号里没有那么多周期性成分把Kmin放宽到1。另外L过大也会加剧模态混叠因为滤波器长度直接决定了频带边界的陡峭程度L取800时相邻滤波器过渡带重叠严重这时优先缩小Lmax。5.3 现象L设置过大导致Matlab内存溢出或者分解结果糊成一团FMD内部需要构造自相关矩阵并对滤波器系数求解L越大矩阵维度越高。我曾在某次处理10万点振动信号时把L设成2000Matlab直接报内存不足。即便内存够用L过大的结果也很差滤波器频响过于尖锐把单个故障频率的边频带切断包络谱上只剩一根孤零零的谱线。经验值是L取信号长度的二十分之一到五十分之一。比如5万点数据L在1000到2500之间比较稳妥但也要结合采样率看。采样率越高同样的物理频带需要的滤波器阶数越多L可以适当取大。排查时先看报错位置如果是矩阵求逆相关行崩溃优先降L而不是加内存。5.4 现象同一个信号跑两次得到的最优K和L不一样SSA算法本身带有随机性初始种群是随机生成的位置更新时R2是随机的侦察者也是随机抽取的。如果代码里没有固定随机种子每次运行的结果不同。优化算法的随机性是常态但工程落地时这是一个确定性隐患你没法跟团队解释为什么昨天的结果是K5、L300今天变成了K7、L420。解决方法是全局统一固定随机种子。在脚本开头加一行rng(42)这里的42只是一个示例值实际用任何固定整数都行。但要注意固定种子只是保证同一个机器同一份数据下一次运行结果一致换数据后种子不需要改因为优化结果由数据本身决定。如果固定种子后结果仍然跳动那就要检查代码里是否存在未受rng控制的并行计算流程。6. 从单次寻优到批量诊断SSA-FMD结果验证与参数固化技巧验证SSA-FMD优化效果的方法我总结为“一图一谱一波形”。图是收敛曲线看它是否单调下降且最终趋于平缓如果曲线末端还在明显下降说明迭代次数不够。谱是包络谱看特征频率处是否出现清晰的谱峰且谱峰幅值明显高于周围噪声底。波形是时域图看最优模态是否存在周期性冲击相邻冲击间隔换算成频率后应该与包络谱的特征频率互相印证。三个验证里至少两个通过这组参数才算可靠。批量做多组数据的故障诊断时不建议每次都从头跑SSA。我习惯先抽样3到5组典型数据各跑一轮SSA统计最优K和L的分布范围。比如这几组数据的最优K集中在4到6L集中在300到500那么后续批量处理时直接固定K和L只用FMD分解即可。只有遇到工况变化明显的数据才重新跑SSA。这里最容易被忽略的是采样频率变化换了一套采集设备采样率变了L的最优值也会跟着变之前统计的参数不能直接套用。另一个值得养成的小技巧是只保存最优参数而保存完整的寻优中间结果。SSA每代的种群位置和适应度可以存成.mat文件后续分析时能回放优化过程排查问题比看最终输出快得多。实战里我遇到过一次K和L都被优化到了合理区间、但包络谱波形仍然没有周期性冲击的情况回放后发现是原始数据本身就存在传感器松动引起的随机冲击跟轴承故障无关这个判断让整个项目避免了一次误诊。固定随机种子、保存中间结果、先抽样再固化参数这三个习惯能让你少踩很多坑。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

多模态手机认知筛查:把评估融入日常行为

多模态手机认知筛查:把评估融入日常行为

1. 项目概述:这不是一个APP,而是一套嵌入日常行为的认知健康监测逻辑 “MemoCare: An Interactive Multimodal Mobile System for Automated Cognitive Screening”——光看这个标题,很多人第一反应是:“又一个带AI的医疗APP&…

2026/10/11 23:56:57 阅读更多 →
OpenCV双目三维重建从标定到点云:SGBM匹配与三角测量实战指南

OpenCV双目三维重建从标定到点云:SGBM匹配与三角测量实战指南

简介:这是一套面向计算机视觉学习者和研究者的双目立体视觉工程代码,基于OpenCV与C实现,覆盖相机标定、立体匹配和跨平台三角测量,能够从双目图像计算视差、提取深度并生成三维点云;同时集成Harris角点、SIFT、模板匹配…

2026/10/11 23:56:57 阅读更多 →
如何让项目对AI编程助手友好:full-stack-ai-agent-template的CLAUDE.md与.claude工具集完全指南

如何让项目对AI编程助手友好:full-stack-ai-agent-template的CLAUDE.md与.claude工具集完全指南

如何让项目对AI编程助手友好:full-stack-ai-agent-template的CLAUDE.md与.claude工具集完全指南 【免费下载链接】full-stack-ai-agent-template Full-stack AI app generator — FastAPI Next.js with AI Agents, RAG, streaming, auth, and 20 integrations out …

2026/10/11 23:56:57 阅读更多 →

最新新闻

基于A星算法的无人机三维路径规划Matlab实现与优化

基于A星算法的无人机三维路径规划Matlab实现与优化

做无人机的人基本都绕不开路径规划这道坎。“基于A星算法的无人机三维路径规划算法研究(Matlab代码实现)” 这个题目看着规整,但真正落地的时候,坑比想象的多:地图怎么建、邻居节点怎么扩展、启发函数怎么写才能既快又…

2026/10/12 0:51:25 阅读更多 →
VS Code 中直接使用 Codex 教程及连接失败解决方案:TaoToken 统一 Key 接入与排错实录

VS Code 中直接使用 Codex 教程及连接失败解决方案:TaoToken 统一 Key 接入与排错实录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 0:50:24 阅读更多 →
企业 Agent 提示词注入防御实战:双重护栏与对抗语义检测

企业 Agent 提示词注入防御实战:双重护栏与对抗语义检测

在企业将多智能体(Multi-Agent)系统接入客服咨询、内部知识检索或自动化办公流后,安全攻防的对抗维度发生了一场根本性范式转移:传统的 SQL 注入或跨站脚本攻击(XSS)正在退居二线,而以自然语言为…

2026/10/12 0:47:23 阅读更多 →
Cursor怎么使用:3分钟上手Cursor键盘快捷键速查,用TaoToken统一Key接入GPT4与Claude 3.5辅助编程

Cursor怎么使用:3分钟上手Cursor键盘快捷键速查,用TaoToken统一Key接入GPT4与Claude 3.5辅助编程

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 0:46:23 阅读更多 →
我喜欢的 VSCode 插件:用 TaoToken 统一管理 AI 编码助手的 Key 与 Base URL

我喜欢的 VSCode 插件:用 TaoToken 统一管理 AI 编码助手的 Key 与 Base URL

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 0:46:23 阅读更多 →
基于SVDD算法的数据分类MATLAB仿真:原理、代码与避坑指南

基于SVDD算法的数据分类MATLAB仿真:原理、代码与避坑指南

简介:本资源为基于SVDD算法的数据分类MATLAB仿真程序包,面向机器学习初学者、模式识别课程学习者及需要复现单类分类实验的科研人员,帮助理解支持向量数据描述在异常检测与数据分类中的建模流程。包内共16个文件,以12个m脚本为核心…

2026/10/12 0:45:23 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →