语音信号基础:采样、量化、奈奎斯特定理、分帧、加窗、短时傅里叶变换
语音信号本质上是随时间连续变化的模拟声波,而嵌入式系统只能处理离散的数字序列。从麦克风拾取的声音到算法可分析的数字信号,中间经历了采样、量化两个关键步骤;而从一段长语音中提取出可供频域分析的短时片段,则依赖分帧、加窗和短时傅里叶变换(STFT)。本章将系统梳理这六个核心概念,建立语音前处理算法的数学与工程基础。
核心原理:从连续声波到离散数字序列
语音信号处理的第一步是将麦克风采集到的连续声压变化转换为数字信号。这一过程包含两个不可分割的环节:采样(Sampling)和量化(Quantization)。采样决定了时间轴上的分辨率,量化决定了幅度轴上的分辨率。根据奈奎斯特采样定理,为了无失真地重建原始信号,采样频率必须至少为信号最高频率分量的两倍。对于语音信号,人耳可感知的频率范围约为20Hz至20kHz,但语音能量主要集中在300Hz至3.4kHz(电话带宽)或50Hz至8kHz(宽带语音)。因此,嵌入式语音系统通常选择8kHz(电话质量)、16kHz(宽带语音)或48kHz(高保真)作为采样率。
量化过程将连续的幅度值映射到有限个离散电平。以16位线性PCM为例,其动态范围为96dB(20×log10(2^16)),能够覆盖从轻声细语到大声喊叫的广泛声压范围。量化位数每增加1位,信噪比提升约6dB。在嵌入式系统中,量化位数的选择需要权衡音质需求与存储/带宽开销:8kHz/16bit单声道语音的数据率为128kbps,而16kHz/16bit则为256kbps。
判断方法与操作流程:采样率与量化位数的工程选择
在实际嵌入式项目中,采样率和量化位数的选择并非越大越好,而是需要根据应用场景、存储容量、传输带宽和算法复杂度综合决定。以下是工程判断的基本流程:
- 确定信号带宽需求:语音识别通常需要16kHz采样率以保留更多高频信息;语音通话(VoIP)采用8kHz即可;若涉及音乐或环境声分析,则需48kHz。
- 评估动态范围要求:安静环境下的近讲语音16bit足够;远场拾音或高动态场景(如会议系统)建议24bit。
- 计算数据率与存储预算:例如,10秒16kHz/16bit单声道语音占用320KB存储空间,需确认MCU的Flash/RAM是否满足。
- 考虑后续算法复杂度:更高的采样率意味着FFT点数增加、计算量上升,需评估DSP或MCU的实时处理能力。
| 采样率 | 适用场景 | 奈奎斯特频率 | 数据率(16bit单声道) | 典型应用 |
|---|---|---|---|---|
| 8 kHz | 电话语音 | 4 kHz | 128 kbps | VoIP、语音通话 |
| 16 kHz | 宽带语音 | 8 kHz | 256 kbps | 语音识别、智能音箱 |
| 48 kHz | 高保真音频 | 24 kHz | 768 kbps | 音乐录制、声学检测 |
分帧与加窗:短时平稳假设的工程实现
语音信号是非平稳的,其统计特性随时间变化。但在一段极短的时间(10~30ms)内,语音可以近似视为平稳信号,这就是短时平稳假设。基于此假设,我们将长语音切分为若干短帧,每帧独立进行频谱分析。分帧参数包括帧长(通常20~30ms)和帧移(通常为帧长的50%~75%,即10~15ms)。帧移保证了相邻帧之间的平滑过渡,避免信息丢失。
直接对截断的帧做FFT会产生频谱泄漏——由于矩形窗的旁瓣较高,频谱能量会扩散到相邻频点。解决方法是使用非矩形窗函数,如汉明窗(Hamming)、汉宁窗(Hanning)或布莱克曼窗(Blackman)。窗函数在帧两端将信号逐渐衰减到零,从而抑制旁瓣。汉明窗的表达式为:
w[n] = 0.54 - 0.46 × cos(2πn / (N-1)), 0 ≤ n ≤ N-1
其中N为帧长。汉明窗的主瓣宽度约为矩形窗的两倍,但旁瓣衰减可达-43dB,显著减少频谱泄漏。选择窗函数时需权衡主瓣宽度(频率分辨率)与旁瓣衰减(泄漏抑制):主瓣越窄,频率分辨能力越强;旁瓣越低,频谱纯净度越高。
短时傅里叶变换(STFT):从时域到频域的桥梁
短时傅里叶变换将分帧加窗后的每一帧信号执行FFT,得到该帧的频谱。数学上,STFT定义为:
X(m, k) = Σ x[n] × w[n - mR] × e^(-j2πkn/N)
其中m为帧索引,k为频率索引,R为帧移,N为FFT点数。STFT的输出是一个二维复数矩阵,包含时间维(帧序号)和频率维(频点)。实际应用中,我们通常取幅度谱|X(m,k)|用于特征提取(如MFCC),或保留复数形式用于相位恢复(如波束形成、回声消除)。
FFT点数N的选择直接影响频率分辨率Δf = fs/N。例如,fs=16kHz、N=512时,Δf=31.25Hz;N=1024时,Δf=15.625Hz。更高的频率分辨率有助于区分相近的谐波,但会降低时间分辨率(每帧时长增加)。在嵌入式系统中,FFT点数通常取2的幂次(256/512/1024),以便使用基-2 FFT算法高效计算。
案例拆解:16kHz语音唤醒系统的前端参数设计
假设我们要为一个低功耗MCU(如Cortex-M4 @ 100MHz)设计语音唤醒前端,要求实时处理16kHz/16bit单声道语音,并提取STFT特征用于关键词检测。初始约束:MCU的RAM为256KB,Flash为1MB,算法总延迟不超过30ms。
参数选择过程:
- 采样率:16kHz,满足语音识别带宽需求,数据率256kbps。
- 帧长与帧移:帧长32ms(512点),帧移16ms(256点),保证时间分辨率与频率分辨率平衡。
- 窗函数:汉明窗,预存512点系数(float16,1KB Flash)。
- FFT点数:512点,频率分辨率31.25Hz,满足语音谐波分析需求。
- 计算量估算:512点FFT约需512×log2(512)=4608次复数乘法,Cortex-M4带FPU约耗时0.5ms;加窗与预处理约0.2ms;总耗时约0.7ms,远小于16ms帧移,实时性充裕。
实际运行结果:系统在安静环境下唤醒率95%,3米远场唤醒率82%;RAM占用约40KB(含FFT临时缓冲区、窗函数LUT、特征缓存),Flash占用约120KB(含算法代码与查找表)。
风险与代价:若改用1024点FFT,频率分辨率提升至15.6Hz,但计算量翻倍(约1.2ms),且每帧时长增至64ms,延迟超出30ms约束。因此512点是该MCU平台的最优折中。
总结复盘:语音信号基础的关键要点
- 奈奎斯特定理是采样率选择的理论下限,实际工程中通常取信号最高频率的2.5~4倍以留有余量。
- 量化位数决定动态范围和信噪比,16bit是语音处理的黄金标准,24bit用于高动态场景。
- 分帧参数(帧长/帧移)需根据应用场景调整:语音识别偏好20~30ms帧长,声学事件检测可能用更短帧(10ms)。
- 窗函数的选择是频谱分析质量的保障,汉明窗是默认首选,特殊场景可考虑布莱克曼窗(更高旁瓣衰减)或凯塞窗(可调参数)。
- STFT是后续所有频域算法(噪声抑制、回声消除、波束形成)的基础,其参数配置直接影响算法性能上限。
掌握这些基础概念后,下一步将进入语音增强算法的学习,届时会频繁使用本章的STFT框架进行频域处理。建议读者在嵌入式平台上实际运行一次完整的采样→分帧→加窗→FFT流程,观察不同参数下的频谱差异,这将极大加深对理论的理解。