基于 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

相关新闻

【Spring Cloud Alibaba】Nacos(一)

【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/10/30 2:56:07 阅读更多 →
超越4位与5位!GLM-4.1V-9B-Thinking-8bit填补Apple Silicon多模态模型精度空白

超越4位与5位!GLM-4.1V-9B-Thinking-8bit填补Apple Silicon多模态模型精度空白

超越4位与5位!GLM-4.1V-9B-Thinking-8bit填补Apple Silicon多模态模型精度空白 【免费下载链接】GLM-4.1V-9B-Thinking-8bit 项目地址: https://ai.gitcode.com/hf_mirrors/mlx-community/GLM-4.1V-9B-Thinking-8bit GLM-4.1V-9B-Thinking-8bit是一款专为Ap…

2026/10/30 2:55:16 阅读更多 →
完整指南:使用npm-g_nosudo配置无sudo的Node.js开发环境

完整指南:使用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/29 9:52:34 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/10/30 0:01:36 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/10/29 8:45:01 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/10/29 9:52:56 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/10/30 0:01:37 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/10/29 9:51:34 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/10/29 8:44:28 阅读更多 →

日新闻

周新闻

月新闻

我发现了一个新思路:用 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/29 17:01:10 阅读更多 →
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/29 9:42:17 阅读更多 →
黑夜航拍船只数据集训练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/30 0:01:33 阅读更多 →