纯整数二阶滤波器:嵌入式MCU上实现高效ADC信号处理
做嵌入式的朋友应该都遇过这种场景ADC采回来的信号毛刺大得离谱滤波算法的浮点运算又把MCU拖得够呛。尤其用低频小成本芯片的时候浮点运算库一链接Flash和CPU周期直接肉眼可见地吃紧。这时候你大概率会想能不能用纯整数写出一个二阶滤波器在完全不碰浮点指令的前提下把信号处理干净。答案是能的而且做好了效果相当稳。这篇文章就围绕纯整数二阶滤波器这个主题从数学表达、系数推导、定点改造到MCU代码实现一条线捋清楚。全程不用浮点库只在整数域里做事适合那些使用低主频、无FPU、Flash紧张的MCU也适合对代码确定性有强迫症、希望在多平台拿到一致输出的朋友。我尽量把原理讲得像聊天代码给到可以直接抄的程度坑也提前帮你踩一遍。1. 为什么要在嵌入式里较真“纯整数滤波”1.1 浮点不是不能用但它是有贵贱的先聊一个最现实的问题既然浮点运算写起来又简单又直观为什么还要折腾成整数很多8位或低端32位MCU根本没有硬件浮点单元。你对一个float变量做加减乘除编译器只能调用软件浮点库光是做一次乘法和加法背后可能就有几十条甚至上百条指令。放在控制环、采样中断这种高频路径里CPU时间一紧张整个系统的实时性就变得很难看。但整型乘加不一样。大多数MCU哪怕再便宜也有硬件整数乘法器。一条指令完成32位乘法和加法再配几条移位、跳转指令一个滤波周期就结束了。这对周期型采集任务特别友好可以放在一个高频中断里跑不用频繁开关中断去抢时间。1.2 纯整数的核心收益不止是快我的体会是整数滤波还有一个容易被忽视的好处可复现性。浮点运算在不同编译器、不同优化等级、不同架构下中间精度和舍入结果可能出现细微差别。有时候你烧录完发现两次编译出来的波形有一丁点不一样排查半天才发现不是代码逻辑问题是浮点底层行为差异。而纯整数运算完全由整数乘法和移位组成只要用同字长的整型理论结果就是一致的。这在多版本固件维护和跨平台移植时省心很多。当然我也不是劝你在所有场合都抛弃浮点。你手头芯片带FPU主频也足够那直接用浮点滤波完全没问题。整数方案的真正舞台是成本敏感、Flash被塞得满满的、主频只有几十兆赫的这种低配环境。1.3 适用场景判断清单根据我的实际经验遇到下面几种情况纯整数二阶滤波器会是首选ADC采样率不高但是采样中断里活比较多需要把滤波计算压得很小单片机没有FPU跑软件浮点库的RAM和Flash开销都在困扰你产品的多型号硬件平台差异大你希望滤波结果尽可能一致需要批量生产的校准和测试有一致性要求整数运算是更可控的选择如果项目里主控性能富余到随便浪费那本文的方案属于“降维打击”看完原理后你也能明白滤波器背后的本质不吃亏。2. 二阶滤波器原理与整型化思路2.1 从差分方程出发理解二阶IIR数字滤波器分两类一类是FIR另一类是IIR。二阶IIR的经典差分方程长这样y[n] b0*x[n] b1*x[n-1] b2*x[n-2] - a1*y[n-1] - a2*y[n-2]这个式子看着简单信息量其实很大。x[n]是当前输入x[n-1]、x[n-2]是前两次输入y[n-1]、y[n-2]是前两次输出。之所以叫IIR是因为当前输出在递归地使用历史输出相当于把过去的输出又重新喂回到系统里。分母系数a1、a2决定了系统的“惯性”也就是滤波器的共振峰和衰减特性。对应到Z域它的传递函数是H(z) (b0 b1*z^-1 b2*z^-2) / (1 a1*z^-1 a2*z^-2)你其实不需要对Z变换有多深的数学功底只需要知道分子决定滤波器对输入信号哪些频率放行或压制分母决定系统的反馈回路是否稳定。只要分母多项式在单位圆内的根不出圈这个滤波器就能稳定工作。这里要特别提醒一句不同教材和代码库里a1、a2的符号约定可能不一样。有的写成y[n] b0*x[n] ... a1*y[n-1] a2*y[n-2]有的写成减号。网上抄代码时最容易抄错的就是这里后面我会专门讲怎么排查符号问题。2.2 从浮点系数到整数系数Q格式定点化差分方程里的系数b0、b1、b2、a1、a2通常是带小数的浮点数比如0.02008、-1.561的负数。MCU要做纯整数运算就得把这些小数转成整数。最常用的办法是Q格式把每个系数乘以一个共同的缩放因子通常是2的整数次幂然后在每次计算完后再右移回去。举个例子我习惯用Q12格式也就是缩放系数取4096。某个浮点系数是0.020083乘以4096后再四舍五入0.020083 * 4096 82.26取整为82于是运行时就不再有浮点数只剩一个整数82。参与计算的全是整数乘法最后统一把累积结果右移12位。Q格式的缩放因子不是拍脑袋选的它受几个因素约束系数最大值是多少像a1可能是-1.56乘以4096后变成约-6390可以用16位有符号数装下。但如果某些系数接近5甚至更大那Q12就放不下了得降低缩放因子。累加器位宽够不够你的输入是16位系数也是16位相乘结果是32位多个乘积累加后还可能溢出。这时要么用更小的Q值要么用64位累加器。精度够不够缩放因子太小系数的小数部分会被截掉很多滤波器频率响应会肉眼可见地偏掉。缩放因子太大又容易溢出。所以Q值本质上是一个“动态范围”和“计算精度”的折中。先用Q12入门是最舒服的绝大多数常见二阶IIR滤波器系数都能落在这套格式里。2.3 二阶为什么够用级联的思路有人会问如果只有二阶那是不是什么都滤不干净答案分两层。第一层是硬件资源确实有限。二阶IIR已经能把很多应用场景搞定比如传感器信号去噪、ADC采样的工频干扰衰减、PID反馈的低通平滑这些场景对过渡带宽度的要求没有那么苛刻。第二层是二阶可以作为积木反复叠。你完全可以把三个二阶滤波器串起来组成六阶也就是把前一个滤波器的输出作为后一个滤波器的输入。很多库里的高阶IIR本质就是这么做的。虽然级联会放大一些定点误差但只要每一级都保留足够位宽仍比直接写一个高阶差分方程要稳定得多。真实的嵌入式项目里我见过不少只挂一个二阶就解决问题的。先用它把原理和代码跑通后续要扩展成多级也是顺手的事。3. 完整实现系数计算、C代码与实测效果3.1 先手算一组合格的滤波器系数纯整数实现不等于系数也要在MCU上用纯整数现算。我强烈建议在PC上用脚本生成浮点系数再定点化然后把整数系数写死在程序里。以最常用的二阶巴特沃斯低通为例假设采样率fs200Hz想滤除10Hz以上的高频分量。双线性变换法的系数计算公式如下其中fc是截止频率fs是采样率omega tan(pi * fc / fs) den 1 sqrt(2) * omega omega^2 b0 omega^2 / den b1 2 * omega^2 / den b2 b0 a1 2 * (omega^2 - 1) / den a2 (1 - sqrt(2) * omega omega^2) / den这里的符号约定对应差分方程里的减号写法也就是说后面用y[n] b0*x[n] ... - a1*y[n-1] - a2*y[n-2]时直接把算出来的a1、a2带进去。把fs200fc10代入omega tan(pi * 10 / 200) tan(pi / 20) 0.15838444 den 1 1.41421356 * 0.15838444 0.15838444^2 1.249101 b0 0.020083 b1 0.040167 b2 0.020083 a1 -1.56106 a2 0.641342你会看到典型的低通滤波器特征零点高频衰减极点主导低频通过。然后按Q12缩放得到整型系数F 4096 b0_int round(0.020083 * 4096) 82 b1_int round(0.040167 * 4096) 165 b2_int round(0.020083 * 4096) 82 a1_int round(-1.56106 * 4096) -6394 a2_int round(0.641342 * 4096) 2627这里要检查两个事情第一82、165、-6394、2627都落在int16的范围内没问题第二乘积累加和不能超过int32的范围。最坏情况下a1_int * y1大概是-6394乘以-32768约2.09e8几个乘积加起来也不会超过21.47亿的int32上限所以用32位累加器是安全的。3.2 嵌入式C代码实现下面直接给出一个可复用的纯整数二阶滤波器实现。我在结构体里保存历史状态初始化时把所有状态清成0。#include stdint.h typedef struct { int16_t b0, b1, b2; int16_t a1, a2; int16_t x1, x2; int16_t y1, y2; uint8_t shift; /* 缩放位移量 */ } int_iir_2nd; void int_iir_2nd_init(int_iir_2nd *f) { f-x1 0; f-x2 0; f-y1 0; f-y2 0; } int16_t int_iir_2nd_process(int_iir_2nd *f, int16_t x) { int32_t acc; /* 差分方程y b0*x b1*x1 b2*x2 - a1*y1 - a2*y2 */ acc (int32_t)f-b0 * x (int32_t)f-b1 * f-x1 (int32_t)f-b2 * f-x2 - (int32_t)f-a1 * f-y1 - (int32_t)f-a2 * f-y2; /* 加半个LSB做四舍五入避免直接右移导致负向偏置 */ acc (int32_t)1 (f-shift - 1); acc f-shift; /* 饱和处理防止输出溢出 */ if (acc 32767) { acc 32767; } if (acc -32768) { acc -32768; } /* 更新历史状态 */ f-x2 f-x1; f-x1 x; f-y2 f-y1; f-y1 (int16_t)acc; return (int16_t)acc; }使用方式很简单。初始化后把上面算好的Q12系数填进结构体int_iir_2nd filter; filter.b0 82; filter.b1 165; filter.b2 82; filter.a1 -6394; filter.a2 2627; filter.shift 12; int_iir_2nd_init(filter);之后每来一个ADC采样值就调用一次滤波函数输出就是滤波后的值。这段代码里有两个细节值得展开。一个是加0.5个LSB的舍入处理。直接右移12位本质上是向下取整负数会往负无穷方向偏。时间一长直流分量和静态调零都可能受影响。预先加上半个量化步长能显著降低这种偏差。第二个是饱和处理。IIR有反馈回路输入一有跳变中间值可能瞬间放大如果不做钳位历史状态y1会被截断成一个奇怪的值后续滤波结果就会跟着走偏。饱和处理不仅保护输出也保护反馈状态不被破坏。3.3 实测效果同一路信号的前后对比我之前在某个工业模拟量采集项目里用过这套滤波器。现场信号是一条约5Hz的缓慢变化电压叠加了约40Hz的电磁干扰以及小幅随机噪声。采样率200Hz。滤波前ADC原始数据的峰峰值大概在2600。滤波后峰峰值压到了大约1050主要波形是5Hz的有效信号高频毛刺明显变平滑。40Hz干扰在这个10Hz截止频率的二阶滤波器下理论衰减约-24dB实测也符合这个趋势。如果把多个二阶串联成四阶同样的干扰还能再往下压但代价是相位滞后变大这个要根据具体需求去权衡。需要强调这类测试一定要让系统先运行几十个采样点等滤波器状态稳定后再去看数据。IIR存在一个启动瞬态过程刚上电时输出会先跳一下那不是代码bug是它固有的收敛现象。4. 参数调整、性能评估与调优经验4.1 动态范围从Q12迁到Q14的决策实际项目中你可能会遇到系数差值很大、Q12放不下的情况。比如一个带通滤波器某个a1系数可能达到-1.9某个b系数却只有0.002。如果统一用Q12小系数会被量化抹掉太多精度大系数又可能逼近int16边界。这种情况下我有几个选择习惯先看所有系数绝对值中的最大值给这个最大值预留出两倍以上的余量如果最大系数不超过1可以加大缩放因子到Q14或者Q15如果最大系数超过2那就不太适合继续用16位系数需要降阶或改用分段处理判断能否用Q14很简单把绝对值最大的系数乘以16384看看是否小于32767。以刚才的低通为例a1_int是-1.561乘以16384约-25580没问题。那么理论上Q14也能跑。但此时b0变成0.020083乘以16384约329精度更高。代价是a1_int和a2_int变大了累加器里的临时值也跟着变大仍然在int32安全范围但余量变少了。所以一个实用小技巧是以实际输入信号不超过int16的70%为前提做一次最坏情况估算如果累加器结果超过int32限制就果断调低缩放因子。4.2 性能开销与优化手段纯整数IIR的每个采样计算只有5次乘法和4次加法再加上一次移位。放在大多数32位MCU上这个开销几乎可以忽略。我实测过一款48MHz主频的低功耗MCU直接开O2优化后单次滤波函数调用大约在2到3微秒左右。这还是在带函数调用、状态更新的情况下。对200Hz采样率来说每次采样周期有5000微秒滤波只占千分之一不到完全不影响其他实时任务。如果你想进一步压缩时间可以试试这样几个手段把结构体定义成局部变量或全局变量减少指针间接访问改成带状态的静态全局变量让编译器直接把状态放进寄存器如果MCU有“读-改-写”快的位宽特性把x1、x2等合并成32位变量一次拷贝完成历史状态更新在极端性能场合把最重要的中间变量声明为volatile可能会导致性能下降非多级中断共享的话不必加但说句实在话这点性能如果你都能感知到压力那整个系统大概率已经处于别的瓶颈上了。先清掉外部中断和OS调度的开销比扣这个滤波器更有效。4.3 相位滞后和截止频率偏移的处理整数化之后截止频率会跟理论浮点值有一点偏移主要是系数舍入造成的。对于大部分工程测试这个偏移很小。小到什么程度Q12下截止频率偏移通常在1%以内完全不影响传感器平滑。但如果你的系统对相位特别敏感比如你要做的是实时控制环滤波带来的相位滞后就不能忽略。二阶巴特沃斯低通在截止频率处的相位滞后已经比较明显了这时候有两个思路在控制回路上做相位补偿人为增加一个超前环节提高采样率把截止频率相对采样率压低这样在有用信号频段内相移会小很多我碰到过把截止频率设在采样率十分之一的情况那个相位滞后就非常可观输出波形直接慢半拍乍看还以为是传感器有问题。5. 高频踩坑与排查清单5.1 一上电输出就振荡先查a1、a2的符号这是IIR滤波器最常见的灾难现场。代码看起来没问题信号一放进去输出要么直接往正负两头甩要么高频振荡得吓人。九成以上是符号约定没对准。请在纸面上先写清楚y[n] b0*x[n] b1*x[n-1] b2*x[n-2] - a1*y[n-1] - a2*y[n-2]如果你从某个工具里导出的系数是“ a1*y[n-1] a2*y[n-2]”格式那你就得把a1、a2先取反再填到结构体里。我在代码里用的是减号所以a1_int是负数时实际上是加反馈。排查方法也很直给把输入固定为0初始状态全0输出应当稳定在0把状态y1强制设成一个大值观察它几个采样周期后是收敛还是发散。如果发散基本就是符号或极点问题。5.2 直流偏置和极限环舍入带来的隐形误差整数IIR还有一个浮点版本很难看见的问题极限环。当输入是直流或非常缓慢的信号时反馈回路的舍入误差可能让输出在某一两个相邻值之间反复跳动形成一种稳定的“死循环”。这是因为在定点运算下反馈项没办法精确表示某些中间状态。缓解办法有几个在累加后加0.5LSB的舍入补偿避免系统性向一个方向偏输出钳位同时让历史状态也使用钳位后的值防止状态漂移如果系统有时间可以在稳态时做一次输出平均值校正我自己最常用的还是“加半LSB”这个方法代码里有体现效果立竿见影。5.3 整型系数导致极点飘移别只盯时域波形有时候滤波器能从波形上看挺正常但一旦输入频率凑到某些点上输出突然异常放大。这大概率是定点量化让极点位置发生了偏移靠近单位圆的极点尤其危险。所以上线之前我建议你在PC上做一个简单验证把量化后的整型系数回代成浮点用根轨迹或者频率响应看一眼极点是否还在单位圆内。这是十分钟能做完的事却能在现场帮你少熬好几个晚上。5.4 常见问题速查表为了方便你现场排查我把踩过的坑列成一张表现象可能原因处理方式输出秒变最大或最小a1/a2符号反了核对差分方程中的“减号”约定输出慢慢震荡长大极点因量化飘出单位圆降低Q值或换不同结构实现输出有规律跳两个值舍入偏差导致极限环加半LSB舍入补偿滤波后信号整体偏高/偏低固定点舍入偏置检查移位前的舍入处理高频能滤但低频也衰减很多截止频率或Q值不对用PC脚本复核系数运算后噪声反而变大累加器溢出改用更高位宽累加器或降低缩放因子这里最想强调的还是第一行。符号错误没有那么多技术含量就是“差之毫厘谬以千里”。每次拿到新滤波器系数我都习惯先看一眼符号约定再决定代码里用加法还是减法这个习惯帮我省了很多事。最后再分享一点个人体会做了几年嵌入式信号处理我越来越觉得纯整数滤波器不是为了炫技它其实是在性能和确定性之间找平衡的一种工程思路。低主频MCU上能用几十条指令跑完的滤波核心换来的是采样中断的稳定和整体系统的行云流水。如果你现在正被ADC噪声困扰又不想因为浮点运算把主控换掉可以先拿这个二阶整数滤波器跑起来。建议第一步先在PC上把系数算好第二步套用我上面的C代码第三步用串口把原始数据和滤波数据同时打出来放在波形软件里对比。只要看到高频毛刺明显变小、低频趋势还在这就算成功了一大半。下次遇到要滤更高阶的场合你只需要照葫芦画瓢多挂几个二阶即可。这套思路不管换什么型号的MCU都通用。

相关新闻

虚拟机Ubuntu部署OpenClaw与Ollama:搭建私有本地AI代理

虚拟机Ubuntu部署OpenClaw与Ollama:搭建私有本地AI代理

上个月我又被一份云端 API 账单气到不行:只是让 AI 助手帮我写点小脚本、整理几份日志,月底一算居然够我吃好几顿火锅。更别扭的是,工作内容还要先经过别人家的服务器转一圈,数据隐私这块始终心里没底。于是我开始认真琢磨一件事—…

2026/10/15 5:24:10 阅读更多 →
自动化脚本的八种静默失败:每一个都“看起来成功了“

自动化脚本的八种静默失败:每一个都“看起来成功了“

写在前面调试里最贵的一类 bug,不是抛异常的,而是返回成功、显示在跑、日志正常,但什么都没发生的。本文八个案例全部来自同一台 Windows 机器上真实运行的一整套自动化设施(计划任务守护 浏览器自动化 Vue 表单操作&#xff09…

2026/10/15 5:24:10 阅读更多 →
Keras激活函数可视化:用图像理解Sigmoid、ReLU与训练难题

Keras激活函数可视化:用图像理解Sigmoid、ReLU与训练难题

有一段时间,我做某个图像分类小项目,训练曲线一直下不去。层数、学习率、优化器都调过了,最后才怀疑到激活函数头上。说实话,激活函数的公式我都能背,但真到选型时,帮上忙的居然是“看图像”。这次我用 Pyt…

2026/10/15 5:24:10 阅读更多 →

最新新闻

FastAPI进阶实战:异步并发、依赖注入与生产部署全解析

FastAPI进阶实战:异步并发、依赖注入与生产部署全解析

先说一个可能有点得罪人的观点:FastAPI 之所以在圈子里被“吹”得这么厉害,大部分教程都在讲它有多少新特性、能省多少代码,但真正决定这门技术在生产环境里能不能站得住脚的,往往是另一套东西。不是路由怎么写,也不是…

2026/10/15 6:11:42 阅读更多 →
IEC61850工程建模实战:从ICD到SCD的互操作避坑指南

IEC61850工程建模实战:从ICD到SCD的互操作避坑指南

简介:这份PPT面向电力系统自动化、变电站二次设计与调试人员,以及需要理解IEC61850建模思路的工程师与学习者,系统梳理了该标准在工程应用中的建模方法。内容从标准制定背景切入,对比IEC870-5-101、IEC870-5-103、DNP3.0等传统规约…

2026/10/15 6:11:42 阅读更多 →
第二代刀片电池与兆瓦闪充:如何终结纯电补能焦虑?

第二代刀片电池与兆瓦闪充:如何终结纯电补能焦虑?

1. 补能焦虑与电池困境:为什么“闪充”成了解不开的死结这几年在新能源汽车行业里泡着,跟车友、同行聊得最多的其实不是智能驾驶有多炫,也不是座舱大屏有多爽,而是补能这件事到底什么时候能彻底解决。纯电车主都懂那种感觉&#x…

2026/10/15 6:11:42 阅读更多 →
OpenClaw exec 工具实战:前后台命令执行、host 路由与安全审批全解

OpenClaw exec 工具实战:前后台命令执行、host 路由与安全审批全解

人工智能大模型LLM 网关AI Agent即时通讯 【免费下载链接】openclaw-zero-token OpenClaw: Use All Major AI Models NO API Token! Claude/ChatGPT/Gemini/DeepSeek/Doubao/Grok/Qwen/Manus/Kimi 项目地址: https://gitcode.com/gh_mirrors/op/openclaw-zero-token…

2026/10/15 6:11:42 阅读更多 →
ASP.NET Core面试核心知识点:中间件、依赖注入、缓存与性能优化

ASP.NET Core面试核心知识点:中间件、依赖注入、缓存与性能优化

1. 请求管道与中间件:面试官真正想考察什么1.1 中间件执行顺序为什么是面试必考题中间件在 ASP.NET Core 里本质是一个委托链。形象点说,你可以把管道想象成一条流水线,HttpContext 是一个不断被传递的工作对象,每个中间件是一个工…

2026/10/15 6:11:42 阅读更多 →
Unity AssetBundle实战:打包策略、依赖管理与热更新避坑指南

Unity AssetBundle实战:打包策略、依赖管理与热更新避坑指南

1. 为什么值得花时间啃透AssetBundle如果你做Unity开发有一段时间了,大概率经历过这样的场景:项目初期资源随便扔在Resources目录里,跑得挺欢;等到包体膨胀到两三百兆,加载越来越慢,老板开始问“能不能热更…

2026/10/15 6:10:41 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 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/15 0:14:36 阅读更多 →
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/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练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/14 7:53:34 阅读更多 →