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

📅 2026/8/14 20:17:50
基于 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