STM32F103驱动VL53L0X:IIC通信与测距避坑指南

简介:这份资源面向嵌入式开发初学者与需要快速落地测距功能的工程师,提供基于STM32F103微控制器驱动VL53L0X飞行时间测距传感器的完整IIC方案。内容围绕GPIO模拟IIC总线展开,涵盖总线初始化、数据收发与错误处理,并配套VL53L0X的API函数库,如初始化、启动测量与读取距离等接口,帮助读者理解传感器工作模式与参数配置。资源包共238个文件,以c源码、h头文件、o目标文件与d依赖文件为主,另含KEIL UV5工程文件、sct链接脚本、hex固件及map映射文件,压缩包约8.28MB,可直接编译运行。目前已有1724人学习下载。工程按Driver、Libraries、VL53L0X_API、Doc、User与Project等模块组织,读者可据此掌握从硬件接口、驱动编程到应用集成的全过程,并迁移至同类传感器平台。

1. 从一次“玄学读数”说起:这个 VL53L0X 驱动到底能干什么

如果你玩过 STM32 的 IIC 外设,大概率经历过这种场景:代码编译通过,逻辑看着没问题,但读出来的距离值要么是 0,要么是 8190 这种固定值,要么跳得离谱。我当初第一次把 VL53L0X 接到 STM32F103 上时就翻过车——明明接线没错,上电后串口打印的距离却像随机数。后来才发现,问题出在 VL53L0X 并不是一个“上电就能读寄存器”的普通 IIC 传感器,它内部有一套完整的初始化流程、校准步骤和状态机,必须按官方规定的顺序去配置,否则读到的就是黑匣子数据。

这份资源就是围绕“STM32F103 + VL53L0X + IIC 驱动”这条链路展开的。它解决的核心问题是:把 VL53L0X 从一块“不知道怎么下手”的 ToF 测距模块,变成能在 STM32F103 上稳定输出毫米级距离值的可用外设。适合正在做避障小车、液位检测、手势识别或者任何需要短距离测距的嵌入式开发者。代码基于标准库或 HAL 库的 IIC 通信,不依赖复杂中间件,拿到手就能往自己的工程里搬。

2. 硬件链路与通信协议:VL53L0X 为什么不能当普通 IIC 设备用

2.1 VL53L0X 的 IIC 地址与寄存器模型

VL53L0X 的默认 7 位 IIC 地址是0x29,这个地址在官方手册里写得很清楚。但很多人第一次用的时候会疑惑:为什么我读0x29的某个寄存器,返回的数据完全对不上?原因在于 VL53L0X 的寄存器是 16 位地址的,而 STM32 的 IIC 外设通常按 8 位寄存器地址去操作。也就是说,你不能直接调用HAL_I2C_Mem_Read(&hi2c1, 0x29<<1, reg, I2C_MEMADD_SIZE_8BIT, buf, len, timeout)就完事,必须把寄存器地址拆成高 8 位和低 8 位,分两次发送。

常见做法是封装一个VL53L0X_WriteReg和VL53L0X_ReadReg函数,内部用HAL_I2C_Mem_Write和HAL_I2C_Mem_Read,但MemAddress传 16 位,MemAddSize传I2C_MEMADD_SIZE_16BIT。这样 HAL 库会自动帮你把地址拆成两个字节发出去。如果你用的是软件模拟 IIC,那就得手动在发送完设备地址后,先发寄存器高字节,再发低字节,然后重新起始读数据。

// VL53L0X 寄存器读写封装(基于 HAL 库硬件 IIC) // 注意:VL53L0X 寄存器地址是 16 位的,必须用 I2C_MEMADD_SIZE_16BIT uint8_t VL53L0X_WriteReg(uint16_t reg, uint8_t *pData, uint16_t len) { return HAL_I2C_Mem_Write(&hi2c1, VL53L0X_I2C_ADDR, reg, I2C_MEMADD_SIZE_16BIT, pData, len, 100); } uint8_t VL53L0X_ReadReg(uint16_t reg, uint8_t *pData, uint16_t len) { return HAL_I2C_Mem_Read(&hi2c1, VL53L0X_I2C_ADDR, reg, I2C_MEMADD_SIZE_16BIT, pData, len, 100); }

这里VL53L0X_I2C_ADDR是0x29 << 1,即 8 位写地址。参数reg是 16 位寄存器地址,pData是数据缓冲区,len是读写长度。逻辑上就是把 16 位地址交给 HAL 库去拆解,避免手动拼字节时高低位搞反。如果你发现读出来的数据始终是 0xFF 或 0x00,先检查I2C_MEMADD_SIZE_16BIT有没有写错,这是最常见的翻车点。

2.2 上电初始化与“私有寄存器”访问

VL53L0X 上电后不能直接读距离,必须先加载一堆初始化配置。官方 API 里有一个VL53L0X_DataInit函数,里面包含大量对私有寄存器的写操作。这些私有寄存器地址不在公开手册里,而是通过一个叫VL53L0X_LoadTuningSettings的流程写入的。如果你只写了一个简单的 IIC 读写,然后直接去读0x1E结果寄存器,大概率读不到有效值。

我一般会先把官方提供的VL53L0X_DataInit和VL53L0X_StaticInit移植过来,这两个函数里包含了设备初始化的完整序列。移植时注意把底层的 IIC 读写替换成自己的VL53L0X_WriteReg和VL53L0X_ReadReg。初始化完成后,还需要调用VL53L0X_PerformRefCalibration做参考校准,否则测距精度会差很多。

// 初始化流程示例(简化版,实际需完整移植官方 API) VL53L0X_Error status; status = VL53L0X_DataInit(&vl53l0x_dev); // 加载默认配置 if (status != VL53L0X_ERROR_NONE) { /* 处理错误 */ } status = VL53L0X_StaticInit(&vl53l0x_dev); // 写入调优参数 if (status != VL53L0X_ERROR_NONE) { /* 处理错误 */ } status = VL53L0X_PerformRefCalibration(&vl53l0x_dev, &vhv, &phase_cal); if (status != VL53L0X_ERROR_NONE) { /* 处理错误 */ }

这段代码里vl53l0x_dev是一个设备结构体,保存了 IIC 地址、测量模式、超时时间等。vhv和phase_cal是校准输出的中间变量,不用关心具体值,但必须传进去。如果DataInit返回错误,优先查 IIC 通信是否正常,可以用读0xC0寄存器(设备 ID)来验证,正常应该返回0xEE。

2.3 测量模式与超时设置

VL53L0X 支持三种测量模式:单次测量、连续测量和定时测量。单次测量适合低功耗场景,每次读之前触发一次;连续测量适合实时性要求高的避障。模式选择通过VL53L0X_StartMeasurement和VL53L0X_GetMeasurementDataReady配合实现。

超时时间是个容易被忽略的参数。默认的VL53L0X_SetMeasurementTimingBudget设置的是 33ms,如果你在高速运动的场景下用,这个时间会导致响应滞后。我一般会根据实际需求调到 20ms 左右,但不能再低,否则精度会明显下降。调整时用VL53L0X_SetMeasurementTimingBudget(&vl53l0x_dev, 20000),单位是微秒。

// 设置为连续测量模式,并调整测量时间预算 VL53L0X_SetMeasurementTimingBudget(&vl53l0x_dev, 20000); // 20ms VL53L0X_StartMeasurement(&vl53l0x_dev); // 主循环中轮询数据就绪 while (1) { uint8_t ready = 0; VL53L0X_GetMeasurementDataReady(&vl53l0x_dev, &ready); if (ready) { VL53L0X_RangingMeasurementData_t data; VL53L0X_GetRangingMeasurementData(&vl53l0x_dev, &data); printf("Distance: %d mm\r\n", data.RangeMilliMeter); VL53L0X_ClearInterruptMask(&vl53l0x_dev, 0); } }

这里RangeMilliMeter就是最终的距离值,单位毫米。如果读出来是 8190,说明测量无效,通常是目标太远或反射率太低。ClearInterruptMask必须调用,否则下一次数据就绪标志不会更新。

3. 工程目录与核心模块拆解:从 IIC 底层到测距应用层

3.1 目录结构说明

这份资源的工程目录通常按分层思路组织,常见结构如下:

Project/ ├── Core/ │ ├── Inc/ │ │ ├── main.h │ │ ├── stm32f1xx_hal_conf.h │ │ └── vl53l0x.h // 传感器驱动头文件 │ └── Src/ │ ├── main.c // 主循环与初始化 │ ├── stm32f1xx_it.c │ └── vl53l0x.c // 驱动实现 ├── Drivers/ │ ├── STM32F1xx_HAL_Driver/ // HAL 库 │ └── CMSIS/ └── VL53L0X_API/ // 官方 API 移植层 ├── vl53l0x_api.c ├── vl53l0x_api_core.c └── vl53l0x_platform.c // 平台相关 IIC 读写

vl53l0x_platform.c是移植的关键,里面实现了VL53L0X_WriteReg、VL53L0X_ReadReg等底层函数。vl53l0x_api.c是官方算法层,一般不需要改动。main.c里负责初始化 IIC、调用传感器初始化、然后进入主循环读取距离。

3.2 IIC 底层驱动配置

STM32F103 的硬件 IIC 在标准库和 HAL 库下配置略有不同。以 HAL 库为例,CubeMX 里配置 IIC1 为 I2C 模式,速度设为 100kHz 或 400kHz。VL53L0X 支持 400kHz 快速模式,但如果你用的杜邦线较长,建议降到 100kHz 以提高稳定性。

// IIC 初始化(CubeMX 生成,关键参数说明) hi2c1.Instance = I2C1; hi2c1.Init.ClockSpeed = 100000; // 100kHz,长线时更稳 hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2; hi2c1.Init.OwnAddress1 = 0; hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; HAL_I2C_Init(&hi2c1);

ClockSpeed是 IIC 时钟频率,VL53L0X 手册标称最高 400kHz,但实际布线不好时 400kHz 容易丢数据。NoStretchMode建议保持关闭,因为 VL53L0X 在某些操作时会拉低 SCL 做时钟拉伸,如果禁止了会通信失败。

3.3 测距数据读取与滤波

原始距离值会有跳动,尤其是测量表面不平整或环境光变化时。我一般会在应用层加一个简单的滑动平均滤波,比如连续读 5 次,去掉最大最小值后取平均。这样既不会引入太大延迟,又能让读数稳定不少。

#define FILTER_SIZE 5 int filter_buf[FILTER_SIZE]; int filter_idx = 0; int filter_distance(int new_val) { filter_buf[filter_idx] = new_val; filter_idx = (filter_idx + 1) % FILTER_SIZE; int sum = 0, min = 99999, max = -1; for (int i = 0; i < FILTER_SIZE; i++) { sum += filter_buf[i]; if (filter_buf[i] < min) min = filter_buf[i]; if (filter_buf[i] > max) max = filter_buf[i]; } return (sum - min - max) / (FILTER_SIZE - 2); }

FILTER_SIZE决定平滑程度,5 是一个折中值。filter_idx是环形缓冲区索引。这个函数返回去掉极值后的平均值,能有效抑制偶发的跳变。注意如果new_val是 8190(无效值),最好直接丢弃,不要放进滤波器。

4. 避坑与常见问题:IIC 通信失败、读数异常怎么排查

4.1 读设备 ID 返回 0x00 或 0xFF

现象:上电后读0xC0寄存器,返回值不是0xEE。原因通常是 IIC 地址不对或硬件接线问题。VL53L0X 的 7 位地址是0x29,但 HAL 库函数需要传 8 位地址,即0x29 << 1 = 0x52。如果你传了0x29,HAL 会把它当成 7 位地址处理,实际发出去的就是0x29,设备不会响应。解决方法是确认VL53L0X_I2C_ADDR定义为0x52,同时用示波器或逻辑分析仪看 SDA/SCL 上有没有波形。

4.2 初始化卡在 DataInit 或 StaticInit

现象:程序运行到VL53L0X_DataInit就不返回,或者返回超时错误。原因可能是 IIC 时钟太快、上拉电阻太大、或者电源不稳。VL53L0X 的工作电流在测距时会瞬间增大,如果电源滤波不好,会导致电压跌落引起复位。解决方法是把 IIC 速度降到 100kHz,SDA/SCL 上拉电阻换成 4.7kΩ,并在传感器 VDD 引脚附近加一个 100nF 和 10uF 电容。

4.3 距离值始终为 8190

现象:初始化成功,但读出来的RangeMilliMeter一直是 8190。原因通常是测量超时或目标反射率太低。VL53L0X 的有效测距范围是 2cm 到 2m(取决于反射率),如果目标太远或太黑,就会返回无效值。解决方法是把目标放在 10cm 左右的白纸前测试,如果还是 8190,检查VL53L0X_SetMeasurementTimingBudget是否设置得太短,建议先设 33000(33ms)试一下。

4.4 连续测量模式下数据不更新

现象:调用VL53L0X_GetMeasurementDataReady始终返回 0。原因可能是中断标志没有清除,或者测量模式配置错误。每次读完数据后必须调用VL53L0X_ClearInterruptMask,否则就绪标志不会再次置位。另外确认VL53L0X_StartMeasurement是在StaticInit之后调用的,顺序错了也会导致不工作。

4.5 移植官方 API 时编译报错

现象:把官方 API 文件加入工程后,提示找不到VL53L0X_platform.h或类型定义冲突。原因是官方 API 依赖一个平台抽象层,需要自己实现VL53L0X_WriteReg、VL53L0X_ReadReg、VL53L0X_GetTickCount等函数。解决方法是参考vl53l0x_platform.c里的模板,把 IIC 读写替换成自己的 HAL 函数,GetTickCount可以用HAL_GetTick()实现。

5. 二次开发与改造:把测距驱动变成产品级模块

5.1 从阻塞式读取改为中断或 DMA 方式

当前工程里用的是轮询方式读距离,在主循环里不断查询数据就绪标志。这种方式简单,但会占用 CPU 时间。如果你要做多传感器融合或者低功耗应用,可以改成中断方式:把 VL53L0X 的 GPIO1 引脚接到 STM32 的外部中断,当数据就绪时触发中断,在中断服务函数里读取距离值。这样主循环可以去做其他事情,整体响应也更及时。

// 外部中断回调中读取距离 void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if (GPIO_Pin == VL53L0X_INT_PIN) { VL53L0X_RangingMeasurementData_t data; VL53L0X_GetRangingMeasurementData(&vl53l0x_dev, &data); if (data.RangeStatus == 0) { // 0 表示测量有效 last_distance = data.RangeMilliMeter; } VL53L0X_ClearInterruptMask(&vl53l0x_dev, 0); } }

RangeStatus是测量状态,0 表示有效,其他值对应不同错误类型。在中断里只做数据读取和标志清除,复杂处理放到主循环,避免中断时间过长。

5.2 多传感器共用 IIC 总线的地址冲突处理

如果你要接多个 VL53L0X,它们默认地址都是0x29,直接挂同一条 IIC 总线会冲突。解决办法是利用 VL53L0X 的 XSHUT 引脚:每个传感器单独接一个 GPIO,上电时先全部拉低,然后逐个拉高并修改地址。修改地址用VL53L0X_SetDeviceAddress函数,改完后新地址就生效了。

// 多传感器地址分配示例 void vl53l0x_set_address(uint8_t new_addr) { uint8_t buf = new_addr; VL53L0X_WriteReg(0x8A, &buf, 1); // 0x8A 是地址设置寄存器 } // 初始化时逐个使能并改地址 HAL_GPIO_WritePin(XSHUT1_GPIO_Port, XSHUT1_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(XSHUT2_GPIO_Port, XSHUT2_Pin, GPIO_PIN_RESET); HAL_Delay(10); HAL_GPIO_WritePin(XSHUT1_GPIO_Port, XSHUT1_Pin, GPIO_PIN_SET); HAL_Delay(10); vl53l0x_set_address(0x30); // 第一个改为 0x30 HAL_GPIO_WritePin(XSHUT2_GPIO_Port, XSHUT2_Pin, GPIO_PIN_SET); HAL_Delay(10); vl53l0x_set_address(0x31); // 第二个改为 0x31

注意改地址后,后续所有读写都要用新地址。0x8A寄存器是官方 API 里定义的地址设置寄存器,写入新地址后立即生效。

5.3 把驱动封装成独立模块

如果你想让这份代码更容易复用到其他项目,建议把 VL53L0X 相关文件单独放到一个文件夹,对外只暴露几个接口:VL53L0X_Init()、VL53L0X_GetDistance()、VL53L0X_SetMode()。这样换 MCU 平台时,只需要改vl53l0x_platform.c里的 IIC 读写,上层应用不用动。

我一般会在vl53l0x.h里定义好设备结构体和错误码,然后在vl53l0x.c里实现所有逻辑。对外接口用extern声明,内部函数用static修饰。这样编译出来的模块干净,不会和工程里其他文件产生符号冲突。

5.4 验证方法:用串口和逻辑分析仪交叉确认

改造完成后怎么验证?我的习惯是先用串口打印原始距离值和状态码,确认数据在合理范围内跳动。然后用逻辑分析仪抓 IIC 波形,看起始条件、地址字节、寄存器地址、数据字节是否和预期一致。如果串口有数据但逻辑分析仪上波形不对,说明是软件配置问题;如果波形正常但数据不对,可能是传感器本身或电源问题。

从那以后我每次移植新的 IIC 传感器,都强制走一遍“读设备 ID → 初始化 → 读原始数据 → 加滤波 → 验证波形”的流程,不再跳过任何一步。希望这份 VL53L0X 驱动解析能帮到你,少走一些我当年走过的弯路。

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

相关新闻

从零搭建企业知识库问答系统:RAG落地实践与避坑指南

从零搭建企业知识库问答系统:RAG落地实践与避坑指南

去年年中&#xff0c;我们部门接到一个挺有代表性的内部需求&#xff1a;把散落在几百份项目文档、运维手册和邮件群里的“公司经验”整合成一个企业知识库问答系统。当时领导的要求只有一句话&#xff1a;“同事们别老在群里翻聊天记录找答案了&#xff0c;做一个能直接问答的…

2026/10/19 16:58:07 阅读更多 →
AI辅助开题报告写作:科研效率革命与内容智能升级实战

AI辅助开题报告写作:科研效率革命与内容智能升级实战

深夜改开题报告这种事&#xff0c;干过学术的人基本都经历过。文献读了一堆&#xff0c;方向也大致清楚&#xff0c;可真要坐到电脑前把“研究背景”“研究意义”“文献综述”这几个字后面填上内容的时候&#xff0c;脑子里就只剩一片空白。尤其是导师在批注里写一句“研究意义…

2026/10/19 16:58:07 阅读更多 →
Stomp通过WSS连接WebSocket的全链路实践指南

Stomp通过WSS连接WebSocket的全链路实践指南

1. 项目概述&#xff1a;为什么非得用 wss 连 Stomp&#xff1f;这不只是加个 s 的事Stomp 以 wss 方式连接 WebSocket&#xff0c;这个标题看似只是协议前缀的微小变更——从ws://换成wss://&#xff0c;但背后牵动的是整个通信链路的安全基线、部署架构的合规逻辑&#xff0c…

2026/10/19 16:58:07 阅读更多 →

最新新闻

YOLO26轻量化优化:DualConv双卷积替换主干,mAP涨1.3且参数降27%

YOLO26轻量化优化:DualConv双卷积替换主干,mAP涨1.3且参数降27%

跑完新一轮YOLO26优化实验&#xff0c;我先把结论扔到前面&#xff1a;用轻量化双卷积DualConv替换掉主干网络里一部分标准卷积之后&#xff0c;模型mAP50-95涨了1.3个点&#xff0c;同时参数量从12.9M掉到9.4M&#xff0c;计算量从18.7G降到12.3G。这不是靠蒸馏&#xff0c;也…

2026/10/19 17:39:45 阅读更多 →
开源代码评审工作流:协议驱动的可审计人机协同范式

开源代码评审工作流:协议驱动的可审计人机协同范式

1. 项目概述&#xff1a;这不是一个工具&#xff0c;而是一套可落地的开源代码评审工作流“open-code-review”这个名称乍看像某个具体软件或CLI命令&#xff0c;但实际它代表的是一种正在快速演化的工程实践范式——把传统依赖人工、会议、PR评论的代码评审&#xff08;Code R…

2026/10/19 17:39:45 阅读更多 →
开源CLI代码评审系统:基于LLM Agent的自动化Code Review实践

开源CLI代码评审系统:基于LLM Agent的自动化Code Review实践

1. 这不是又一个“AI写代码”工具&#xff0c;而是一套可嵌入开发流程的开源代码评审系统最近在几个技术团队内部做工具链调研时&#xff0c;发现一个有意思的现象&#xff1a;大家嘴上说着“用AI做code review”&#xff0c;但实际落地时&#xff0c;90%的人还在把diff粘贴进C…

2026/10/19 17:39:45 阅读更多 →
两相流THM热流固耦合建模:COMSOL收敛与求解器配置指南

两相流THM热流固耦合建模:COMSOL收敛与求解器配置指南

简介&#xff1a;基于COMSOL构建的两相流THM热流固耦合模型&#xff0c;面向石油工程、地热开发及二氧化碳地质封存等复杂多物理场耦合问题&#xff0c;适合从事渗流力学与岩土工程仿真的科研人员、工程师与研究生。模型以饱和水和油两相流动为核心&#xff0c;支持温度场—渗流…

2026/10/19 17:39:45 阅读更多 →
基于SpringBoot+Vue的校园管理系统毕业设计实战拆解

基于SpringBoot+Vue的校园管理系统毕业设计实战拆解

毕业设计想选校园管理系统、又不想纯手工从零搓代码的同学&#xff0c;我建议直接找一个 SpringBoot Vue 的前后端分离项目来二次开发&#xff0c;这是目前最稳妥、也最适合拿高分的路子。这套技术栈基本是 Java Web 方向毕设的标配&#xff0c;覆盖了后端接口开发、前端页面交…

2026/10/19 17:39:45 阅读更多 →
RGAT+GRU融合模型解决APT溯源图稀疏漏报问题

RGAT+GRU融合模型解决APT溯源图稀疏漏报问题

简介&#xff1a;本资源是华中科技大学2023届计算机相关专业&#xff08;如计科、人工智能、网络安全等&#xff09;优秀毕业设计成果&#xff0c;聚焦APT攻击检测这一前沿安全问题&#xff0c;提出并实现了一种基于溯源图建模与RGATGRU融合架构的检测方法优化方案。面向在校本…

2026/10/19 17:38:44 阅读更多 →

日新闻

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

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

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

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

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

周新闻

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

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

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

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

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

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

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

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

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在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 阅读更多 →