语音识别 LPCC(线性预测倒谱系数)提取算法源码
项目介绍
本项目实现了一套完整的语音信号特征提取流程,核心聚焦于 线性预测倒谱系数 (LPCC) 的计算。LPCC 是语音识别、说话人识别等领域中最经典的特征之一,它基于线性预测分析(LPC),能够有效地模拟人类发声声道的共振特性(共振峰),并具有良好的抗噪声性能。
本代码通过 MATLAB 编写,采用全流程自包含的设计(Self-contained),无需外部语音文件即可运行。它内部集成了基于源-滤波器模型的语音生成器,能够模拟元音发音,并以此为基础演示从预加重、分帧、加窗到 Levinson-Durbin 递归求解 LPC,最终转换为 LPCC 的完整算法链路。
功能特性
- 内置模拟语音生成:不依赖外部音频文件,通过脉冲源与共振峰滤波器模型(Formant Filter)实时生成包含特定共振峰(F1, F2, F3)的模拟语音信号,方便验证算法对不同频率特性的捕捉能力。
- 完整的特征提取流水线:实现了标准的语音信号处理前端流程,包括预加重、分帧、汉明窗处理。
- 底层算法实现:
*
Levinson-Durbin 递归:手动实现了用于解 Yule-Walker 方程的经典递归算法,而非直接调用 MATLAB 工具箱函数,便于深入理解 LPC 求解过程。
*
LPC 转 LPCC 递归:实现了将线性预测系数转换为倒谱系数的递推公式,涵盖了阶数小于和大于预测阶数的两种计算情况。
- 多维度可视化分析:提供包含原始波形、单帧时域图、FFT 与 LPC 谱包络对比、单帧 LPCC 系数直方图以及全段语音 LPCC 特征谱图的综合展示窗口。
系统要求
- 运行环境:MATLAB R2016a 及以上版本
- 工具箱:基础 MATLAB 环境即可(代码中使用了
signal processing toolbox 中的基础函数如 hamming, xcorr, freqz,但核心算法为手动实现)
使用方法
- 将代码保存为 MATLAB 脚本文件(推荐命名为
main.m)。 - 在 MATLAB 命令窗口或编辑器中直接运行
main 函数。 - 程序将自动执行以下步骤:
* 生成模拟语音信号。
* 计算并输出特征提取过程中的状态信息。
* 弹出 "LPCC 语音特征分析" 窗口,展示波形、频谱对比及特征参数。
核心算法实现逻辑详解
代码主要流程包含在主函数中,按顺序执行以下五个阶段:
1. 模拟语音信号生成
代码基于
源-滤波器模型 (Source-Filter Model) 构建语音:
- 激励源:构建一个基频为 120Hz 的脉冲序列,模拟声带振动。
- 声道滤波:设定三个关键共振峰频率(700Hz, 1200Hz, 2600Hz)及带宽。通过级联三个二阶谐振器构建全极点滤波器,将脉冲序列通过该滤波器即可合成出具有元音特征的语音信号。
2. 预加重 (Pre-emphasis)
为了提升语音信号的高频部分,平坦化频谱并消除口鼻辐射的影响,代码对信号执行一阶高通滤波。
- 差分方程:$y(n) = x(n) - alpha cdot x(n-1)$
- 系数设定:预加重系数 $alpha$ 设为 0.97。
3. 分帧与加窗
将非平稳的语音信号切分为短时平稳的帧:
- 参数:帧长 25ms,帧移 10ms。
- 操作:利用自定义逻辑将信号矩阵化,并对每一帧乘以 汉明窗 (Hamming Window),以减少截断效应带来的频谱泄露。
4. LPC 及 LPCC 系数计算 (核心部分)
程序对每一帧信号进行循环处理:
- 自相关计算:计算信号的自相关函数 $R(k)$,用于构建 Levinson-Durbin 算法所需的 Toeplitz 矩阵部分。
- LPC 求解:调用内部子函数,利用 Levinson-Durbin 递归算法,由自相关系数快速求解第 12 阶线性预测系数 $a_k$ 和预测误差能量 $E$。
- LPCC 转换:调用内部子函数,基于求得的 LPC 系数,利用递推公式计算第 16 阶倒谱系数 $c_m$。该算法通过加权求和的方式,将 LPC 的全极点模型特性转化为倒谱域特征。
5. 结果可视化
最后通过绘图函数展示分析结果:
- 频谱对比:在同一坐标系下绘制单帧信号的 FFT 对数谱和 LPC 能够平滑拟合出的频谱包络,直观展示 LPC 对共振峰的建模效果。
- 特征谱图:通过
imagesc 绘制 LPCC 矩阵的热力图,横轴为时间(帧),纵轴为倒谱系数索引,展示特征随时间的演变。
关键函数与算法细节
Levinson-Durbin 求解器 (levinson_durbin_solver)
此函数手动实现了 Levinson-Durbin 递归算法,用于求解 Yule-Walker 方程组。
- 输入:自相关系数向量(R0 到 Rp)。
- 过程:从 1 阶逐步递推至目标阶数 p。每一步计算反射系数(Reflection Coefficient),更新预测系数向量,并迭代计算预测误差能量。
- 输出:LPC 系数向量 $[1, a_1, ..., a_p]$。
LPC 转 LPCC 转换器 (lpc_to_lpcc)
此函数实现了 LPC 系数到 LPCC 系数的映射,基于倒谱的复倒谱性质推导出的递归关系。
* 当倒谱阶数 $m leq p$(LPC阶数)时:结合当前阶的 LPC 系数与历史 LPCC 系数的加权和进行计算。
* 当倒谱阶数 $m > p$ 时:仅利用历史 LPCC 系数与 LPC 系数的加权和进行外推。
- 实现细节:严格遵循 MATLAB 下 LPC 系数定义的符号约定($A(z) = 1 + sum a_k z^{-k}$),正确处理了递归公式中的负号与索引对应关系。
共振峰滤波器生成 (formants_filter)
- 原理:利用 $z$ 平面上的极点放置法设计数字滤波器。
- 公式:对于每个共振峰频率 $F$ 和带宽 $B$,计算极点半径 $r = e^{-pi B / f_s}$ 和角度 $theta = 2pi F / f_s$,生成对应的二阶节系数,最后将多个二阶节卷积级联。
分帧工具 (enframe)
- 功能:将一维信号向量根据指定的帧长和帧移重组为二维矩阵(
num_frames x frame_len),若最后一帧数据不足帧长将被忽略或处理,本实现采用截断处理。