音频基础:音频信号表示、采样率、帧与窗口、时域与频域特征概述

TinyML 音频推理与传统的云端音频分析最大的不同在于:它必须在极低功耗、极低算力、极小内存的微控制器上完成对音频流的持续感知与判断。因此,理解音频信号在数字系统中的表示方式、采样与量化的约束、帧与窗口的切分逻辑,以及时域与频域特征的提取原理,是设计滑窗推理算法、控制事件持续时间与重复告警的基石。本节将系统梳理这些核心概念,并重点说明它们如何直接影响到后续的模型输入设计、推理节奏安排以及告警抑制策略。

音频信号数字化与特征提取链路 模拟声波 连续时间/幅度 采样 + 量化 采样率 fs (Hz) 位深 (bit) 帧与窗口 帧长 (N) 帧移 (hop) 特征提取 时域/频域 MFCC/谱特征 时域特征 RMS 能量、过零率 (ZCR) 峰值幅度、自相关 短时能量包络 频域特征 FFT 频谱、谱质心 Mel 滤波器组、MFCC 谱通量、谱滚降点 滑窗推理 固定窗口长度 L 滑动步长 S (hop) 重叠率 = (L-S)/L 事件检测 → 持续时间统计 → 告警控制 基于滑窗推理结果的时间序列后处理 关键参数:采样率 fs、帧长 N、帧移 hop、窗口函数、特征维度

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 上获得可接受的信号质量。

核心原则:采样率决定频率上限(奈奎斯特频率 = fs/2),位深决定动态范围。在 TinyML 中,不要盲目追求高采样率,而应根据目标事件的主要频率成分来选择。例如,咳嗽声的主要能量集中在 500 Hz - 2 kHz,使用 8 kHz 采样率即可覆盖;而鸟鸣声可能包含 5 kHz 以上的谐波,则需要 16 kHz 或更高。

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)。
实战经验:在 TinyML 中,不要一开始就使用高维 MFCC。一个 13 维 MFCC 加上一阶差分(delta)会变成 26 维,在 MCU 上做矩阵乘法会显著增加推理时间。建议先用 RMS + ZCR 做粗检测,当确认有事件候选时,再计算 MFCC 或谱特征进行精细分类。这种“两级检测”策略可以大幅降低平均功耗。

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 做精确分类。

常见误区:许多初学者将帧长设置得过短(如 128 点),导致频率分辨率不足(16 kHz / 128 = 125 Hz),无法区分 3 kHz 和 3.125 kHz 的谐波。同时,过短的帧长会使 RMS 能量波动剧烈,增加误检率。建议帧长至少覆盖目标事件 2-3 个周期。对于 100 Hz 的低频事件,帧长至少需要 20 ms;对于 5 kHz 的高频事件,帧长可以缩短到 5 ms。

2.6 总结与设计要点

音频信号表示是 TinyML 音频应用的基石。采样率、位深、帧长、帧移、窗口函数和特征选择共同决定了系统的性能上限。在实际工程中,应遵循以下步骤:

  1. 明确事件频带:通过频谱分析确定目标事件的主要频率范围,据此选择采样率。
  2. 确定时间分辨率需求:根据事件最短持续时间选择帧长和帧移。事件越短,帧移应越小,但计算量越大。
  3. 特征降维:优先使用 RMS、ZCR 等低成本特征做预筛选,仅在必要时计算 MFCC。
  4. 后处理设计:通过最小持续时间阈值和冷却时间控制告警频率,避免抖动和重复告警。
  5. 实测验证:在目标硬件上测量每帧推理耗时和功耗,确保满足实时性要求。

音频特征提取没有“万能配置”,必须结合具体场景反复调优。建议在开发初期就建立一套完整的参数记录表,记录每次调整的采样率、帧长、帧移、特征维度和误报率,以便快速定位问题。