基于 RA8P1 的声音分类推理工程

发布时间:2026/10/5 16:14:24

基于 RA8P1 的声音分类推理工程 关于公开内容的重要说明本作品将于 8 月 20 日参加全国大学生电子设计竞赛信息科技前沿专题赛现场评审。为保护作品核心成果不泄漏烧录进 Flash 中的二进制文件暂不公开本文仅作原理与工程方法交流。声音分类模型目前只分辨狗叫、猫叫、鸟叫三种声音其它声音类型的判别方式暂时不公开敬请理解。本文记录声音分类推理工程的完整技术路线模型如何从 tflite 转换到可编译的 C 代码、转换产物怎么用、模型怎么烧录、板端推理链路与 UI 如何实现。整套推理完全在板端完成不依赖上位机与网络。一、模型转换从 tflite 到 C 代码模型先以 TensorFlow Lite 格式int8 量化训练导出。RA8P1 的 Ethos-U55 NPU 不能直接执行 tflite需要先用瑞萨的RHUMI 套件Renesas Heterogeneous Unified Model Interface做一次转换把 tflite 变成可以直接编译进工程的 C 源码。RHUMI 会自动分析模型图按算子类型把网络拆成两部分能上 NPU 的算子卷积、全连接等→ 编译成 Ethos-U55 专用命令流运行时由 NPU 硬件执行不能上 NPU 的算子量化、反量化等预处理/后处理→ 保留为 CPU 代码由 TFLite-Micro 内核执行。转换输出位于converted/build/MCU/compilation/src/另外按子图分目录sub_0000__CPU_C_CODEGEN # CPU 子图模型输入侧 sub_0001__ARM_ETHOS_U55_C_CODEGEN # NPU 子图模型主体 sub_0002__CPU_C_CODEGEN # CPU 子图模型输出侧二、转换产物说明整张模型的推理被串成三个子图CPU 量化 → NPU 主体推理 → CPU 反量化。src/目录下的文件按职责分组1. 统一入口直接使用不需要改文件作用model.c / model.h把三个子图串成一次RunModel()调用并暴露输入/输出缓冲指针hal_entry.cRHUMI 附带的示例入口演示特征提取与调用模型的完整流程可作为移植参考2. NPU 子图sub_0001由 Vela 编译器生成文件作用sub_0001_model_data.c / .h模型权重数据约 6 MB 二进制的 C 数组展开体积最大的文件sub_0001_command_stream.c / .hNPU 命令流即 Ethos-U55 要执行的指令序列sub_0001_invoke.c / .hNPU 调用封装把权重、工作区arena和各张量内存地址打包成base_addrs[]调用 Ethos-U 驱动ethosu_invoke_v3()执行sub_0001_tensors.c / .h、sub_0001_io_data.c / .h张量信息表与 IO 缓冲区地址偏移并定义 NPU 工作区大小491,520 字节 ≈ 480 KB arena3. CPU 子图文件作用compute_sub_0000.c / .h、compute_sub_0002.c / .h量化/反量化等 CPU 算子的实现kernel_library_int.c / .h、kernel_library_utils.c / .hTFLite-Micro 内核库CPU 算子的运行时依赖ethosu_common.h张量描述结构TensorInfo定义三、接口与调用方式三个统一接口就够用了float*GetModelInputPtr_serving_default_input_1_0();/* 输入指针96×64 的 mel 特征缓冲 */voidRunModel(bool clean_outputs);/* 执行一次推理 */float*GetModelOutputPtr_StatefulPartitionedCall_1_0_70040();/* 输出指针各类别置信度 */RunModel()内部依次执行三个子图compute_sub_0000(compute_arena_sub_0000,input,quantized);/* CPUfloat 特征 → int8 */memcpy(npu_arenaoffset,quantized,6144);/* 把量化数据送入 NPU 输入区 */sub_0001_invoke(clean_outputs);/* NPU执行命令流 */compute_sub_0002(compute_arena_sub_0002,npu_out,output);/* CPUint8 → float 置信度 */应用层的用法就是填特征 → 跑一次 → 读置信度三步float*inputGetModelInputPtr_serving_default_input_1_0();memcpy(input,mel_patch,96*64*sizeof(float));/* 填一帧特征 */RunModel(false);/* 推理 */float*outGetModelOutputPtr_StatefulPartitionedCall_1_0_70040();/* 对 out 取最大值下标即类别值即置信度 */四、模型如何烧录与内存布局转换产物里有两个大块存放位置不同1. 模型权重约 6 MB——烧入 OSPI Flash 专用槽默认编译方式会把权重数组直接编进固件固件体积会撑到 6 MB 以上不可接受。本工程的做法先把sub_0001_model_data.c里的权重数组提取为二进制文件MODEL_AUDIO.BIN约 6 MB烧录时写入 OSPI Flash 的专用8 MiB 槽位地址0x80800000推理前做CRC 校验工程源码里把权重数组替换为一个指针常量让 NPU 直接从 OSPI 的 memory-mapped 窗口读取不占 SDRAM、不占固件空间constuint8_t*constsub_0001_model_data(constuint8_t*)0x80800000UL;模型更新走板载串口XMODEM-CRC 上传命令2 Mbps下载前自动停止推理会话上传后校验匹配再允许恢复推理。2. NPU 工作区 arena约 480 KB——必须放非缓存 SDRAMarena 是 NPU 推理时的可写工作区由 NPU 的 DMA 直接读写。放普通可缓存 RAM 时CPU 会从 D-Cache 读到陈旧数据导致结果错误。工程里把生成代码的 arena 定义加一段属性/* 转换产物原样 */__attribute__((aligned(16)))uint8_tsub_0001_arena[491520];/* 工程版放入非缓存 SDRAM 段 */__attribute__((section(.sdram_nocache),aligned(16)))uint8_tsub_0001_arena[491520];输入/输出缓冲float 特征与 float 置信度无 DMA 参与放普通内存即可。五、本工程的声音推理推理链路采集链路麦克风信号经 WM8960 编解码器以 48.828 kHz 立体声采集由 DMA 写入双缓冲再经重采样器转成 16 kHz 单声道供后续分析与识别共用。分段处理推理会话按5 秒一段切分。每段数据直接写入片内内存 PCM 缓冲约 160 KB位于 SDRAM段满即送推理——全程不写 SD 卡无卡也能运行。特征提取对每一段音频计算 mel 频谱图96×64 特征图作为模型输入。分段表决为提高鲁棒性每一段会切分为若干短片段分别推理再对结果做多数表决表决结果作为该段的最终类别段置信度取胜出类在判定为自身的短片段上的平均置信度。表决机制能显著降低单点误判带来的抖动。实时展示识别结果按狗叫 / 猫叫 / 鸟叫展示屏幕同时给出置信度百分比、已分析段数与失败段数每 5 秒刷新一次。六、UI单页推理界面界面保持单页、无跳转原则开机直接进入推理页左侧两个按钮START开始推理、STOP停止推理运行中再次触发无效会话防重入门控按钮置灰显示。右侧实时结果卡当前轮计时秒数、当前分类与置信度、已分析/失败段数。停止后计时定格显示本轮汇总总时长 HH:MM:SS、各段统计结果只保留在内存不写入 SD、不保存历史可立即开始下一轮。界面文案全部使用 ASCII 字符集配套字库裁剪为 ASCII 子集字库生成脚本自动完成。七、内存与缓存约定板级验证数据位置约束录音采集双缓冲内部 SRAM 的.ram_noinit_nocache段32 字节对齐I2S DMA 写、CPU 读必须绕过 D-Cache推理段 PCM 缓冲SDRAM 的.sdram_noinit段CPU 写 / CPU 读同线程推理无 DMANPU 工作区 arenaSDRAM 的.sdram_nocache段约 480 KBNPU 运行期读写不得放入 OSPI模型权重OSPI Flash memory-mapped0x80800000槽推理前 CRC 校验直接读取FAT 缓存缓冲内部 SRAM 的.ram_noinit_nocache段32 字节对齐SDHI DMAC 直接写入避免 CPU 读到陈旧缓存行八、工程代码结构与声音分类相关部分文件职责src/player_Thread_entry.c音频线程录音主循环、DSP、段 PCM 累积src/middleware/audio/audio_cmd_handler.c音频命令、5 秒段循环、推理会话状态机src/application/audio/model/audio_model_infer.cmel 特征提取与 Ethos-U 推理入口src/application/audio/model/ethosu_freertos.cNPU 互斥/信号量 FreeRTOS 钩子src/application/audio/model/ai_model_slot.c / ai_model_upload.cOSPI 模型槽校验与 XMODEM 上传src/application/audio/model/generated/Vela 编译器生成的 NPU 命令流不含权重数据src/application/core/app_bridge.c线程间命令/消息桥与推理会话门控src/application/ui/ui_manager.c、ui_page_infer.c单页推理 UI篇幅所限模型训练、量化与 Vela 编译流程未展开感兴趣的队伍欢迎交流。通过网盘分享的文件音频模型.zip链接: https://pan.baidu.com/s/1Wno2164rDZrxV4Ddf8Isng?pwdsiwq 提取码: siwq
延伸阅读

更多相关文章

2026/10/5 11:48:04

【Spring Cloud Alibaba】Nacos(一)

【Spring Cloud Alibaba】Nacos0. Spring Cloud Alibaba 组件1. 什么是Nacos,它都能干什么?1.1 注册中心演变及其思想1.2 Nacos Discovery1.3 远程调用流程图1.4 一个微服务的流程1.4 常用注册中心对比2. Nacos Server部署3. Nacos Client搭建4. Nacos管…

2026/9/27 16:15:22

完整指南:使用npm-g_nosudo配置无sudo的Node.js开发环境

完整指南:使用npm-g_nosudo配置无sudo的Node.js开发环境 【免费下载链接】npm-g_nosudo A shell script which will fix the problem where you want to stop using sudo for npm -g on Ubuntu. 项目地址: https://gitcode.com/gh_mirrors/np/npm-g_nosudo n…

2026/10/5 16:12:56

医疗AI创业之手术设备智能化:从智能等离子刀到全程管理

1. 一个50岁程序员的医疗AI二次创业,到底在创什么 先说说这个标题的误会。很多人看到“50岁程序员”和“医疗AI”,第一反应是“老程序员追风口”。这太表面了。我今年50岁,做了二十多年医疗器械软件,三年前从上一家公司出来&#…

2026/10/5 16:12:56

DeepSeek Harness桌面端全攻略:从安装配置到插件Skill内网部署

1. 桌面端来了,为什么这件事比想象中重要DeepSeek Harness 这个工具,最早是在命令行里用的。我自己从它刚出来那会儿就在跟,一开始只有 CLI 版本,所有操作都得在终端里敲命令,配置全靠手写 JSON 或者 YAML 文件。对于天…

2026/10/5 16:12:56

Petalinux中单独编译设备树:原理、方法与避坑指南

做嵌入式Linux的兄弟,应该都有过这种经历:Petalinux工程里改了一行设备树,比如给某个SPI设备换个片选脚、把某路UART的时钟频率调整一下,然后顺手跑一遍petalinux-build,结果一等等了大半天,最后发现就生成…

2026/10/5 16:12:56

Codex智能体自动化实战:从安装配置到多场景应用与安全审计

1. 从“超级个体”说起:为什么我押注 Codex 智能体自动化 “超级个体”这个词这两年很火,但真正落到实操层面,能跑通的人并不多。我自己的理解是:一个人能不能顶一个团队,关键不在于他会不会用某个工具,而在…

2026/10/5 16:07:56

PLC四点多点同步顶升系统:高精度液压协同控制实战解析

1. 项目概述:这不是“抬东西”,而是一场毫米级的工业协同作战你见过几十吨重的桥梁节段,在空中稳如磐石地平移30米吗?你见过老旧厂房的整栋钢架结构,在不拆不卸的前提下,被整体抬升1.2米后精准落回新基础吗…

2026/10/5 6:32:56

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起:为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高,很多人第一次听到会以为是某个新模型的名字,其实它更像是一种思路——把Jev模型的能力当作底座,通过Agent的方式去接管浏览器&#xf…

2026/10/4 0:01:02

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同":多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西,大概率会有一种感觉:单个 Agent 能做的事情,其实很快就摸到天花板了。你给它一个提示词,挂几个工…

2026/10/4 1:01:05

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑