STM32嵌入式FFT实战:点数选型、幅值校准与ADC-FFT闭环调试
简介本资源是一份面向嵌入式初学者与STM32开发者的FFT算法实践指南聚焦在资源受限的MCU平台上实现高精度、低耗时的频谱分析。内容完整覆盖正弦信号建模21Hz主频多谐波随机噪声、基于STM32官方DSP库的1024点FFT全流程含cr4_fft_1024_stm32.s调用、实虚部数据格式处理、频谱结果解析频率计算Fni×Fs/NPT、幅值归一化Mag√(X²Y²)/NPT及性能对比官方库仅9ms vs 非官方库411ms。资源为单个244KB的Word文档.docx结构清晰含公式推导、关键代码段、串口打印示例及频谱图标注便于边学边练。目前已有2698人学习下载特别适合需要快速掌握嵌入式信号处理核心能力、完成课程设计或传感器频率识别项目的开发者。1. STM32上跑FFT不是“调个库就完事”64/256/1024点实测对比、幅值校准玄学、ADC采样链路闭环验证全拆解你手头有一块STM32F4系列开发板接了个振动传感器想实时抓出21Hz的主频分量——但串口打印出来的频谱图里21Hz峰旁边堆着一堆毛刺直流分量炸到2万而理论振幅2048却只显示800多改了采样率频率轴全偏移换用非官方C语言FFT耗时411msLED灯都闪三下才出结果。这不是算法写错了是整个嵌入式FFT落地链路里埋了至少5个隐性坑ADC参考电压没校准、定点数缩放系数错位、奈奎斯特对称性被忽略、浮点中间态溢出、甚至printf格式化本身都在吃精度。本文不讲DFT数学推导只聚焦STM32真实工程现场——用官方DSP库cr4_fft_1024_stm32.s跑通1024点FFT把从ADC采样→数据打包→FFT执行→幅值还原→串口可视化这条链路每一环的寄存器配置、内存布局、缩放因子、调试技巧全摊开。适合正在做电机电流谐波分析、音频前端预处理、或传感器故障特征提取的嵌入式开发者尤其适合刚把HAL_ADC_Start_DMA跑通、却卡在“为什么FFT结果和示波器对不上”的人。2. 官方DSP库FFT三档点数选型依据为什么64点够测开关电源噪声1024点才敢碰21Hz工频谐波2.1 频率分辨率与采样时间的硬约束0.1Hz分辨力不是靠“算得细”而是靠“采得久”频率分辨率Δf Fs / N这是FFT的物理铁律。项目正文里Fs102.4Hz、N1024得出Δf0.1Hz看似合理但实际工程中这个组合暗藏陷阱。我们来反推若目标信号是21Hz要求能区分20.9Hz和21.1Hz即±0.1Hz容差则Δf必须≤0.2Hz此时最小N Fs / Δf 102.4 / 0.2 512。但为什么作者坚持用1024因为单点幅值精度与N成正比。FFT输出复数的模值 |X[k]| ≈ A × N/2A为原始信号峰值N越大信噪比越高微弱谐波越容易从噪声基底中浮出。实测对比当N256时21Hz峰高约1200理论应≈2048×256/2262144但经定点缩放后归一化为1200量级而N1024时峰高升至4850噪声基底波动从±80降到±30。这解释了为何64点库cr4_fft_64_stm32.s只适合开关电源纹波100kHz级、256点库勉强用于音频中频1-5kHz而工频谐波、电机转速特征10-100Hz必须上1024点——不是CPU有多余算力是物理分辨力倒逼的。提示不要盲目追求高N。STM32F407的SRAM只有192KB1024点输入/输出各需4KB32位整型×1024加上中间缓冲区已占满1/4。若用F10320KB SRAM1024点会直接触发HardFault。2.2 三个汇编库的硬件适配差异cr4_fft_xxx_stm32.s里的Cortex-M4指令优化细节官方DSP库的三个文件名看似只是点数不同实则底层指令集有本质区别cr4_fft_64_stm32.s使用QADD,QSUB等饱和加减指令专为M4的DSP扩展指令集优化64点内循环展开充分单次FFT耗时约0.8msF407168MHzcr4_fft_256_stm32.s引入VLD4.32四路并行加载将实部/虚部/索引打包读取减少总线等待256点耗时约3.2mscr4_fft_1024_stm32.s启用VLDMIA块加载VSTMIA块存储且FFT蝶形运算中插入NOP平衡流水线1024点耗时9ms如正文图5所示。关键验证点查看.s文件中__asm段内的vld4.32 {d0-d3}, [r0]!指令——若你的芯片不支持VFPv4如F103无浮点单元此指令会触发UsageFault。因此F103必须用cr4_fft_64_stm32.s而F407/F767可全系兼容。实测发现同一份代码在F407上1024点FFT稳定9ms但在F767上因L1 Cache更大耗时降至7.3ms这就是库文件未明说的硬件红利。2.3 输入数据打包规范为什么lBUFIN[i] ((s16)fx)16必须左移16位而非简单赋值STM32官方FFT库要求输入数组为32位整型高16位存实部低16位存虚部。但ADC采样值是纯实数如12位ADC输出0-4095虚部恒为0。若直接写lBUFIN[i] adc_value;则实部0虚部adc_valueFFT结果完全错误。正确做法是// 将ADC值0-4095映射到有符号16位范围-32768~32767 s16 real_part (s16)(adc_value - 2048); // 中心化消除直流偏置 s16 imag_part 0; lBUFIN[i] ((u32)real_part 16) | ((u32)(u16)imag_part);此处16不是为了“放大”而是内存布局强制对齐。若用int32_t数组lBUFIN[i]的地址按4字节对齐16确保实部占据高16位bit31-bit16虚部占据低16位bit15-bit0。实测错误案例某开发者用lBUFIN[i] adc_value * 64;试图放大增益结果因未分离实虚部所有频点幅值归零——FFT引擎把整个32位当成了复数而虚部非零导致相位混乱。2.4 输出结果解读为什么lBUFOUT[0]是直流分量lBUFOUT[N/2]才是奈奎斯特频率点FFT输出是共轭对称的复数序列长度N1024时有效频点只有前N/21个0到Fs/2。具体对应关系索引 i对应频率物理意义幅值计算公式00Hz直流分量1~511i×Fs/N正频率分量2×512Fs/251.2Hz奈奎斯特频率注意项目正文公式Fni*Fs/NPT中i从0开始是对的但常被误读为“i1对应第一个交流分量”。实际上i0就是直流i1才是Fs/N0.1Hz。实测验证生成纯直流信号ADC恒定2048FFT后lBUFOUT[0]的模值≈2048×10242,097,152而其他点接近0——这证明直流能量全部集中在i0点无需乘2。3. 幅值校准的四个致命参数从ADC参考电压到定点缩放系数的全链路修正3.1 ADC参考电压误差3.3V标称值≠实际值实测偏差达±4%导致幅值系统性偏移项目正文假设“ADC映射到0-3.3V”但STM32的VREF引脚受PCB走线阻抗、LDO负载调整率影响实测某开发板VREF为3.18V。这意味着ADC读数4095对应的真实电压是3.18V而非3.3V。若按3.3V计算振幅A则误差为(3.3-3.18)/3.18≈3.8%。更严重的是ADC内部参考电压VREFINT也存在±10%偏差若用VREFINT校准ADC必须先用万用表测VREFINT实际值通常1.2V±5%。修正方法// 在main()开头校准 float vref_actual 1.22f; // 万用表实测VREFINT电压 float vref_int_adc HAL_ADCEx_GetVoltageReference(); // 读取VREFINT对应的ADC码 float adc_vref_correction 1.2f / vref_int_adc * vref_actual; // 校准系数 // 后续ADC值转换为电压voltage adc_raw * 3.3f / 4095.0f * adc_vref_correction;未校准时21Hz信号峰高显示4850校准后升至5020与理论值50402048×1024/2×3.18/3.3误差0.5%。3.2 定点数缩放系数sqrt(X*X Y*Y)*2/NPT中的2和NPT为何不能合并为2/NPT项目正文给出幅值公式lBUFMAG[i] sqrt(lX*lX lY*lY)*2/NPT但实际代码中拆成两步float X NPT * ((float)lX) / 32768; // 先放大NPT倍再除以327682^15 float Y NPT * ((float)lY) / 32768; float Mag sqrt(X*X Y*Y) / NPT; // 再除以NPT为什么要绕这么大弯因为lX/lY是16位有符号整数-32768~32767直接计算lX*lX会溢出32767²≈10⁹超出32位有符号int范围。32768是定点缩放基数将16位数映射到-1~1范围。NPT * value / 32768本质是Q15格式转浮点。若强行写sqrt(lX*lX lY*lY) * 2 / NPT在N1024时lX*lX最大达10⁹而long long在ARM GCC中非默认启用极易溢出。血泪经验某开发者为省事改用int64_t结果因未开启-mlong-calls链接选项函数调用失败HardFault。3.3 串口浮点打印精度陷阱printf(%f, Mag)在Keil MDK中默认截断小数点后6位项目正文用printf(%4d, %.2f%10d\n,i,((float)i*Fs/NPT),lBUFMAG[i]);打印频率和幅值但lBUFMAG[i]是u32类型存储的是Mag * 65536即Q16定点数。若直接printf(%d, lBUFMAG[i])显示的是放大65536倍后的整数毫无意义。正确做法是// 将Q16转浮点并打印 float mag_float (float)lBUFMAG[i] / 65536.0f; printf(Freq:%.1fHz, Mag:%.3f\n, (float)i*Fs/NPT, mag_float);但Keil MDK的printf浮点支持默认关闭需在Options for Target → C/C →勾选Use MicroLIB否则%f输出0.000。实测翻车某导师演示时未勾选全场学生看到的全是Freq:0.0Hz, Mag:0.000排查3小时才发现是编译器配置问题。3.4 噪声基底抬升根源ADC采样时钟抖动导致频谱泄露加窗函数不是万能解药项目正文生成测试信号时加入rand()%100模拟噪声但真实场景中ADC时钟若由APB2分频产生如F407的ADCCLKAPB2/442MHz其Jitter会导致频谱泄露使21Hz峰旁出现虚假谐波。解决方案不是简单加汉宁窗会降低频率分辨率而是硬件层抑制在ADC_IN引脚串联100Ω电阻10nF电容RC滤波截止频率160kHzADC采样周期设为ADC_SAMPLETIME_480CYCLES最长采样时间提升信噪比关闭ADC扫描模式单通道连续采样避免多通道切换引入干扰。实测对比未加RC滤波时21Hz峰高485015Hz/25Hz假峰达1200加RC后假峰降至200以下21Hz峰升至4980——硬件滤波比软件窗函数更治本。4. 避坑FFT工程落地的五个高频翻车现场与血泪修复方案4.1 现象FFT后所有频点幅值为0串口无输出原因cr4_fft_1024_stm32.s库函数要求输入数组lBUFIN必须4字节对齐但定义为int32_t lBUFIN[1024];时GCC可能将其放在非对齐地址尤其当前面有奇数个char变量时。汇编代码中VLDMIA指令遇到非对齐地址触发BusFault。解决强制4字节对齐声明__attribute__((aligned(4))) int32_t lBUFIN[1024]; __attribute__((aligned(4))) int32_t lBUFOUT[1024]; __attribute__((aligned(4))) uint32_t lBUFMAG[1024];注意aligned(4)对int32_t是冗余的但对int16_t数组必须用aligned(2)此处统一用4更安全。4.2 现象21Hz峰出现在索引i212而非i210理论i21×1024/102.4210原因采样频率Fs102.4Hz是理论值实际由定时器TIMx触发ADC而TIMx的ARR寄存器只能设整数。若TIMx-ARR 1679假设PSC0CK_CNT168MHz则实际Fs168000000/(16791)100000Hz非102.4Hz。频率计算公式Fni*Fs/NPT中Fs失真导致索引偏移。解决用示波器测TIMx输出触发信号的实际周期反推真实Fs或改用DAC输出标准正弦波ADC采集用过零检测法校准Fs。4.3 现象FFT耗时测试显示9ms但实际系统卡顿LED闪烁异常原因cr4_fft_1024_stm32.s执行期间关闭全局中断CPSID I9ms内所有中断包括SysTick、UART接收被挂起。若UART接收缓冲区小9ms内收到2个字节就会溢出。解决将FFT放入DMA传输完成中断中执行避免阻塞主循环或启用ARM Cortex-M4的BASEPRI寄存器仅屏蔽低于某优先级的中断如__set_BASEPRI(0x60)保留SysTick和高优先级中断。4.4 现象lBUFMAG[0]直流分量数值巨大远超其他频点10倍以上原因ADC输入信号存在直流偏置如传感器输出0.5V~3.0V未做AC耦合或软件中心化。lBUFIN[i]中实部非零均值导致FFT后i0点能量爆炸。解决// 采样完成后先计算均值并减去 uint32_t sum 0; for(i0; iNPT; i) sum adc_buffer[i]; uint16_t mean sum / NPT; for(i0; iNPT; i) { s16 centered (s16)(adc_buffer[i] - mean); lBUFIN[i] ((u32)centered 16); }4.5 现象非官方FFTFFT2.c结果与官方库一致但耗时411ms无法实时原因FFT2.c使用纯C实现未利用M4的SIMD指令且蝶形运算中大量sin/cos查表数组访问慢最内层循环有分支预测失败。解决若必须用C实现改用arm_cfft_radix4_q15()CMSIS-DSP库耗时降至28ms或将sin/cos表改为const __attribute__((section(.fastmem))) float sin_table[1024];放入CCMRAMF407的64KB高速RAM访问速度提升3倍。5. 实时FFT的进阶技巧滑动窗口峰值保持阈值触发让21Hz检测真正可用5.1 滑动窗口FFT避免每1024点全量重算用乒乓缓冲区实现83%计算复用实时系统不能等凑够1024个ADC样本才启动FFT——那样会有10秒延迟1024/102.4Hz。正确做法是滑动窗口每新来1个样本丢弃最老1个样本更新1024点数组。但全量更新1024点仍耗时。优化方案是乒乓缓冲增量更新#define WINDOW_SIZE 1024 int32_t buffer_a[WINDOW_SIZE] __attribute__((aligned(4))); int32_t buffer_b[WINDOW_SIZE] __attribute__((aligned(4))); int32_t *current_buf buffer_a; int32_t *next_buf buffer_b; // DMA接收完成中断中 void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) { static uint16_t idx 0; // 将新样本插入next_buf末尾复制current_buf[0..1023]到next_buf[1..1024] memmove(next_buf, current_buf, (WINDOW_SIZE-1)*sizeof(int32_t)); next_buf[WINDOW_SIZE-1] ((int32_t)adc_value 16); // 切换缓冲区指针 int32_t *temp current_buf; current_buf next_buf; next_buf temp; // 启动FFT在非中断上下文如主循环中检查标志位 fft_ready_flag 1; }此方案每次仅移动1023个32位数约4KB耗时100μs比全量重采快100倍。实测在F407上每10ms更新一次窗口FFT仍能每秒执行100次。5.2 峰值保持与动态阈值从频谱图到可触发事件的最后一步FFT输出是瞬时频谱需转化为稳定事件。例如检测21Hz振动超标不能只看单次FFT中i210点是否4000要防噪声尖峰。采用三级过滤邻域峰值检测检查i208~212范围内是否为局部最大值时间域保持连续5次FFT中该邻域均出现峰值才确认存在动态阈值阈值噪声基底均值×3噪声基底取i0~50和i974~1023远离21Hz的频带的lBUFMAG[i]均值。// 计算噪声基底避开直流和目标频带 uint32_t noise_sum 0; for(i0; i50; i) noise_sum lBUFMAG[i]; for(i974; i1024; i) noise_sum lBUFMAG[i]; float noise_floor (float)noise_sum / 150.0f; float threshold noise_floor * 3.0f; // 检测21Hz邻域i208~212 uint8_t peak_found 0; for(i208; i212; i) { if(lBUFMAG[i] threshold lBUFMAG[i] lBUFMAG[i-1] lBUFMAG[i] lBUFMAG[i1]) { peak_found 1; break; } } if(peak_found) peak_counter; else peak_counter 0; if(peak_counter 5) { HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET); // 触发报警 }5.3 串口频谱可视化用ASCII字符画实时频谱替代上位机依赖不用额外装串口助手用纯ASCII实现简易频谱图void print_spectrum_ascii(void) { printf(\033[2J\033[H); // 清屏并回首页 printf(STM32 FFT Spectrum (Fs%dHz, N%d)\n, (int)Fs, NPT); printf(Freq(Hz): ); for(int i0; i50; i) { // 打印0~5Hz每0.1Hz一格 float freq i * 0.1f; printf(%4.1f , freq); } printf(\n); printf(Ampl: ); for(int i0; i50; i) { uint32_t mag lBUFMAG[i]; // i0~49对应0~4.9Hz int height (mag 5000) ? 20 : mag / 250; // 归一化到0~20 for(int j0; jheight; j) printf(█); printf( ); } printf(\n); }调用print_spectrum_ascii()每200ms刷新一次终端即显示滚动频谱条。实测在PuTTY中流畅运行成为调试阶段最快捷的验证手段。从那以后我每次做FFT项目都会在main()开头强制插入一段ADC自检代码用DAC输出1V直流1kHz正弦同时用ADC采集跑一遍FFT验证直流分量和1kHz峰是否在预期索引位置、幅值是否在理论误差范围内。这10行代码能提前暴露80%的硬件连接、时钟配置、库链接问题。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

2019 AI工程化实战地图:45个开源工具全链路落地指南

2019 AI工程化实战地图:45个开源工具全链路落地指南

1. 这不是一份“工具清单”,而是一张2019年AI工程化落地的实战地图2019年,AI从实验室真正迈入产线的关键分水岭。那一年,TensorFlow 2.0正式发布,Keras成为默认高阶API;PyTorch 1.0稳定版落地,动态图范式开…

2026/10/15 22:38:06 阅读更多 →
返利平台防刷单风控:基于Drools规则引擎的订单风险识别实践

返利平台防刷单风控:基于Drools规则引擎的订单风险识别实践

1. 返利业务先把钱算清楚,才知道刷单有多危险返利类软件最怕的不是用户不买,而是有人把返利当成一份稳定副业来批量做。我参与维护的返利平台,高峰时每天要处理几百万笔电商订单同步,其中有相当一部分订单是冲着返利来的。链路里如…

2026/10/15 22:38:06 阅读更多 →
EmbeddingGemma 2 多模态嵌入模型实战:构建离线图文混合 RAG 系统

EmbeddingGemma 2 多模态嵌入模型实战:构建离线图文混合 RAG 系统

前阵子接了个离线知识库的小项目,语料里既有产品说明书,又有一堆截图和参数表格。一开始我打算用常见的文本嵌入模型做向量化,结果检索效果一言难尽:图片里的信息完全进不去,凡是问到“图上标识的是什么”“表格里那个…

2026/10/15 22:37:04 阅读更多 →

最新新闻

NAT与动态路由深度联动:智能制造网络的自适应通信架构

NAT与动态路由深度联动:智能制造网络的自适应通信架构

1. 项目概述:这不是教科书里的概念堆砌,而是真实网络边界上每天都在发生的“交通调度”你有没有遇到过这样的场景:某实验室新部署了一套工业视觉检测系统,后端服务器在内网192.168.100.0/24网段,前端质检终端却分散在车…

2026/10/15 23:19:39 阅读更多 →
TensorFlow 生产级实践:从选型、训练到部署的完整链路

TensorFlow 生产级实践:从选型、训练到部署的完整链路

很多人一听到 TensorFlow 这个名字,第一反应就是"深度学习框架""神经网络""GPU 训练"这些大词。但真到自己上手做项目,从环境搭建到模型跑到线上,中间隔着的距离远比想象中要长。这篇内容我不打算做基础概念扫…

2026/10/15 23:19:39 阅读更多 →
PyTorch深度学习实战:动态图、张量与自动求导核心解析

PyTorch深度学习实战:动态图、张量与自动求导核心解析

1. 为什么“PyTorch”这三个字值得单独拎出来聊如果你在深度学习圈子里待过一阵子,大概率会发现一个现象:大家聊模型结构、聊训练技巧、聊部署方案的时候,绕来绕去最后总会落回到一个词上——PyTorch。它不是一个新东西,也不是什么…

2026/10/15 23:19:39 阅读更多 →
微信公众号抓取研究:用Xposed Hook从App内部获取数据

微信公众号抓取研究:用Xposed Hook从App内部获取数据

1. 从“想抓数据”到“动手Hook”:公众号抓取这条路怎么走干了几年移动端逆向和数据采集,坦白说,公众号内容抓取是一个一直有人问、一直有方案、但一直没被彻底讲透的话题。很多人一上来想的就是用Fiddler或Charles抓包,运气好能抓…

2026/10/15 23:19:39 阅读更多 →
AnyPS5折腾全记录:从局域网到公网的PS5串流方案详解

AnyPS5折腾全记录:从局域网到公网的PS5串流方案详解

我第一次听到“AnyPS5”这个名字,是在一个游戏玩家聚集的技术交流群里。当时有人发问:“有没有办法让PS5游戏不在客厅电视上也能玩?我想躺在床上用平板打。”紧接着另一个人甩了个链接,说这个方案基本能做到“任何设备&#xff0c…

2026/10/15 23:19:39 阅读更多 →
Python3.8官网文档之类的基础语法阅读

Python3.8官网文档之类的基础语法阅读

前言 标题里的「之类」表述比较含糊,本文把它读作:怎么读 Python 官方文档里的基础语法部分。这是一项比背语法更值的技能——语言在演进,教程会过期,但官方文档永远与解释器同步,而且它给出的是定义,不是某…

2026/10/15 23:18:39 阅读更多 →

日新闻

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/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

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

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

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

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

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

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 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/15 9:49:14 阅读更多 →