3、TinyML外设采集场景:常见传感器(麦克风、IMU、摄像头)的数据特点与采集需求
TinyML 系统的起点是物理世界与数字世界的交汇点——传感器。无论是唤醒词检测、运动状态识别,还是视觉缺陷分拣,模型推理的质量上限在数据采集阶段就已经被决定。理解麦克风、IMU(惯性测量单元)和摄像头这三类最常见传感器的数据特点与采集需求,是设计 DMA 协同链路、配置缓冲区以及确定推理触发策略的前提。本章将围绕这三类传感器的信号本质、数据格式、时序约束和系统集成需求展开,为后续章节的 DMA 控制器配置与多缓冲设计奠定基础。
3.1 麦克风传感器:连续流式音频的数据特征与采集约束
麦克风是 TinyML 中最常见的“始终在线”传感器,典型应用包括关键词唤醒、声音事件检测和语音命令识别。其数据本质是一维时域波形,经过采样和量化后形成连续的 PCM(脉冲编码调制)数据流。在嵌入式系统中,麦克风通常通过 PDM(脉冲密度调制)或 I2S(集成电路内置音频总线)接口与 MCU 连接。PDM 麦克风输出 1-bit 高采样率流(典型 2.4MHz 或 3.2MHz),需要经过抽取滤波(CIC 或 FIR)转换为 16-bit PCM 数据;I2S 麦克风则直接输出 16-bit 或 24-bit PCM 数据,采样率通常为 8kHz、16kHz 或 48kHz。
从 DMA 协同的角度看,音频采集的核心需求是低延迟、无间隙的连续传输。以 16kHz/16-bit 单声道为例,每秒产生 32KB 数据,每 10ms 产生 320 字节。如果使用 CPU 中断方式逐字节搬运,MCU 将被完全占用,无法执行推理任务。因此,必须使用 DMA 将数据从外设 FIFO 搬运到内存缓冲区。音频数据的另一个关键特性是时间连续性——数据流不能中断,否则会产生“咔哒”声或导致语音特征断裂。这要求 DMA 配置为循环模式(Circular Mode),配合双缓冲(Double Buffer)机制,确保在一个缓冲区被 CPU 处理时,DMA 仍在向另一个缓冲区写入新数据。
| 参数项 | 典型值 | 对 DMA 设计的影响 |
|---|---|---|
| 采样率 | 16 kHz(语音) | 每 62.5μs 产生一个采样点,DMA 需在采样间隔内完成搬运 |
| 位宽 | 16-bit | DMA 传输宽度设为半字(Half-word),提高搬运效率 |
| 通道数 | 1(单声道)或 2(立体声) | 多通道时需考虑数据交错,DMA 需按帧格式搬运 |
| 数据速率 | 32 KB/s(16kHz/16bit) | 每 10ms 产生 320 字节,适合 256 或 512 字节缓冲区 |
| 突发性 | 持续均匀 | 适合循环 DMA + 双缓冲,无需复杂触发逻辑 |
在缓冲区大小选择上,需要权衡延迟与 CPU 负载。缓冲区越小,音频延迟越低,但中断频率越高,CPU 被唤醒的次数越多。例如,使用 320 字节缓冲区(10ms 音频),MCU 每秒被中断 100 次;使用 640 字节缓冲区(20ms 音频),中断频率降为 50 次/秒,但延迟增加 10ms。对于唤醒词检测这类对延迟敏感的应用,通常选择 10-30ms 的缓冲区长度,既保证特征提取的实时性,又不至于让 CPU 频繁中断。
3.2 IMU 传感器:突发批量数据与事件驱动的采集策略
IMU(惯性测量单元)集成了加速度计和陀螺仪,部分型号还包含磁力计,输出 6 轴或 9 轴运动数据。与麦克风的连续流不同,IMU 的数据具有周期性突发的特点。IMU 内部通常有 FIFO 缓冲区,可以缓存多次采样数据,然后通过 I2C 或 SPI 接口一次性读出。例如,BMI160 IMU 内置 1024 字节 FIFO,在 100Hz 采样率下可缓存约 1.3 秒的 6 轴数据。这种设计使得 MCU 无需频繁访问传感器,而是可以以较低的频率批量读取数据,非常适合低功耗应用。
IMU 的采样率范围较宽,从 25Hz(低功耗计步)到 1kHz(高动态运动捕捉)不等。每个采样点的数据量为 6 轴 × 2 字节 = 12 字节(加速度计和陀螺仪各 3 轴),如果包含磁力计则为 18 字节。在 100Hz 采样率下,数据速率为 1.2KB/s,远低于音频的 32KB/s。然而,IMU 数据的实时性要求并不低于音频——运动状态的突变(如跌倒检测)需要在毫秒级内响应。因此,DMA 协同的关键在于:当 IMU FIFO 达到预设阈值(如 50% 满)时,触发中断,DMA 将 FIFO 中的数据一次性搬运到内存缓冲区。
// IMU 数据批量读取的典型 DMA 配置(以 STM32 + LSM6DSO 为例)
// 1. 配置 SPI 为 DMA 模式,接收缓冲区 12 字节 × 采样点数
#define IMU_SAMPLE_COUNT 20 // 一次读取 20 个采样点
#define IMU_SAMPLE_SIZE 12 // 6轴 × 2字节
uint8_t imu_rx_buf[IMU_SAMPLE_COUNT * IMU_SAMPLE_SIZE];
// 2. 配置 DMA 为 Normal 模式,传输完成中断
DMA_InitTypeDef dma_init = {
.PeriphInc = DMA_PINC_DISABLE, // 外设地址固定(SPI 数据寄存器)
.MemInc = DMA_MINC_ENABLE, // 内存地址递增
.Direction = DMA_PERIPH_TO_MEMORY,
.BufferSize = IMU_SAMPLE_COUNT * IMU_SAMPLE_SIZE,
.Mode = DMA_MODE_NORMAL, // 单次传输,非循环
.Priority = DMA_PRIORITY_HIGH
};
// 3. 在 IMU FIFO 阈值中断中启动 DMA 传输
void IMU_FIFO_Threshold_IRQHandler(void) {
if (LSM6DSO_GetFIFOStatus() & LSM6DSO_FIFO_THRESHOLD) {
LSM6DSO_ReadFIFO(imu_rx_buf, IMU_SAMPLE_COUNT);
// DMA 自动搬运,传输完成中断中触发推理
}
}
IMU 采集的另一个关键需求是时间戳同步。由于 IMU 数据是批量读取的,每个采样点的实际采集时间与读取时间之间存在偏移。对于需要融合多传感器数据的应用(如视觉-惯性导航),必须为每个采样点打上精确的时间戳。这可以通过两种方式实现:一是使用 IMU 内部的时间戳计数器(部分高端 IMU 支持),二是利用 MCU 的定时器在每次 DMA 传输完成时记录当前时间,并根据采样率推算每个采样点的时间。
3.3 摄像头传感器:高带宽帧数据与行交错采集的挑战
摄像头是 TinyML 中数据量最大、时序约束最严格的传感器。以 QVGA(320×240)RGB565 格式为例,一帧图像的数据量为 320×240×2 = 153,600 字节(150KB)。如果以 30fps 的帧率运行,数据速率高达 4.5MB/s,这对 MCU 的总线带宽和存储资源提出了极高要求。因此,TinyML 视觉应用通常采用较低的分辨率(如 96×96 或 64×64 灰度图)和较低的帧率(5-15fps),以降低数据量和计算量。
摄像头的输出格式通常为 DVP(数字视频端口)或 MIPI-CSI 接口。DVP 接口包含 8 位或 16 位并行数据线、像素时钟(PCLK)、行同步(HSYNC)和帧同步(VSYNC)信号。DMA 采集的关键在于行交错传输——摄像头按行输出数据,每行结束后 HSYNC 拉高,DMA 需要在一行数据到达时及时搬运,避免数据覆盖。常用的策略是使用 DMA 的行缓冲模式:配置 DMA 每次传输一行数据(如 320×2 = 640 字节),传输完成后触发中断,CPU 将行数据拷贝到帧缓冲区,同时 DMA 开始传输下一行。
| 分辨率 | 格式 | 单帧大小 | 30fps 数据速率 | 典型应用 |
|---|---|---|---|---|
| 96×96 | 灰度 8-bit | 9.2 KB | 276 KB/s | 手势识别、人脸检测 |
| 160×120 | RGB565 | 38.4 KB | 1.15 MB/s | 物体分类、缺陷检测 |
| 320×240 | RGB565 | 150 KB | 4.5 MB/s | 文档扫描、条码识别 |
| 640×480 | 灰度 8-bit | 307 KB | 9.2 MB/s | 边缘计算(需外部存储) |
摄像头采集的 DMA 设计需要特别关注帧同步与行同步的配合。在 VSYNC 上升沿到来时,DMA 应被配置为接收新的一帧;在 HSYNC 有效期间,DMA 逐行搬运数据。如果使用双帧缓冲(Ping-Pong Buffer),一帧数据在 DMA 写入时,另一帧数据可以被 CPU 用于推理,从而实现采集与计算的流水线并行。然而,由于帧数据量远大于音频和 IMU,MCU 的内部 SRAM 往往不足以容纳两帧完整图像。此时需要采用分块处理策略:将图像划分为多个区域(如 4 个 48×48 的块),每采集完一个块就触发一次推理,或者使用外部 PSRAM 作为帧缓冲。
3.4 三类传感器采集需求对比与 DMA 协同设计要点
综合上述分析,三类传感器在数据特征、采集模式和 DMA 协同策略上存在显著差异。麦克风是连续均匀流,适合循环 DMA + 双缓冲;IMU 是周期突发块,适合阈值触发 + 单次 DMA 批量搬运;摄像头是高带宽帧流,适合行缓冲 + 帧/块完成触发。下表总结了关键差异:
| 对比维度 | 麦克风 | IMU | 摄像头 |
|---|---|---|---|
| 数据形态 | 一维时域波形 | 多维运动向量 | 二维像素矩阵 |
| 典型速率 | 16-48 kHz 采样 | 100-1000 Hz 采样 | 5-30 fps 帧率 |
| 单次数据量 | 2-4 字节/采样 | 12-18 字节/采样 | 9-150 KB/帧 |
| 突发性 | 低(均匀流) | 中(FIFO 批量) | 高(帧突发) |
| DMA 模式 | 循环模式 | 普通模式(单次) | 普通模式(行/块) |
| 缓冲策略 | 双缓冲(Ping-Pong) | 单缓冲 + FIFO 阈值 | 行缓冲 + 帧缓冲/分块 |
| 触发方式 | 半满/全满中断 | FIFO 阈值中断 | 行完成/帧完成中断 |
| 推理触发时机 | 每 10-30ms 音频块 | 每 N 个采样点 | 每帧或每块图像 |
在实际系统设计中,还需要考虑多传感器并发的场景。例如,一个可穿戴设备可能同时采集 IMU 和麦克风数据,用于活动识别和语音增强。此时,DMA 通道的优先级分配至关重要:摄像头(如果存在)应获得最高优先级,因为其数据速率最高且不允许丢失;IMU 次之,因为其 FIFO 可以容忍短暂延迟;麦克风优先级最低,但必须保证循环 DMA 不被长时间阻塞。此外,多个 DMA 通道共享总线带宽,需要合理配置突发传输大小和 FIFO 阈值,避免总线冲突导致的数据延迟。
最后,采集需求直接决定了推理触发策略。对于麦克风,通常采用滑动窗口方式,每 10-30ms 触发一次特征提取和推理;对于 IMU,采用事件计数方式,累积到 N 个采样点后触发一次推理;对于摄像头,采用帧完成或块完成方式,在图像数据完整到达后触发推理。合理的触发策略可以显著降低无效推理次数,延长电池寿命。例如,在始终在线的关键词唤醒系统中,如果音频缓冲区每 10ms 触发一次推理,而唤醒词平均长度为 800ms,则系统每秒执行 100 次推理,其中大部分是无效的。通过引入能量检测或语音活动检测(VAD)作为前置条件,可以在无语音时跳过推理,将功耗降低 80% 以上。