2026 ADI CodeFusion 竞赛 - 基于MAX32655-FTHR实现离线中文关键词识别
该项目使用了MAX32655-FTHR,实现了离线中文关键词唤醒与命令词识别的设计,它的主要功能为:识别4个预设中文关键词,给出对应的声光反馈。
标签
嵌入式系统
语音识别
MAX32655
CodeFusion Studio
fyjh2023
更新2026-09-29
8

2026 ADI CodeFusion 竞赛 —— 基于 MAX32655-FTHR 实现离线中文关键词唤醒与命令词识别



1 所选任务

赛道一(边缘计算),【入门级题目2:关键词唤醒与命令词识别】


任务要求使用板载音频输入实现 3~5 个预设关键词的离线识别,识别响应延迟 500ms 以内,并根据识别结果控制 LED 等外设。本项目完成情况对照如下:

任务要求

完成情况

3~5 个预设关键词

4 个中文命令词:开机、关机、增加、减少

板载音频输入离线识别

板载数字麦克风 → MAX9867 → I2S 采集,端侧 int8 神经网络推理,全程无网络、无上位机依赖

识别响应延迟 ≤ 500ms

推理节拍 40ms + 4 帧概率平滑(约 160ms),命令延迟约 200ms 量级

控制外设动作

识别成功后:RGB LED / 外接指示灯按命令词以对应颜色/闪烁模式指示;从 microSD 播放对应 WAV 语音回应;系统待命/反馈状态由 MAX20303 PMIC 的绿色 LED 指示

指定开发调试工具

固件工程基于 CodeFusion Studio 2.2.1(MSDK + arm-none-eabi-gcc)开发、编译、烧录与调试

2 项目描述

2.1 系统概述

本项目在 MAX32655FTHR 开发板上实现了一个离线中文命令词识别与反馈系统:设备待命时持续监听板载麦克风输入,用户说出"开机 / 关机 / 增加 / 减少"四个命令词之一后,开发板在数百毫秒内完成识别,并通过 LED 与语音播放做出回应。整个链路包括数据采集、模型训练量化、嵌入式部署三部分,全部自主开发:

  1. 数据采集:先用开发板自制录音采集固件(附录A),采集 298 条中文命令词录音,存入 microSD 卡;
  2. 模型训练与量化:在电脑端用 PyTorch 完成轻量级 DS-CNN(深度可分离卷积网络)训练,经量化感知训练(QAT)转为 int8,并自动生成 CMSIS-NN C 源码(模型权重、前端查找表、量化参数),提供各步骤的操作指令(附录B);
  3. 嵌入式部署:在 CodeFusion Studio 中开发 MAX32655 固件,通过 I2S + DMA 实时采集音频,CMSIS-DSP 计算 Log-Mel 特征,CMSIS-NN 完成 int8 推理,判决后驱动指示灯、microSD WAV 播放与 UART 上报。
由于数据集协议原因,完整音频数据集不公开。如有需要,请使用录音采集固件,自行构建数据集。

2.2 交互效果

  • 待命状态:MAX20303 PMIC 绿色 LED 常亮,表示系统正在监听,可以处理语音指令;
  • 识别到命令词:绿色待命 LED 熄灭,开发板上的 RGB LED 按命令词以对应颜色闪烁(开机=绿色常亮 1s;关机=红色闪烁;增加=青色快闪;减少=品红闪烁),开发板外接的指示灯同步闪烁(开机=灯泡点亮,增加=红色 LED 闪烁,减少=蓝色 LED 闪烁,关机=灯泡熄灭),同时通过 I2S 播放 microSD 中对应的 WAV 回应语音(已经启动/已经增加/已经减少/已经关闭);
  • 回应结束:自动清空音频缓冲、重置识别状态,重新启动采集并点亮待命 LED,回到监听状态;

image.png

2.3 关键指标

指标

数值

命令词数量

4(开机/关机/增加/减少)+ 2 个拒识类(静音/未知)

int8 模型验证集准确率

98.61%(macro F1 98.81%)

float32 模型验证集准确率

97.22%(macro F1 96.59%)

模型参数量

约3.7K

推理节拍 / 上下文窗口

40ms 一次推理 / 80 帧 ≈ 1.6s 滚动窗口

识别响应延迟

约 200ms 量级(40ms 节拍 + 160ms 平滑窗)

反馈种类

2种(声音、灯光)

3 硬件介绍

本项目使用 MAX32655-FTHR 评估板,未设计自定义 PCB。主控 MAX32655:Arm Cortex-M4F 内核,主频 100MHz(带 FPU 与 DSP 指令),512KB flash、128KB SRAM,集成 BLE 5.2 无线电(含 RISC-V 协处理器)。本项目仅使用 ARM MCU 部分,算力与存储均满足需求。


板载资源(本项目用到部分):

功能

板上器件 / MCU 外设

关键配置

声音采集

板载数字麦克风 + MAX9867 音频编解码器

I2C 地址 0x18 配置;MCLK 12.288MHz;采样率 16kHz;数字麦克风右通道输入;ADC 增益 +3dB

音频数据传输

MAX32655 I2S + DMA

单声道右通道、16bit;RX 采用 ping-pong 双缓冲(2×640 样本,每块 40ms);TX 用于 WAV 播放

命令指示

板载 RGB LED(P0.18 红 / P0.19 绿 / P0.26 蓝)

低电平点亮,GPIO 直接驱动

待命指示

MAX20303 PMIC 绿色 LED

经 I2C 控制,监听时常亮、反馈时熄灭

语音回应播放

microSD 卡座(SPI:CS=G9、MISO=G7、MOSI=G8、SCK=H9)+ FatFs 库函数

SD卡的根目录存放 OPEN/CLOSE/INCR/DECR 四个 WAV 文件

神经网络算力

CMSIS-NN 7.0.0 + CMSIS-DSP 库,无NPU

int8 卷积/全连接算子与 512 点 RFFT

调试接口

板载 DAPLink + UART0

UART0 115200-8-N-1 输出识别日志

外接器件:

GPIO引脚

外接器件

具体含义

P1.6

5V 灯泡,由 9018 三极管驱动

开机指示灯(点亮=开机,熄灭=关机)

P1.7

红色 LED

“增加”指示灯(闪烁=增加)

P1.8

蓝色 LED

“减少”指示灯(闪烁=减少)

4 方案框图与设计思路

4.1 系统方案框图

4.2 端到端机器学习流水线

训练与部署工具链按"采集 → 训练 → 量化 → 校准 → 验证 → 导出 → 部署"组织,每一步均有独立脚本与产物,保证流程可复现:


4.3 关键设计决策

  1. Tiny DS-CNN 网络结构:输入 80 帧 × 32 频带 Log-Mel 谱,主干为 1 个 3×3 步长 2 的 stem 卷积 + 4 组 depthwise/pointwise 深度可分离卷积块(通道 8→16→24→32→32),全局平均池化后接 6 类全连接分类器。深度可分离卷积大幅降低计算量,全模型参数量约 3.7K ,int8 权重约 3.3KB,适配 MAX32655 的 512KB flash 与 128KB SRAM。

层

类型

核/步长

输出形状

输入

—

—

1×80×32

stem

卷积

3×3 / 2×2

8×40×16

block1

DW+PW

3×3, 1×1

16×40×16

block2

DW+PW

3×3(2×2), 1×1

24×20×8

block3

DW+PW

3×3(2×1), 1×1

32×10×8

block4

DW+PW

3×3, 1×1

32×10×8

分类头

GAP + FC

—

6

  1. Log-Mel 前端,训练端与部署端严格一致:帧长 25ms(400 样本)、帧移 20ms(320 样本)、512 点 FFT、32 个 Mel 频带(80~7600Hz)、80 帧上下文(约 1.6s)。训练侧(Python)与固件侧(C,CMSIS-DSP arm_rfft_fast_f32)使用同一套由 Python 导出的查找表(Hann 窗、Mel 滤波器组、特征均值/方差、输入量化参数),从源头上消除两端口径差异;特征最终量化为 int8。
  2. 实时推理节拍:音频以 640 样本(40ms)DMA 块到达,每块最多产生 2 个新帧并写入 80 帧滚动历史;每 40ms 截取当前上下文做一次 int8 推理。启动约 1.6s 填满上下文后进入稳态,音频不丢块(ping-pong 双缓冲 + 超块计数监测)。
  3. 低误触发的判决链:softmax 概率 → 4 帧滑动平均(约 160ms)→ 命令类需超过逐类独立阈值(由校准脚本在验证集上自动确定)→ 与次优类的 margin ≥ 0.4 → 距上次接受 ≥ 500ms(不应期)。SILENCE/UNKNOWN 作为显式拒识类参与训练,非命令词语音会被主动拒绝而非强行归类。
  4. QAT 量化而非训练后量化:权重采用逐通道对称 int8、激活采用逐张量 int8、偏置 int32,BatchNorm 在导出前折叠进卷积。量化感知微调 30 轮后,int8 模型验证准确率 98.61%。

5 软件流程图、调试软件与关键代码

5.1 固件主流程

固件采用"DMA 中断 + 主循环"架构,无 RTOS。系统主频 100MHz,音频处理、推理、反馈全部在主循环中完成:

延迟预算分析:命令发音结束后,最迟 40ms(一个推理节拍)内概率开始上升,4 帧平滑窗约 160ms 完成确认,单帧推理与判决开销远小于一个音频块周期(固件内置超时监测,单块处理超过 40ms 会通过 UART 告警)。因此从发音结束到 LED/语音动作的延迟约 200ms 量级,满足题目 ≤500ms 的要求。

5.2 调试软件说明(CodeFusion Studio)

固件工程基于 CodeFusion Studio 2.2.1 开发调试,要点如下:

  • 工程与构建:CFS 基于 VSCode 的嵌入式工作流,工程通过 CFS 图形化外设配置(.cfsconfig)生成时钟、GPIO、I2C、I2S、UART、DMA 初始化代码;构建调用 MSDK 的 Make 体系(make release,arm-none-eabi-gcc,-O2 优化),并启用 ARM_MATH_CM4 / ARM_MATH_DSP 与 CMSIS_NN_USE_REQUANTIZE_INLINE_ASSEMBLY 编译宏以充分发挥 Cortex-M4 的 DSP 指令与 CMSIS-NN 优化路径;
  • 烧录与调试:通过板载 DAPLink / J-Link 调试(目标 MAX32655),支持断点、单步、变量查看;SVD 文件支持外设寄存器级调试;
  • 运行观测:UART0(115200-8-N-1)作为运行时观测通道,识别成功输出 KWS,<序号>,<时间戳ms>,<类别ID>,<类别名>,<置信度0~1000>,proc_ms=<单帧处理耗时ms>;调试模式下还可周期性输出各次判决的概率与拒绝原因(静音/未知/阈值/margin/不应期),便于联调阈值参数。

5.3 关键代码说明

(1)音频采集 —— audio/audio_stream.c
MAX9867 经 I2C 配置为 16kHz 主模式后,I2S 以单声道右通道接收 16bit PCM,DMA 配置为 ping-pong 双缓冲(2×640 样本):一块由硬件填充时,主循环处理另一块,块间无缝衔接,保证 40ms 音频流不丢样。DMA 完成回调仅置标志并统计 overrun,耗时处理全部留在主循环,中断开销最小化。

(2)神经网络前端 —— kws/nn_frontend.c
PCM 样本进入容量 1040 样本的 FIFO,每凑满 400 样本生成一帧:乘 Hann 窗 → CMSIS-DSP arm_rfft_fast_f32() 做 512 点实数 FFT → 功率谱 → 按 Python 导出的稀疏 Mel 表做 32 频带滤波 → 取对数 → 按导出的均值/方差归一化 → 按 q = x/scale + zero_point 量化为 int8,写入 80×32 滚动特征历史。所有查找表来自训练侧 frontend_tables.c,确保与训练完全一致。

(3)DS-CNN 推理 —— kws/dscnn_model.c
模型 10 层逐层调用 CMSIS-NN 7.0.0 算子:普通卷积与 1×1 卷积用 arm_convolve_wrapper_s8(),4 个 depthwise 层用 arm_depthwise_conv_wrapper_s8(),分类头前的全局平均池化用 arm_avgpool_s8(),最后用 arm_fully_connected_per_channel_s8() 输出 6 类 logits。权重/偏置/逐通道 multiplier 与 shift 均为 const 数组存放于 flash;推理使用 2×10KB 张量乒乓缓冲 + 4KB scratch,SRAM 占用受部署清单门限约束。

#define LAYER_DESC_CONV(prefix, w, b, m, s) \
    { \
        .op = DSCNN_OP_CONV, \
        .in_h = prefix##_IN_H, .in_w = prefix##_IN_W, .in_c = prefix##_IN_C, \
        .out_h = prefix##_OUT_H, .out_w = prefix##_OUT_W, .out_c = prefix##_OUT_C, \
        .kernel_h = prefix##_KERNEL_H, .kernel_w = prefix##_KERNEL_W, \
        .stride_h = prefix##_STRIDE_H, .stride_w = prefix##_STRIDE_W, \
        .pad_h = prefix##_PAD_H, .pad_w = prefix##_PAD_W, \
        .input_offset = prefix##_INPUT_OFFSET, .output_offset = prefix##_OUTPUT_OFFSET, \
        .act_min = prefix##_ACT_MIN, .act_max = prefix##_ACT_MAX, \
        .weights = (w), .bias = (b), .multiplier = (m), .shift = (s), \
    }


#define LAYER_DESC_DW(prefix, w, b, m, s) \
    { \
        .op = DSCNN_OP_DEPTHWISE, \
        .in_h = prefix##_IN_H, .in_w = prefix##_IN_W, .in_c = prefix##_IN_C, \
        .out_h = prefix##_OUT_H, .out_w = prefix##_OUT_W, .out_c = prefix##_OUT_C, \
        .kernel_h = prefix##_KERNEL_H, .kernel_w = prefix##_KERNEL_W, \
        .stride_h = prefix##_STRIDE_H, .stride_w = prefix##_STRIDE_W, \
        .pad_h = prefix##_PAD_H, .pad_w = prefix##_PAD_W, \
        .input_offset = prefix##_INPUT_OFFSET, .output_offset = prefix##_OUTPUT_OFFSET, \
        .act_min = prefix##_ACT_MIN, .act_max = prefix##_ACT_MAX, \
        .weights = (w), .bias = (b), .multiplier = (m), .shift = (s), \
    }


static const dscnn_layer_t g_layers[] = {
    LAYER_DESC_CONV(KWS_LAYER0_STEM,
                    kws_stem_weights, kws_stem_bias,
                    kws_stem_multiplier, kws_stem_shift),
    LAYER_DESC_DW(KWS_LAYER1_BLOCK1_DW,
                  kws_block1_dw_weights, kws_block1_dw_bias,
                  kws_block1_dw_multiplier, kws_block1_dw_shift),
    LAYER_DESC_CONV(KWS_LAYER2_BLOCK1_PW,
                    kws_block1_pw_weights, kws_block1_pw_bias,
                    kws_block1_pw_multiplier, kws_block1_pw_shift),
    LAYER_DESC_DW(KWS_LAYER3_BLOCK2_DW,
                  kws_block2_dw_weights, kws_block2_dw_bias,
                  kws_block2_dw_multiplier, kws_block2_dw_shift),
    LAYER_DESC_CONV(KWS_LAYER4_BLOCK2_PW,
                    kws_block2_pw_weights, kws_block2_pw_bias,
                    kws_block2_pw_multiplier, kws_block2_pw_shift),
    LAYER_DESC_DW(KWS_LAYER5_BLOCK3_DW,
                  kws_block3_dw_weights, kws_block3_dw_bias,
                  kws_block3_dw_multiplier, kws_block3_dw_shift),
    LAYER_DESC_CONV(KWS_LAYER6_BLOCK3_PW,
                    kws_block3_pw_weights, kws_block3_pw_bias,
                    kws_block3_pw_multiplier, kws_block3_pw_shift),
    LAYER_DESC_DW(KWS_LAYER7_BLOCK4_DW,
                  kws_block4_dw_weights, kws_block4_dw_bias,
                  kws_block4_dw_multiplier, kws_block4_dw_shift),
    LAYER_DESC_CONV(KWS_LAYER8_BLOCK4_PW,
                    kws_block4_pw_weights, kws_block4_pw_bias,
                    kws_block4_pw_multiplier, kws_block4_pw_shift),
};

(4)后处理判决 —— kws/kws_postprocess.c
logits 反量化后做数值稳定 softmax;对最近 4 次推理概率做滑动平均;依次检查拒识类、逐类阈值、与次优类的 margin(0.4)、500ms 不应期,全部通过才产出一次有效命令。逐类阈值由 PC 端校准脚本在验证集上自动生成并固化到固件。

(5)命令反馈 —— feedback/ 目录

  • command_actions.c:命令 → LED 效果映射(见第 6 节演示表),GPIO 直接驱动 RGB LED;
  • sd_wav_player.c:FatFs 打开 microSD 上的 WAV,跳过文件头后经 I2S TX DMA 分块播放;
  • pmic_ready_led.c:经 I2C 控制 MAX20303 绿色 LED 表达"监听中/反馈中"状态。

反馈期间会停止音频采集,播放结束后依次执行缓冲清空、前端/后处理状态复位、重新启动采集,避免回放音频被自身识别造成自触发。

(6)训练侧脚本链(PC 端,PyTorch 2.4.1)
build_manifest(按 REC 编号区间生成标签清单并划分数据集)→ train(float 训练 + 早停)→ calibrate/qat(阈值校准与量化感知微调)→ calibrate_int8(int8 路径阈值校准)→ verify_export(float/伪量化/整数参考三方一致性验证)→ export_cmsis(生成 model_data.c、frontend_tables.c、model_config.h 与部署清单,直接落入固件工程 kws/generated/ 目录)。训练与部署之间零手工搬运:所有常量由脚本生成并带 CRC 校验。

6 实物演示及说明

CodeFusion Studio 软件截图请看 5.2章

演示流程(视频与照片均按此步骤录制):

步骤

操作

板上现象

1

上电启动

PMIC 绿色待命 LED 点亮,进入监听

2

说"开机"

绿色待命 LED 熄灭 → RGB LED 绿色常亮 1s → 播放开机回应语音 → 恢复监听

3

说"增加"

RGB LED 青色快闪(100ms 亮/灭 ×5)→ 播放增加回应语音

4

说"减少"

RGB LED 品红色闪烁(250ms 亮/灭 ×2)→ 播放减少回应语音

5

说"关机"

RGB LED 红色闪烁(250ms 亮/灭 ×2)→ 播放关机回应语音

命令词与类别、反馈效果、WAV 文件的完整映射:

命令词

模型类别

LED 颜色与模式

WAV 文件

开机

OPEN

绿色常亮 1s

OPEN.WAV

增加

INCREASE

青色 100ms×5 快闪

INCR.WAV

减少

DECREASE

品红 250ms×2 闪烁

DECR.WAV

关机

CLOSE

红色 250ms×2 闪烁

CLOSE.WAV

串口同步输出识别记录(格式:KWS,序号,时间戳ms,类别ID,类别名,置信度,proc_ms=处理耗时),可用于量化统计识别准确率与响应时间。



7 遇到的难点及解决方法

难点 1:训练数据量小(单一说话人),易过拟合。
解决:训练集对原始波形做多样化增强——随机增益(±4dB)、白噪声(SNR 18~35dB)、变速扰动(0.92~1.08 倍)、轻度混响,每条录音生成 4 份增强副本。

难点 2:识别与 WAV 回放共用一条 I2S 音频通路的状态切换。
解决:将反馈过程实现为严格的状态序列——停止 I2S 接收 → 播放 WAV(TX DMA)→ 播放完成关闭 I2S 释放 TX/RX 状态 → 清空音频缓冲 → 复位前端特征历史与后处理平滑窗口 → 重启接收 DMA。PMIC 绿色 LED 与该状态机联动指示"监听/反馈",同时避免回放的语音被自身再次识别造成自触发。

难点 3:中文命令词数据集的采集。
解决:基于同一块开发板编写专用录音采集固件(附录A):按键启停录音、文件按序号自动命名写入 microSD,配合标签区间文件即可批量入库;采集时同时录制噪音样本作为 UNKNOWN 类与增强素材。

8 对本次活动的心得体会

通过本项目完整走通了"嵌入式数据采集 → PC 端模型训练量化 → MCU 端 CMSIS-NN 部署"的边缘 AI 全流程,收获主要有三点:

  1. CodeFusion Studio 的开发体验:CFS 把外设配置(时钟树、I2S、DMA、GPIO)图形化并自动生成初始化代码,构建/烧录/调试在同一个 IDE 内完成,配合 UART 实时日志,调试"音频流 + 神经网络"这类多模块协同的固件效率很高;对 CMSIS-NN/CMSIS-DSP 的集成也让 int8 算子调用非常直接。
  2. 建议:希望官方后续能提供更多音频类(PDM/I2S codec)与 CMSIS-NN 部署方向的完整例程或文档,降低参赛者在音频链路配置上的摸索成本;另外期待 CFS 的外设配置能覆盖更多第三方库(如 FatFs + SD)的一键集成。


最后,感谢 ADI 与硬禾科技为本项目提供的支持!


附录A 录音数据采集程序(MAX32655-FTHR)

模型的训练数据由 MAX32655-FTHR 开发板自主采集:编写的录音固件将它变成一台"命令词录音机",直接产出到 microSD 卡的 WAV 数据集,省去 PC 录音工具与格式转换环节,且采集链路与部署固件的音频链路(同一颗 MAX9867、同样的 16kHz/16bit 配置)完全一致,从源头保证训练数据与推理输入同分布。

工作流程:

状态

触发

现象

就绪

上电挂载 SD 卡成功

绿色 LED1 常亮,等待按键

录音

按下 SW3(经 MAX6817 连接 P0.3)

红色 LED0 点亮,音频流式写入 SD 卡

停止

再次按下 SW3

写完 WAV 文件头,进入回放

回放

自动

蓝色 LED2 点亮,录完即回放试听

技术要点:

  • 音频链路与识别固件一致:板载数字麦克风 → MAX9867(I2C 0x18,MCLK 12.288MHz,右通道,ADC +3dB)→ I2S RX DMA 双缓冲(每块 2048 样本 = 128ms),边录边写卡;
  • 文件格式:16kHz / 16bit / 单声道标准 RIFF WAV;
  • 文件命名:REC0000.WAV、REC0001.WAV……自动扫描寻找空闲序号,避免覆盖;
  • 存储:microSD(SPI 400kHz 初始化、5MHz 运行)+ FatFs 文件系统,流式 f_write 写入;
  • 串口同步打印文件名、字节数、时长与峰值电平,方便监控削波等质量问题。



采集的数据集(16kHz 单声道):

命令词

录音编号区间

条数

模型类别

开机

REC0000 ~ REC0069

70

OPEN

关机

REC0070 ~ REC0139

70

CLOSE

增加

REC0140 ~ REC0209

58

INCREASE

减少

REC0210 ~ REC0279

70

DECREASE

环境噪音(拒识样本)

REC0280 ~ REC0309

30

UNKNOWN

数据集按 60%/20%/20% 划分为训练/验证/测试集(固定随机种子保证可复现);数据管线另按约 20% 比例合成静音样本作为 SILENCE 类。


由于数据集协议原因,完整音频数据集不公开。如有需要,请使用录音采集固件,自行构建数据集。

附录B 模型训练与导出使用方式

训练工程独立于固件工程(PC 端,Python 3.8 + PyTorch 2.4.1,纯 CPU 即可完成),在 config.toml 输入数据集命令词的编号范围后,依次执行以下指令:

# 1. 生成数据清单(按标签区间 + 数据集划分)
python -m scripts.build_manifest --config config.toml

# 2. 训练 float32 模型(早停)
python -m scripts.train --config config.toml

# 3. 校准 float 模型判决阈值
python -m scripts.calibrate --config config.toml

# 4. 量化感知训练(int8 QAT 微调)
python -m scripts.qat --config config.toml

# 5. 在整数参考路径上重新校准逐类阈值(部署到开发板后,要手动微调)
python -m scripts.calibrate_int8 --config config.toml

# 6. 验证 float / 伪量化 / 整数参考三方一致性
python -m scripts.verify_export --config config.toml

# 7. 导出 CMSIS-NN C 代码到固件工程(kws/generated 目录)
python -m scripts.export_cmsis --config config.toml --firmware-generated-dir ..\test1\m4\kws\generated

导出产物(自动生成,固件直接编译使用):

文件

内容

model_data.c/.h

int8 权重、int32 偏置、逐通道 multiplier/shift、类别名表

frontend_tables.c/.h

Hann 窗、32 频带 Mel 滤波器组(稀疏存储)、特征均值/方差、输入量化参数

model_config.h

类别数、输入尺寸、各层形状/步长/填充、SRAM arena 尺寸、推理间隔等全部宏

deployment_manifest.json

层清单、量化参数、flash/SRAM 占用估算、CRC 与部署门禁结果

训练指标可视化结果:




附件下载
max32655.zip
MAX32655-FTHR 固件
training.zip
DSCNN 训练代码(python 3.8)
recorder.zip
MAX32655-FTHR 录音程序(16KHz采样,WAV)
团队介绍
使用ChatGPT辅助编写代码,TRAE整理文档材料。视频已经补充codefusion相关内容。
团队成员
fyjh2023
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号