音频基础:音频信号表示、采样率、帧与窗口、时域与频域特征概述
TinyML 音频推理与传统的云端音频分析最大的不同在于:它必须在极低功耗、极低算力、极小内存的微控制器上完成对音频流的持续感知与判断。因此,理解音频信号在数字系统中的表示方式、采样与量化的约束、帧与窗口的切分逻辑,以及时域与频域特征的提取原理,是设计滑窗推理算法、控制事件持续时间与重复告警的基石。本节将系统梳理这些核心概念,并重点说明它们如何直接影响到后续的模型输入设计、推理节奏安排以及告警抑制策略。
2.1 音频信号在数字系统内的表示
声音本质上是空气压力的波动,是一种连续变化的模拟信号。微控制器无法直接处理连续信号,必须通过模数转换器(ADC)将声波转换为离散的数字序列。这一过程包含两个关键步骤:采样(在时间轴上离散化)和量化(在幅度轴上离散化)。采样率(Sample Rate, fs)决定了每秒采集的样本点数,单位是 Hz。常见的音频采样率有 8 kHz(电话语音)、16 kHz(语音识别常用)、44.1 kHz(CD 音质)。在 TinyML 场景中,采样率的选择直接决定了数据量、计算量和功耗。例如,一个 16 kHz、16 bit 的单声道音频流,每秒产生 32 KB 数据;若使用 8 kHz 采样,则数据量减半,但高频信息(超过 4 kHz)会丢失。
量化位深(Bit Depth)决定了每个样本的幅度精度。8 bit 提供 256 个量化等级,16 bit 提供 65536 个等级。对于大多数环境声音事件检测(如玻璃破碎、咳嗽、机器异响),16 bit 是常用选择,但部分超低功耗场景会采用 8 bit 或 12 bit 以降低存储和传输开销。量化误差会引入噪声,但通过合理的增益设置和动态范围压缩,可以在 MCU 上获得可接受的信号质量。
2.2 采样率、帧与窗口的工程含义
采样率确定后,音频流被切分为固定长度的帧(Frame)进行处理。帧长(Frame Length)通常以样本点数表示,例如 256 点、512 点或 1024 点。帧长对应的物理时间 = 帧长 / 采样率。例如,16 kHz 采样率下,512 点帧对应 32 ms。帧移(Hop Length)是相邻两帧起始点之间的样本数,决定了帧与帧之间的重叠程度。重叠率 = (帧长 - 帧移) / 帧长。常见的设置为帧长 30 ms、帧移 10 ms,即重叠 66.7%。
窗口函数(Window Function)在帧切分后应用于每个帧,目的是减少频谱泄漏。矩形窗(Rectangular Window)简单但旁瓣高;汉明窗(Hamming Window)和汉宁窗(Hanning Window)是音频处理中最常用的选择,它们能有效抑制帧边缘的不连续性。在 MCU 上实现时,窗口系数可以预先计算并存储在 Flash 中,避免运行时计算。
| 参数 | 典型值 | 对推理的影响 | TinyML 建议 |
|---|---|---|---|
| 采样率 fs | 8 kHz / 16 kHz | 决定频率分辨率和数据量 | 根据事件频带选择,避免过高 |
| 帧长 N | 256 / 512 / 1024 点 | 频率分辨率 = fs/N,时间分辨率 = N/fs | 平衡频率细节与延迟 |
| 帧移 hop | N/2 或 N/4 | 决定特征更新频率和计算量 | 重叠越多,时间平滑越好,但算力开销增大 |
| 窗口函数 | 汉明窗 / 汉宁窗 | 影响频谱泄漏和旁瓣抑制 | 预计算系数存 Flash |
2.3 时域特征与频域特征概述
时域特征直接从原始波形样本中计算,计算量小,适合 MCU 上的轻量级预筛选。最常用的时域特征包括:
- 均方根能量(RMS Energy):反映帧内信号的整体强度,计算公式为 sqrt(mean(x²))。RMS 值对事件检测的起始点判断非常有效。
- 过零率(Zero Crossing Rate, ZCR):统计信号在帧内穿越零轴的次数。ZCR 高通常表示高频成分多或噪声大,低 ZCR 则对应低频或平稳信号。
- 峰值幅度(Peak Amplitude):帧内最大值,用于检测瞬态冲击事件。
- 自相关(Autocorrelation):用于估计基频周期,适合语音或乐音检测。
频域特征需要对帧进行快速傅里叶变换(FFT),计算量相对较大,但能提供更丰富的频率结构信息。常用频域特征包括:
- FFT 频谱:将时域帧转换为频域幅度谱,是后续所有频域特征的基础。
- 谱质心(Spectral Centroid):频谱的“重心”位置,反映声音的明亮程度。
- Mel 频率倒谱系数(MFCC):模拟人耳对频率的非线性感知,是语音和音频事件识别中最经典的特征。MFCC 的计算流程包括:预加重 → 分帧加窗 → FFT → Mel 滤波器组 → 取对数 → DCT。
- 谱通量(Spectral Flux):相邻帧频谱之间的变化量,常用于检测声音的起始点(onset detection)。
2.4 滑窗推理与事件持续时间的关联
滑窗推理(Sliding Window Inference)是 TinyML 音频事件检测的核心模式。系统维护一个固定长度的环形缓冲区,持续接收 ADC 采样数据。每隔一个帧移(hop)时间,将缓冲区中的最新帧送入模型进行推理。推理结果是一个概率向量或类别标签。由于音频事件通常持续数百毫秒到数秒,单帧推理结果往往不稳定,因此需要结合时间后处理来统计事件持续时间并控制告警。
事件持续时间(Event Duration)可以通过统计连续帧中检测到目标类别的帧数来估算。例如,若帧移为 20 ms,连续 10 帧检测到“咳嗽”类别,则事件持续时间约为 200 ms。重复告警控制(Duplicate Alarm Suppression)则依赖于两个关键参数:最小事件持续时间阈值(低于该阈值视为噪声或误检)和去抖时间窗口(在事件结束后的一段时间内不重复触发告警)。
// 伪代码:滑窗推理与告警控制逻辑
#define HOP_SIZE 160 // 10ms @ 16kHz
#define MIN_DURATION 5 // 最小持续帧数 = 50ms
#define COOLDOWN_FRAMES 50 // 冷却帧数 = 500ms
int event_count = 0;
int cooldown = 0;
void process_frame(int16_t* frame) {
float prob = model_predict(frame); // 模型推理
if (prob > 0.8) {
event_count++;
if (event_count == MIN_DURATION) {
trigger_alarm(); // 持续足够长才告警
}
} else {
if (event_count > 0 && event_count < MIN_DURATION) {
// 事件太短,忽略
}
event_count = 0;
}
if (cooldown > 0) {
cooldown--;
if (cooldown == 0) {
// 冷却结束,允许下一次告警
}
}
}
2.5 案例拆解:工业设备异常声音监测
假设我们要在一条生产线上监测电机轴承的异常声音。电机正常运行时发出稳定的 1 kHz 左右的嗡嗡声;当轴承磨损时,会产生 3 kHz - 5 kHz 的周期性冲击声。我们选择 16 kHz 采样率,帧长 512 点(32 ms),帧移 160 点(10 ms),使用汉明窗。模型输入为 13 维 MFCC 特征。
初始现象:直接使用单帧推理时,系统频繁误报——正常运行时偶尔的机械碰撞声也会触发告警。分析发现,这些碰撞声持续时间通常小于 30 ms,而真正的轴承故障声持续 200 ms 以上。
优化方案:引入最小持续时间阈值(MIN_DURATION = 20 帧,即 200 ms)和冷却时间(COOLDOWN = 100 帧,即 1 秒)。修改后,误报率从每 10 分钟 3 次降低到每 8 小时 1 次,同时真实故障的检测延迟仅为 200 ms,满足产线停机保护要求。
代价与权衡:增加持续时间阈值会延迟告警触发,对于需要极快响应的安全场景(如刀具断裂)可能不适用。此时应减小帧移(如从 10 ms 改为 5 ms),但计算量会翻倍。另一种方案是使用两级模型:第一级用 RMS 能量做快速预检,第二级用 MFCC 做精确分类。
2.6 总结与设计要点
音频信号表示是 TinyML 音频应用的基石。采样率、位深、帧长、帧移、窗口函数和特征选择共同决定了系统的性能上限。在实际工程中,应遵循以下步骤:
- 明确事件频带:通过频谱分析确定目标事件的主要频率范围,据此选择采样率。
- 确定时间分辨率需求:根据事件最短持续时间选择帧长和帧移。事件越短,帧移应越小,但计算量越大。
- 特征降维:优先使用 RMS、ZCR 等低成本特征做预筛选,仅在必要时计算 MFCC。
- 后处理设计:通过最小持续时间阈值和冷却时间控制告警频率,避免抖动和重复告警。
- 实测验证:在目标硬件上测量每帧推理耗时和功耗,确保满足实时性要求。
音频特征提取没有“万能配置”,必须结合具体场景反复调优。建议在开发初期就建立一套完整的参数记录表,记录每次调整的采样率、帧长、帧移、特征维度和误报率,以便快速定位问题。