EMD、EEMD与CEEMDAN:信号分解中的模态混叠与噪声辅助方法

简介:这份资源聚焦CEEMDAN算法,即完全自适应噪声集合经验模态分解,是EMD与EEMD的进一步改进方案,面向从事非线性、非平稳信号处理的研究生、工程师与科研人员,用于缓解模态混合、提升分解精度与稳定性。压缩包共5个文件,以4个m脚本和1个mat数据文件为主,脚本涵盖emd、eemd、ceemdan及示例程序,mat文件提供心电信号等实测数据,整体约32KB,轻量便于快速上手复现。目前已有5934人学习下载,热度较高。读者可借助脚本理解自适应噪声的添加、迭代分解与平均流程,结合示例数据观察各IMF分量与残差,掌握从EMD到EEMD再到CEEMDAN的演进思路,并迁移至地震波解析、心电脑电分析、金融时序与机械故障诊断等场景,为论文实验与工程应用提供可运行的参考实现。

1. 从模态混叠说起:为什么 EMD 之后还要有 EEMD 和 CEEMDAN

如果你用过 EMD(经验模态分解),大概率遇到过一种让人抓狂的现象:同一个信号,稍微改一点参数,或者加一点点噪声,分解出来的 IMF(本征模态函数)数量、频率分布就完全变了。更诡异的是,同一个频率成分会同时出现在两个 IMF 里,或者一个 IMF 里混着好几个尺度——这就是模态混叠。它不是实现 bug,而是 EMD 算法本身的数学缺陷:它靠信号极值点来构造包络,一旦极值点分布不均匀,包络就失真,筛分过程就会把不该混的成分搅在一起。EEMD 和 CEEMDAN 就是为解决这个问题而生的两代改进算法。搞懂它们,不只是多记两个缩写,而是理解「用噪声换稳定性」这条思路到底怎么落地、代价是什么、什么时候该用哪一代。

2. EMD 的机制缺陷:极值点驱动的筛分为什么不稳定

2.1 筛分过程的核心逻辑

EMD 的整个流程可以拆成三步循环:找极值点、构造上下包络、减去均值。具体来说,对信号 x(t),先找出所有局部极大值和极小值,分别用三次样条插值拟合出上包络 e_max(t) 和下包络 e_min(t),然后算均值 m(t) = (e_max + e_min) / 2,再用 x(t) - m(t) 得到一个新的序列。这个新序列如果还满足 IMF 的两个条件——极值点数量和过零点数量相差不超过一个、上下包络均值为零——就把它作为一个 IMF 输出;否则继续筛分。整个信号减去第一个 IMF 后,对残差重复上述过程,直到残差变成单调函数或小于某个阈值。

这个逻辑看起来自洽,但问题出在「极值点」这个起点上。极值点的分布完全由原始信号决定,如果信号里有两个频率相近的分量,它们的极值点会交替出现,三次样条插出来的包络就会在两者之间来回摆动,均值 m(t) 就不再是真正的局部趋势,而是一个被两个尺度共同污染的量。筛分次数越多,这种污染越会被放大。

2.2 模态混叠的三种典型表现

模态混叠不是单一现象,常见的翻车方式有三种。第一种是「同一 IMF 混多尺度」:一个 IMF 里同时包含高频振荡和低频趋势,物理意义不纯。第二种是「同一尺度散多 IMF」:一个原本完整的频率成分被拆到两个甚至三个 IMF 里,后续做 Hilbert 变换时瞬时频率会出现跳变。第三种是「IMF 数量漂移」:同一个信号加一点噪声重新分解,IMF 个数从 8 个变成 10 个,导致后续特征提取完全没法对齐。

这三种表现的根因是同一个:EMD 没有全局优化目标,它只是一个贪心的局部筛分过程。极值点分布一旦不均匀,包络误差就会通过筛分迭代累积,最终表现为模态混叠。常见的实现思路是在筛分前对信号做预处理,但预处理本身又会引入新的尺度,所以这条路走不通。

2.3 为什么不能直接修包络

有人会想:既然问题出在包络插值,那换一种插值方式不就行了?比如用 Akima 插值代替三次样条,或者用 B 样条。实际试过就知道,换插值方式只能缓解极值点稀疏区域的过冲问题,解决不了极值点本身分布不均的问题。因为包络的上下边界是由极值点位置决定的,插值方式只影响边界之间的过渡形状,不影响边界点的位置。只要两个频率成分的极值点交替出现,包络就必然在两者之间摆动,这是 EMD 的机制天花板,不是实现细节能绕过去的。

注意:很多人第一次遇到模态混叠时,会怀疑是自己代码写错了,反复检查插值函数和筛分停止条件。其实在标准 EMD 框架下,模态混叠是必然出现的,只是严重程度不同。

3. EEMD 的破局思路:用噪声把极值点分布「抹匀」

3.1 加噪集成的核心机制

EEMD(Ensemble Empirical Mode Decomposition)的思路非常直接:既然极值点分布不均是根因,那就人为地改变极值点分布。具体做法是,在原始信号上叠加一组高斯白噪声,然后对每个加噪后的信号做 EMD,最后把所有分解结果按 IMF 序号做平均。白噪声的作用是提供一个均匀分布的极值点背景,让原本集中在某些区域的极值点被「抹匀」,从而让包络更接近真实趋势。

这个机制能 work 的关键在于:白噪声的频谱是均匀的,它在所有尺度上都提供极值点,所以无论原始信号的频率成分怎么分布,加噪后的信号极值点都不会出现大段空白。而多次加不同噪声再平均,噪声本身因为零均值会被抵消掉,留下的就是更稳定的 IMF 分量。

3.2 参数选择:N 和幅度到底怎么定

EEMD 有两个关键参数:集成次数 N 和噪声幅度 ε。N 决定平均效果,ε 决定噪声对极值点分布的扰动强度。常见的经验公式是 ε = 0.2 * std(x),N 取 100 到 500 之间。但这个公式不是铁律,实际用的时候要看信号特性。

如果信号本身高频成分很强,ε 可以取小一点,比如 0.1 倍标准差,否则噪声会淹没高频细节。如果信号低频趋势明显、极值点稀疏,ε 要取大一点,0.3 甚至 0.4 倍标准差,否则噪声不足以改变极值点分布。N 的选择更直接:N 越大,噪声残留越小,但计算时间线性增长。一般 N=100 时噪声残留已经可以忽略,N=200 是精度和耗时的常见折中。

import numpy as np from PyEMD import EEMD # 模拟信号:两个相近频率分量 + 趋势项 t = np.linspace(0, 1, 1000) signal = np.sin(2 * np.pi * 5 * t) + 0.8 * np.sin(2 * np.pi * 7 * t) + 0.5 * t # EEMD 分解 eemd = EEMD() eemd.noise_width = 0.2 # 噪声幅度,默认 0.2 倍标准差 eemd.trials = 100 # 集成次数 N eemd.parallel = False # 是否并行 IMFs = eemd.eemd(signal) # 输出每个 IMF 的极值点数量,观察是否稳定 for i, imf in enumerate(IMFs): from scipy.signal import argrelextrema max_idx = argrelextrema(imf, np.greater)[0] min_idx = argrelextrema(imf, np.less)[0] print(f"IMF {i}: 极大值 {len(max_idx)}, 极小值 {len(min_idx)}")

这段代码里,noise_width对应 ε,trials对应 N。跑完之后可以对比不同 N 下 IMF 的极值点数量,如果 N=50 和 N=200 的结果差异很大,说明 N 不够,需要加大。如果差异很小,说明当前 N 已经足够。

3.3 EEMD 的残留问题

EEMD 解决了模态混叠,但引入了一个新问题:噪声残留。虽然理论上零均值噪声在多次平均后会抵消,但实际有限次平均下,每个 IMF 里都会残留一部分噪声。残留量大约和 1/sqrt(N) 成正比,N=100 时残留约 10%,N=400 时残留约 5%。对于精度要求高的场景,这个残留量不能忽略。

更麻烦的是,EEMD 分解出来的 IMF 数量在不同次加噪分解中可能不一致。比如某次分解出 9 个 IMF,另一次分解出 10 个,平均的时候就没法直接按序号对齐。常见的处理方式是取最小数量,把多出来的高频 IMF 合并到相邻分量里,但这又引入了人为误差。

4. CEEMDAN 的改进:自适应噪声与分量级平均

4.1 从「加噪声」到「加自适应噪声」

CEEMDAN(Complete Ensemble Empirical Mode Decomposition with Adaptive Noise)的核心改进有两点。第一,它不再一次性加噪声再做完整 EMD,而是在每一阶 IMF 的筛分过程中分别加噪声。第二,它加的不是原始白噪声,而是经过 EMD 分解后的噪声分量,也就是「自适应噪声」。

具体流程是:第一阶 IMF 还是用 EEMD 的方式,加噪声做 EMD,取平均得到 IMF1。但从第二阶开始,它先计算当前残差 r1 = x - IMF1,然后在 r1 上叠加「噪声的 IMF1 分量」,再做 EMD 取平均得到 IMF2。第三阶在 r2 = r1 - IMF2 上叠加「噪声的 IMF2 分量」,以此类推。

这样做的好处是:每一阶加的噪声都是和当前残差尺度匹配的分量,不会出现「高频噪声干扰低频分量」的情况。而且因为噪声是逐阶加入的,最终重构误差几乎为零,解决了 EEMD 的噪声残留问题。

4.2 逐阶筛分的实现细节

用代码表达 CEEMDAN 的逐阶逻辑会更清楚:

import numpy as np from PyEMD import EMD def ceemdan(signal, trials=100, noise_width=0.2): emd = EMD() IMFs = [] residue = signal.copy() # 预先生成噪声的 EMD 分解,用于后续逐阶取分量 noise = np.random.normal(0, noise_width * np.std(signal), len(signal)) noise_IMFs = emd.emd(noise) for stage in range(len(noise_IMFs)): # 在当前残差上叠加对应阶的噪声分量 ensemble = np.zeros_like(signal) for _ in range(trials): n = np.random.normal(0, noise_width * np.std(signal), len(signal)) n_IMFs = emd.emd(n) if stage < len(n_IMFs): perturbed = residue + n_IMFs[stage] else: perturbed = residue + n ensemble += emd.emd(perturbed)[0] # 只取第一阶 IMF imf = ensemble / trials IMFs.append(imf) residue = residue - imf if np.all(np.abs(residue) < 1e-10): break return IMFs, residue

这段代码展示了 CEEMDAN 的核心机制:每一阶只取 EMD 分解的第一阶 IMF 做平均,然后从残差里减掉,再进入下一阶。stage控制当前处理的是第几阶,noise_IMFs是预生成的噪声分量,用来保证每阶加的噪声尺度匹配。实际工程实现里还会做边界处理和筛分停止条件的优化,但核心逻辑就是这个逐阶筛分加分量级平均。

4.3 计算代价与并行化

CEEMDAN 的计算量比 EEMD 大,因为每一阶都要做 N 次 EMD。如果信号长度是 L,IMF 阶数是 K,EEMD 的计算复杂度大约是 O(N * L log L),而 CEEMDAN 是 O(N * K * L log L)。K 通常取 8 到 12,所以 CEEMDAN 的耗时大约是 EEMD 的 8 到 12 倍。

实际用的时候,并行化是必须的。因为每一阶内部的 N 次 EMD 是独立的,可以并行跑。常见的实现思路是用多进程池,把 N 次分解分配到不同核心上。如果 N=100,8 核机器上并行,耗时可以压到串行的 1/6 左右。但要注意,并行化只对阶内有效,阶与阶之间是串行依赖的,因为下一阶的残差依赖上一阶的 IMF 结果。

5. 避坑与排查:EEMD 和 CEEMDAN 的常见翻车点

5.1 噪声幅度设错导致分解失败

现象:分解出来的 IMF1 几乎全是噪声,原始信号的高频成分被淹没;或者 IMF 数量明显偏少,低频趋势没有被拆出来。

原因:噪声幅度 ε 设得太大或太小。ε 太大时,噪声能量超过信号本身,EMD 把噪声当成主要成分分解;ε 太小时,噪声不足以改变极值点分布,模态混叠依然存在。

解决:先用 ε = 0.2 * std(x) 跑一遍,观察 IMF1 的能量占比。如果 IMF1 能量超过总能量 50%,说明 ε 偏大,降到 0.1;如果 IMF 数量少于 5 个,说明 ε 偏小,升到 0.3。反复调两三次就能找到合适值。

5.2 集成次数不足导致结果不可复现

现象:同样的信号跑两次,IMF 数量不一样,或者同一阶 IMF 的波形差异明显。

原因:N 太小,噪声没有被平均掉,随机性主导了结果。N=10 时,噪声残留约 30%,基本不可用。

解决:N 至少取 100,精度要求高时取 200 到 500。如果计算资源有限,可以先用 N=50 做快速验证,确认参数合理后再用 N=200 跑最终结果。另外,固定随机种子可以让结果可复现,但要注意固定种子后噪声序列固定,可能引入系统性偏差,所以最终结果还是建议用大 N 加随机种子。

5.3 IMF 数量不一致导致对齐失败

现象:EEMD 分解时,不同次加噪分解出的 IMF 数量不同,平均的时候报错或者结果异常。

原因:噪声改变了极值点分布,某些次分解多出一个高频 IMF 或少一个低频 IMF。

解决:在平均前先统计所有分解的 IMF 数量,取最小值 K_min,只保留前 K_min 个 IMF 做平均。多出来的高频分量可以合并到 IMF1 里,或者直接丢弃。CEEMDAN 因为逐阶处理,天然避免了这个问题,所以如果对齐问题严重,直接换 CEEMDAN 更省事。

5.4 边界效应导致端点失真

现象:分解出来的 IMF 在信号两端出现明显振荡,和中间段波形不连续。

原因:三次样条插值在边界处没有极值点约束,包络会向外发散。EMD 本身就有这个问题,EEMD 和 CEEMDAN 因为多次分解,边界效应会被放大。

解决:常见的处理方式是对信号做镜像延拓,在两端各延拓一个信号长度的数据,分解完再截掉。或者用极值点预测的方式,在边界处人工补充极值点。如果信号本身是周期性的,直接做周期延拓效果更好。

5.5 把 CEEMDAN 当 EEMD 用导致耗时爆炸

现象:换用 CEEMDAN 后,分解时间从几秒变成几分钟,以为代码有 bug。

原因:CEEMDAN 的计算量本身就是 EEMD 的 K 倍,K 是 IMF 阶数。如果没做并行化,耗时线性叠加。

解决:先确认 IMF 阶数 K,如果 K=10,耗时是 EEMD 的 10 倍是正常的。然后检查是否开了并行,parallel=True在多核机器上能显著降低耗时。如果还是太慢,可以降低 N,比如从 200 降到 100,精度损失有限但耗时减半。

6. 设计取舍:什么时候用 EMD、EEMD 还是 CEEMDAN

选哪个算法,本质上是在「分解质量」「计算代价」「实现复杂度」三者之间做权衡。EMD 最快,但模态混叠严重,只适合信号成分简单、对分解精度要求不高的场景。EEMD 通过加噪集成解决了模态混叠,代价是噪声残留和 IMF 对齐问题,适合大多数常规场景。CEEMDAN 在 EEMD 基础上进一步解决了噪声残留和对齐问题,代价是计算量成倍增加,适合对分解精度要求高、且计算资源充足的场景。

维度EMDEEMDCEEMDAN
模态混叠严重基本消除基本消除
噪声残留无约 1/sqrt(N)几乎为零
IMF 对齐天然对齐可能不一致天然对齐
计算复杂度O(L log L)O(N * L log L)O(N * K * L log L)
适用场景简单信号快速分析常规信号分解高精度分解

实际用的时候,我一般会先用 EMD 跑一遍看信号大概有几个尺度,然后用 EEMD 做正式分解,如果发现噪声残留影响后续分析,再换 CEEMDAN。这样既能快速定位问题,又不会一上来就陷入 CEEMDAN 的耗时泥潭。

还有一个容易被忽略的点:CEEMDAN 的「自适应噪声」并不是万能的。如果信号本身含有大量脉冲噪声,自适应噪声的尺度匹配逻辑会失效,因为脉冲噪声的极值点分布和 Gaussian 噪声完全不同。这种情况下,先做脉冲噪声抑制,再跑 CEEMDAN,效果会好很多。

从那以后我每次做信号分解,都会先画一张极值点分布图,确认极值点没有大段空白,再决定用哪一代算法。这个习惯帮我省了很多反复调参的时间。希望帮到你。

本文还有配套的精品资源,点击获取

相关新闻

Fisher准则线性分类器设计与实现:从原理到Python代码

Fisher准则线性分类器设计与实现:从原理到Python代码

1. 项目概述与整体设计思路做模式识别和机器学习的朋友&#xff0c;一定对Fisher准则下的线性分类器设计不陌生。它是监督学习中一个相当经典的线性降维与分类方向&#xff0c;本质是在高维特征空间里找一条最优投影方向&#xff0c;让两类样本的投影尽量分开&#xff0c;同时每…

2026/10/20 7:48:14 阅读更多 →
AI论文工具全指南:从文献检索到润色答辩的效率提升方案

AI论文工具全指南:从文献检索到润色答辩的效率提升方案

我这两年帮同门和学弟学妹改过二十多份论文初稿&#xff0c;发现大部分人卡住的地方&#xff0c;根本不是写作能力&#xff0c;而是被文献检索、格式排版、语言打磨这些又碎又磨人的环节拖垮了。所以当越来越多人开始关注AI论文工具时&#xff0c;我觉得这确实值得聊透&#xf…

2026/10/20 7:48:14 阅读更多 →
AI芯片软硬件协同设计:数据搬运优化与存储层次架构实践

AI芯片软硬件协同设计:数据搬运优化与存储层次架构实践

1. 从"能跑就行"到"跑得省电"&#xff1a;AI芯片软硬件协同设计的核心命题做AI芯片这行的人都有一个共识&#xff1a;一颗芯片流片回来&#xff0c;能点亮、能跑通ResNet-50&#xff0c;这只是万里长征第一步。真正决定这颗芯片能不能被客户接受、能不能上…

2026/10/20 7:48:14 阅读更多 →

最新新闻

Vidu Q4 Preview深度评测:AI视频生成迈向生产力工具的关键一步

Vidu Q4 Preview深度评测:AI视频生成迈向生产力工具的关键一步

最近几个创作群里讨论最多的&#xff0c;绕不开Vidu Q4 Preview。做AI视频的同仁应该都有感觉&#xff0c;这个赛道现在卷到什么程度&#xff1a;几乎每隔几天就有新版本、新模型冒出来&#xff0c;但大多是“看起来厉害、一上手就露馅”。Vidu Q4 Preview这次放出的内容&#…

2026/10/21 0:33:56 阅读更多 →
AI在芯片设计中的黑盒困局:一次IR压降事故带来的反思

AI在芯片设计中的黑盒困局:一次IR压降事故带来的反思

芯片世界里&#xff0c;有一句话最近被工程师们重复得越来越多&#xff1a;AI赢了棋局&#xff0c;却讲不出思路。就在上个月&#xff0c;我拿着一个AI辅助完成的block级floorplan给物理设计团队&#xff0c;线长比上一版少了12%&#xff0c;拥塞图也干净得不像话。结果等IR压降…

2026/10/21 0:33:56 阅读更多 →
计算智能体入门:从状态机到Q-learning的决策实现

计算智能体入门:从状态机到Q-learning的决策实现

1. 从零理解计算智能体的核心骨架计算智能体这个概念&#xff0c;听起来像是学术论文里的术语&#xff0c;但把它拆开来看&#xff0c;其实就是一个能感知环境、做出决策、执行动作的软件实体。你可以把它想象成一个在迷宫里找路的小机器人&#xff0c;它能看到周围哪里有墙、哪…

2026/10/21 0:33:55 阅读更多 →
MoE混合专家模型:稀疏激活如何破解大模型容量与成本困局

MoE混合专家模型:稀疏激活如何破解大模型容量与成本困局

从Transformer诞生起&#xff0c;前馈网络&#xff08;FFN&#xff09;就是"又笨重又绕不开"的角色&#xff1a;它占了模型近三分之二的参数量&#xff0c;但每个token都得老老实实把所有参数过一遍。你扩大模型容量&#xff0c;推理成本就跟着线性往上涨&#xff0c…

2026/10/21 0:33:55 阅读更多 →
开源30B模型硬刚闭源旗舰:科研场景实测与本地部署指南

开源30B模型硬刚闭源旗舰:科研场景实测与本地部署指南

最近开源圈又热闹起来了&#xff0c;一个主打科研场景的30B级别开源模型&#xff0c;直接放话要跟两家头部闭源大模型掰手腕。我当时第一反应是“又来一个刷榜的”&#xff0c;但仔细看完技术报告和社区实测数据之后&#xff0c;觉得这波还真不是营销话术&#xff0c;确实有货。…

2026/10/21 0:33:55 阅读更多 →
LLM强化学习全解析:PPO、GRPO、DPO等五类方法选型与实践

LLM强化学习全解析:PPO、GRPO、DPO等五类方法选型与实践

做LLM训练绕不开强化学习这块&#xff0c;标题里这五个字看着简单&#xff0c;真要分类起来其实挺讲究的。我前几年刚开始接触大模型对齐时&#xff0c;也把PPO、DPO、GRPO这些名词搞得晕头转向&#xff0c;后来用了一段时间才理清楚它们之间的血缘关系和适用场景。这篇博文就把…

2026/10/21 0:32:54 阅读更多 →

日新闻

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

这段时间硬件圈和AI圈都在传一个事&#xff1a;AMD锐龙AI Max PRO 400系列把最高192GB统一内存搬进了PC形态的产品里&#xff0c;按宣传口径&#xff0c;本地跑320B参数的大家伙不再是纸面概念。我第一反应倒不是“内存真大”&#xff0c;而是这话背后的含金量——它把过去只能…

2026/10/21 0:00:11 阅读更多 →
AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

1. 从“封号重开”这个行为说起&#xff1a;用户到底在追求什么“封号重开”这四个字&#xff0c;放在任何产品语境里都带着一股决绝的味道。一个账号从零开始积累使用记录、调教偏好、沉淀工作流&#xff0c;背后是大量的时间和精力成本。正常情况下&#xff0c;没有人愿意主动…

2026/10/21 0:00:11 阅读更多 →
ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

1. 为什么在ROS里硬刚YOLOv3不是“炫技”&#xff0c;而是工程落地的必经之路我第一次在某高校机器人实验室看到那台搭载Jetson TX2的移动底盘原地打转、反复识别错垃圾桶时&#xff0c;就意识到&#xff1a;单纯跑通darknet_ros demo和真正让YOLOv3在ROS里“干活”&#xff0c…

2026/10/21 0:00:11 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型&#xff08;GMM&#xff09;的语音识别系统&#xff0c;很多人第一反应就是一堆数学公式&#xff0c;觉得门槛很高。但如果你真的在MATLAB里把它落地跑通&#xff0c;会发现核心其实就是三件事&#xff1a;把声音变成特征向量&#xff0c;用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人&#xff0c;但落到具体操作上&#xff0c;无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程&#xff1a;对图像做反白、改调色板、彩色转灰度&#xff0c;最后把像素数据导出成txt文件。单看每一…

2026/10/20 20:43:59 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 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/20 10:02:08 阅读更多 →
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/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练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/20 9:50:45 阅读更多 →