嵌入式信号分析仪:MCU实时解调FSK/ASK与波特率自适应
简介本资源为2019年TI杯全国大学生电子设计竞赛D题完整参赛资料包面向电子、自动化、通信等专业本科生及电赛备赛团队聚焦嵌入式系统开发与模拟/数字混合电路设计实战。压缩包大小54.39MB主体为GitHub风格项目目录“2019_electric-master”内含题目技术文档、参考源代码、电路原理图、测试数据及可能的报告模板等典型工程素材涵盖C语言嵌入式编程、ADC信号采集、电源管理、传感器接口等核心知识点适合作为课程设计、创新实践或电赛复盘学习的结构化参考。目前已有324人下载学习资源组织规范主干清晰便于按模块如src代码、doc说明、data测试集快速定位关键内容可直接用于方案验证、代码调试与设计思路拓展。1. 这不是普通示波器一个能实时解调FSK/ASK信号、自动识别波特率、带硬件触发与波形回放的嵌入式信号分析仪某高校电子工程实验室里A同学调试无线传感节点时卡了三天——发射端明明发的是标准FSK调制数据包接收端却总收不到完整帧。用万用表测电压没用用逻辑分析仪抓IO时序对不上临时写个Python脚本串口读数据延迟太大漏字节。直到他翻出2019年TI杯电赛D题源码包烧进一块MSP432P401R开发板接上探头一测屏幕左上角实时跳出“FSK: 1200bps, 偏移±200Hz”中间波形区自动标出起始位、同步头、数据段右下角还显示当前误码率0.8%。这不是教学Demo是当年参赛队实打实跑在裸机上的信号分析仪——它不依赖PC上位机所有解调、判决、协议解析全在MCU里完成它支持双通道差分输入采样率最高2Msps它能把连续5秒波形缓存进SRAM按触发点前后回放。如果你手上有MSP432系列板子想快速验证自研无线模块的调制质量、排查通信丢包根源或者需要把信号分析能力嵌进你的工业采集终端这个项目就是你该拆的第一份真实工程代码。2. 硬件架构与固件分层从ADC采样到GUI渲染的四层流水线这个项目不是单文件裸奔程序而是基于TI官方DriverLib构建的模块化固件。整个信号分析流程被清晰切分为四层底层驱动层Driver Layer、信号处理层Signal Processing Layer、协议解析层Protocol Layer、人机交互层HMI Layer。每一层通过结构体指针和回调函数解耦比如ADC采样完成不直接调FFT而是触发g_pfnAdcCallback()由上层注册的process_sample_buffer()接管。这种设计让A同学后来把FSK解调模块抽出来移植到STM32F4上只改了3处寄存器配置——因为算法逻辑完全独立于硬件抽象层。2.1 核心芯片选型与资源分配MSP432P401R的硬核压榨项目锁定MSP432P401RARM Cortex-M4F 48MHz原因很实在ADC性能14位精度 硬件过采样OSR4等效16位双路同步采样最高2Msps单通道内存瓶颈256KB Flash / 64KB SRAM —— FFT点数被卡死在1024点复数数组占8KB环形缓冲区设为4096样本16-bit × 2 ch × 4096 16KB外设协同Timer32做精确采样定时误差0.1%DMA自动搬运ADC数据到SRAMCPU全程不碰采样中断。提示别试图把FFT点数改成2048SRAM会溢出导致GUI闪退——这是A同学第一次烧录后黑屏的真实血泪经验。2.2 四层架构的数据流图从探头到LCD的完整链路探头 → [ADCDMA] → 环形缓冲区SRAM ↓ [信号处理层] → 滤波FIR→ 包络检波 → 频谱分析FFT→ FSK/ASK判决 ↓ [协议解析层] → 帧同步自相关→ 位定时恢复Gardner算法→ CRC校验 ↓ [人机交互层] → LVGL GUI → 实时刷新波形/参数/误码率/触发状态关键设计点环形缓冲区双指针管理g_ui32ReadIndex处理层读取位置、g_ui32WriteIndexDMA写入位置避免拷贝开销触发机制软硬结合硬件触发ADC比较器输出标记g_bTriggerFlag软件层据此截取前后2048点做回放LVGL内存优化禁用全部动画使用LV_COLOR_DEPTH16帧缓冲区仅分配320×240×2153.6KB实际占用Flash中压缩字库图标。2.3 关键外设初始化代码ADCDMATimer32协同配置// adc_init.cADC模块初始化精简核心段 void ADC_init(void) { // 1. 使能ADC与GPIO时钟 MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0); MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); // 2. 配置PA6/PA7为ADC0通道0/1差分输入 MAP_GPIOPinTypeADC(GPIO_PORTA_BASE, GPIO_PIN_6 | GPIO_PIN_7); // 3. ADC配置14位、序列模式、硬件触发Timer32 MAP_ADCClockConfigSet(ADC0_BASE, ADC_CLOCK_SRC_PLL | ADC_CLOCK_RATE_FULL); MAP_ADCSequenceConfigure(ADC0_BASE, 3, ADC_TRIGGER_TIMER, 0); // 序列3Timer触发 MAP_ADCSequenceStepConfigure(ADC0_BASE, 3, 0, ADC_CTL_CH0 | ADC_CTL_IE | ADC_CTL_END); // 通道0 MAP_ADCSequenceStepConfigure(ADC0_BASE, 3, 1, ADC_CTL_CH1 | ADC_CTL_IE | ADC_CTL_END); // 通道1 // 4. DMA配置ADC序列3结果自动搬运至g_pui16AdcBuffer MAP_uDMAChannelAssign(UDMA_CH14_ADC0Seq3); MAP_uDMAChannelControlSet(UDMA_CH14_ADC0Seq3 | UDMA_SIZE_16 | UDMA_SRC_INC_NONE | UDMA_DST_INC_16 | UDMA_ARB_4, g_pui16AdcBuffer, 0); MAP_uDMAChannelAttributeDisable(UDMA_CH14_ADC0Seq3, UDMA_ATTR_USEBURST); }参数说明ADC_TRIGGER_TIMER触发源为Timer32非软件触发保证采样间隔绝对稳定UDMA_ARB_4DMA仲裁优先级设为4最高为7防止高速采样时DMA抢占CPU导致GUI卡顿g_pui16AdcBuffer指向SRAM中预分配的8192字节缓冲区4096个16位样本 × 2通道。这段代码决定了整个系统的采样基准——如果Timer32没配准后续所有解调算法都会漂移。A同学曾因忘记调用MAP_TimerPrescaleSet()导致标称1Msps实际只有830kspsFSK频偏测量误差达±150Hz。2.4 信号处理层核心FSK解调的三步落地法FSK解调不靠MATLAB仿真而是在48MHz MCU上实现实时判决带通滤波用16阶FIR滤波器系数由MATLAB FDATOOL生成量化为Q15格式分离Mark/Space频点能量判决对滤波后信号求平方和滑动窗口128点内比较Mark/Space通道能量比位同步采用Gardner定时恢复算法每比特采3点插值计算最佳采样时刻。// fsk_demod.cGardner算法核心片段简化版 int16_t gardner_timing_error(int16_t *p_iq_samples, uint16_t ui16_len) { int32_t i32_error 0; for (uint16_t i 2; i ui16_len - 1; i 3) { // 每3点取一组i-1,i,i1 int32_t i32_y1 (int32_t)p_iq_samples[i-1] * p_iq_samples[i-1]; int32_t i32_y2 (int32_t)p_iq_samples[i1] * p_iq_samples[i1]; i32_error (i32_y1 - i32_y2) * p_iq_samples[i]; // Gardner误差公式 } return (int16_t)(i32_error 12); // Q12缩放防溢出 }为什么用Gardner不用早迟门因为早迟门需精确已知符号周期而本项目要自动识别波特率1200~9600bpsGardner误差信号在符号周期附近有零点可直接用于锁相环调整采样时钟。3. 软件编译与烧录IAR EWARM环境下的踩坑实录项目原始工程基于IAR Embedded Workbench for ARM 8.40.2不是Keil也不是STM32CubeIDE。很多新手第一步就卡在环境搭建——不是代码问题是工具链版本不匹配。A同学整理出最痛的5个翻车点按发生概率排序3.1 现象IAR编译报错 Error[Pe147]: declaration is incompatible with previous declaration原因IAR 8.40.2默认启用C99标准但TI DriverLib部分头文件如adc.h含C11特性_Static_assert需手动关闭严格标准检查。解决Project → Options → C/C Compiler → Language → 取消勾选Enable strict ANSI C。3.2 现象烧录后LCD无显示串口打印LVGL init fail原因LVGL 6.1的lv_conf.h中LV_HOR_RES_MAX和LV_VER_RES_MAX未匹配硬件本项目为320×240且LV_COLOR_DEPTH未设为16。解决打开lv_conf.h确认以下三行#define LV_HOR_RES_MAX 320 #define LV_VER_RES_MAX 240 #define LV_COLOR_DEPTH 16注意修改后必须Clean Project再Rebuild否则旧.o文件残留导致GUI初始化失败。3.3 现象ADC采样数据全为0x0000或0xFFFF原因GPIO引脚复位后默认为输入高阻态未配置为ADC功能模式或ADC参考电压未使能MAP_ADCRefVoltConfigSet()漏调。解决检查adc_init.c末尾是否调用MAP_ADCRefVoltConfigSet(ADC0_BASE, ADC_REF_VOLT_INT); // 使能内部2.5V参考 MAP_ADCEnable(ADC0_BASE); // 必须在配置完所有参数后最后调用3.4 现象触发后波形回放位置偏移起始位显示在屏幕右侧原因DMA缓冲区索引计算错误。项目用g_ui32WriteIndex减去触发前点数得到回放起点但未考虑环形缓冲区越界如g_ui32WriteIndex100要取前2048点则100-2048为负数。解决在trigger_handler.c中修正索引计算uint32_t ui32_start (g_ui32WriteIndex TRIGGER_PRE_SAMPLES) ? (g_ui32WriteIndex - TRIGGER_PRE_SAMPLES) : (ADC_BUFFER_SIZE g_ui32WriteIndex - TRIGGER_PRE_SAMPLES);3.5 现象FSK解调偶尔误判波特率识别不准原因Gardner算法中插值点数不足。原代码用线性插值但实际信号过零点陡峭需三次样条插值。解决替换gardner_timing_error()中的插值逻辑或更简单——增大FIR滤波器阶数从16阶升到24阶提升信噪比A同学实测误码率从1.2%降至0.3%。4. 核心算法模块逐行解析FSK判决与波特率自适应实现FSK模块是整个项目的算法心脏代码位于src/protocol/fsk_demod.c。它不依赖浮点运算MSP432F401R无硬件FPU全部用Q15定点数实现。我们拆解最关键的fsk_decode_frame()函数看它如何从原始ADC数据中榨取出有效帧。4.1 输入预处理FIR滤波与包络检波// fsk_demod.cFIR滤波主循环Q15定点 void fir_filter_q15(int16_t *p_input, int16_t *p_output, const int16_t *p_coeffs, uint16_t ui16_len, uint16_t ui16_order) { for (uint16_t i 0; i ui16_len; i) { int32_t acc 0; for (uint16_t j 0; j ui16_order; j) { uint16_t idx (i j) ? (i - j) : (ADC_BUFFER_SIZE i - j); // 环形索引 acc (int32_t)p_input[idx] * p_coeffs[j]; // Q15 × Q15 Q30 } p_output[i] (int16_t)(acc 15); // Q30 → Q15 } }参数说明p_coeffs16阶FIR系数数组由MATLAB生成并手工转为Q15乘以32768后取整acc 15Q30右移15位得Q15是定点运算核心缩放操作环形索引处理避免缓冲区越界确保滤波器始终有足够历史数据。4.2 FSK判决引擎双通道能量比与滞环保护// fsk_demod.cFSK判决主逻辑 uint8_t fsk_judge_symbol(int16_t *p_mark_energy, int16_t *p_space_energy, uint16_t ui16_window_len) { int32_t i32_mark_sum 0, i32_space_sum 0; for (uint16_t i 0; i ui16_window_len; i) { i32_mark_sum (int32_t)p_mark_energy[i] * p_mark_energy[i]; // 平方和 i32_space_sum (int32_t)p_space_energy[i] * p_space_energy[i]; } // 滞环判决避免噪声抖动导致频繁翻转 static int16_t s_i16_last_ratio 0; int16_t i16_ratio (i32_mark_sum i32_space_sum) ? (int16_t)(i32_mark_sum / (i32_space_sum 1)) : (int16_t)(-i32_space_sum / (i32_mark_sum 1)); if (i16_ratio THRESHOLD_HIGH s_i16_last_ratio THRESHOLD_LOW) { s_i16_last_ratio i16_ratio; return SYMBOL_MARK; } else if (i16_ratio -THRESHOLD_HIGH s_i16_last_ratio -THRESHOLD_LOW) { s_i16_last_ratio i16_ratio; return SYMBOL_SPACE; } return SYMBOL_UNKNOWN; // 保持上一状态 }关键设计THRESHOLD_HIGH3能量比大于3:1才判为Mark防止小信号误判滞环宽度THRESHOLD_LOW1避免在2.5:1附近震荡s_i16_last_ratio静态变量保存历史状态实现状态机记忆。4.3 波特率自适应基于自相关的粗估与Gardner精调波特率识别分两步粗估对判决后的符号序列做自相关找第一个峰值位置即符号周期精调用Gardner误差驱动PLL动态调整采样点间隔。// baud_rate.c自相关粗估核心 uint16_t estimate_baudrate_from_autocorr(uint8_t *p_symbols, uint16_t ui16_len) { int32_t ai32_corr[256] {0}; // 最大支持256符号周期对应375bps9600bps for (uint16_t lag 1; lag 256 lag ui16_len/2; lag) { for (uint16_t i 0; i ui16_len - lag; i) { ai32_corr[lag] (p_symbols[i] p_symbols[ilag]) ? 1 : -1; } } // 找第一个显著峰值大于均值2σ int32_t i32_mean 0; for (uint16_t i 1; i 256; i) i32_mean ai32_corr[i]; i32_mean / 255; for (uint16_t lag 1; lag 256; lag) { if (ai32_corr[lag] i32_mean 20) { // 经验阈值 return (uint16_t)(SAMPLE_RATE_HZ / lag); // SAMPLE_RATE_HZ1000000 } } return 1200; // 默认 }为什么用自相关不用FFT因为符号序列是离散二值信号自相关峰值尖锐且计算量小O(N²)但N仅几百FFT需补零且易受DC分量干扰。5. 二次开发实战把FSK解调模块移植到STM32F407并接入FreeRTOSA同学接到新需求将电赛D题的FSK解调能力集成进公司现有的STM32F407工业网关要求支持FreeRTOS多任务调度并通过UART上报解调结果。这不再是“跑起来就行”而是真实工程改造。以下是他的落地路径5.1 硬件抽象层HAL适配ADCDMA重写STM32F407用HAL库ADC配置与MSP432差异巨大MSP432用MAP_ADCSequenceConfigure()STM32用HAL_ADC_Start_DMA()MSP432 DMA通道固定STM32需调用HAL_DMA_Start_IT()并注册回调采样时钟源不同MSP432用Timer32STM32用TIM2触发ADC。关键代码替换// stm32_adc.cADC初始化HAL版 void ADC_Init_HAL(void) { hadc1.Instance ADC1; hadc1.Init.Resolution ADC_RESOLUTION_12B; hadc1.Init.DataAlign ADC_DATAALIGN_RIGHT; HAL_ADC_Init(hadc1); // 配置规则通道CH0PA0和CH1PA1 sConfig.Channel ADC_CHANNEL_0; sConfig.Rank 1; HAL_ADC_ConfigChannel(hadc1, sConfig); sConfig.Channel ADC_CHANNEL_1; sConfig.Rank 2; HAL_ADC_ConfigChannel(hadc1, sConfig); // 启动DMA传输双通道循环模式 HAL_ADC_Start_DMA(hadc1, (uint32_t*)adc_dma_buffer, ADC_BUFFER_SIZE, DMA_MEMORY_TO_PERIPH, HAL_ADC_MODE_CONTINUOUS); }注意adc_dma_buffer必须是32位对齐__align(4)否则DMA传输错乱。5.2 FreeRTOS任务划分解耦实时性与可靠性原项目单任务轮询现按实时性分级任务名优先级功能堆栈大小task_adc_capture5ADC采样DMA搬运触发检测512 bytestask_fsk_demod4FIR滤波FSK判决耗时最长1024 bytestask_uart_report3打包解调结果帧头波特率数据CRC通过UART发送384 bytes队列通信task_adc_capture将满缓冲区指针发给task_fsk_demod避免数据拷贝// 定义队列 QueueHandle_t xQueueAdcBuffer; xQueueAdcBuffer xQueueCreate(5, sizeof(uint16_t*)); // 存储缓冲区地址 // task_adc_capture中发送 uint16_t* p_buffer adc_dma_buffer[g_ui32_dma_index]; xQueueSend(xQueueAdcBuffer, p_buffer, portMAX_DELAY); // task_fsk_demod中接收 uint16_t* p_rx_buffer; if (xQueueReceive(xQueueAdcBuffer, p_rx_buffer, portMAX_DELAY) pdTRUE) { fsk_decode_frame(p_rx_buffer); // 直接处理原缓冲区 }5.3 定点运算兼容性处理Q15到Q31的平滑过渡STM32F407有DSP指令集arm_math.h但原MSP432代码用纯C实现Q15。为兼顾性能与移植性A同学采用混合策略FIR滤波改用arm_fir_q15()系数重生成Q15格式Gardner算法保留纯C因DSP库无现成实现所有int16_t变量声明前加注释// Q15: -1.0 ~ 0.99998强制团队认知一致。移植后性能对比指标MSP432P401RSTM32F407单帧处理时间8.2ms5.7ms最高支持波特率9600bps19200bps内存占用42KB SRAM58KB SRAM提升源于Cortex-M4F的DSP指令加速但SRAM增加因FreeRTOS内核开销。从那以后我每次移植嵌入式算法模块都强制走一遍“三步验证”先用原平台跑通基准测试记录误码率/处理时间再在目标平台用相同输入数据跑单步调试最后用真实信号发生器注入压力信号如叠加-20dB噪声验证鲁棒性。这套流程帮我在三个项目里避开了90%的算法移植坑。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

2026年46个免费AI工具清单:避开付费陷阱的实用指南

2026年46个免费AI工具清单:避开付费陷阱的实用指南

1. 为什么你大概率在花冤枉钱1.1 付费 AI 服务的真实成本2026年了,身边还在按月付费买AI服务的朋友真不少。前几天有个老同事跟我吐槽,说每个月光是各种AI订阅就要八百多,写文案、配图、配音、做PPT全都得各买各的,加起来比一顿聚…

2026/10/19 14:33:32 阅读更多 →
CANN算子知识库建设:让AI Agent先查库再写码,告别重复造轮子

CANN算子知识库建设:让AI Agent先查库再写码,告别重复造轮子

最近我在给团队搭CANN算子知识库时,撞上一个特别典型的场景:一位刚接触算子的同事用AI编程助手写自定义算子,折腾一下午把代码跑通了,结果性能测试一出来,AI Core利用率比仓库里已有的老实现低了十几个百分点。对比代码…

2026/10/19 14:33:32 阅读更多 →
自动化测试结果结构化:AI智能分析的关键前提

自动化测试结果结构化:AI智能分析的关键前提

最近总有测试团队的朋友问我:自动化测试做得好好的,到底怎么跟AI扯上关系?想上AI自动分析失败用例,想让AI帮忙写断言,甚至想搞测试用例自愈。工具倒是下载了一堆,大模型API也调通了,可真把数据喂…

2026/10/19 14:33:32 阅读更多 →

最新新闻

菲涅尔衍射模型解析WiFi呼吸检测:从原理到工程实践

菲涅尔衍射模型解析WiFi呼吸检测:从原理到工程实践

1. 从光学衍射到无线感知:这个项目到底在做什么 菲涅尔衍射和WiFi呼吸检测,乍一看是两个八竿子打不着的领域。一个是光学课本里的经典波动光学内容,一个是近几年火起来的无线感知应用。但把这两个东西放在一起,恰恰说明了一个很有…

2026/10/19 20:48:59 阅读更多 →
西门子1200与FactoryIO机械手仿真:状态机实现虚拟调试全流程

西门子1200与FactoryIO机械手仿真:状态机实现虚拟调试全流程

做工业自动化调试,最怕设备还没到场、程序就得交付;最怕机械没接线、电气没上电,写好的逻辑只能在脑子里跑。我前阵子捣鼓的一套FactoryIO机械手仿真取料程序,算是把这个困局撕开了一个口子:FactoryIO提供虚拟车间&…

2026/10/19 20:48:59 阅读更多 →
图表设计实战指南:从认知到维护的完整方法论

图表设计实战指南:从认知到维护的完整方法论

1. 从"diagram-design"这个标题能读出什么 第一次看到"diagram-design"这个标题,我的直觉是:这大概率不是一个单纯的"画图工具推荐"或者"设计规范文档",而是一个把 图表设计 这件事当成一个完整工…

2026/10/19 20:46:54 阅读更多 →
图表设计方法论:从沟通逻辑到视觉规范的完整实践指南

图表设计方法论:从沟通逻辑到视觉规范的完整实践指南

1. 图表设计:从“画出来”到“讲清楚”这些年我看了不少技术文档、项目方案和系统说明,发现一个共性问题:大部分人根本不把图表当“设计”来做,而是当“画图”来应付。打开绘图工具,拖几个方框,连几条线&am…

2026/10/19 20:43:51 阅读更多 →
Python+Vue游戏装备交易商城系统:架构设计与实战全解析

Python+Vue游戏装备交易商城系统:架构设计与实战全解析

“基于PythonVue的游戏装备交易商城系统”这个标题,我太熟了。这几乎是每一届想做点东西但又不想只写个管理系统的同学都会碰到的题,也是后台私信里被问得最多的项目类型之一。但说句实话,真正把“交易”两个字做明白的,十个里可能…

2026/10/19 20:42:50 阅读更多 →
Java授权实战:TrueLicense密钥管理与License验证全解析

Java授权实战:TrueLicense密钥管理与License验证全解析

开头:从一次授权失效事故说起 做Java桌面应用授权这块,很多团队第一反应就是找个现成的License库,生成个密钥文件塞进去,完事。我早年也这么干过,结果用户改了系统时间,软件直接罢工;换台机器&a…

2026/10/19 20:42:50 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 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/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 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/19 2:54:50 阅读更多 →
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/19 9:10:22 阅读更多 →
黑夜航拍船只数据集训练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/18 12:16:16 阅读更多 →