基于自相关法的男女声自动判别与算法对比系统
项目介绍
本项目是一个基于 MATLAB 开发的语音信号分析系统,旨在通过基频特征提取技术实现说话人性别(男/女)的自动识别。系统核心采用自相关函数法 (ACF) 提取基音周期,同时集成了带通滤波器能量筛选法和幅度作差法 (AMDF) 作为对比参照。
该代码 (main.m) 设计为全功能独立脚本,内置了语音数据模拟生成模块,无需外部音频文件即可直接运行。程序能够自动生成男女声模拟信号,遍历三种算法进行处理,最终输出判别准确率并绘制详细的对比分析图表。
功能特性
- 内置测试数据生成:程序自动生成由基波与高次谐波叠加而成的模拟语音信号,包含5个男声样本(基频约100Hz)和5个女声样本(基频约220Hz),并添加随机噪声以模拟真实环境。
- 多算法对比:在同一测试集上并行运行三种不同的判别算法,直观对比不同方法的性能差异。
- 信号预处理:包含预加重处理,用于提升高频分量,使信号特征更明显。
- 基频提取与平滑:实现了基于帧处理的基频提取,并引入中值滤波(Median Filtering)对基频轨迹进行平滑处理,去除野点。
- 可视化分析:提供四合一的综合图表,展示时域波形、频谱图、基频提取轨迹以及算法准确率对比。
系统要求
- MATLAB R2016a 或更高版本
- Signal Processing Toolbox(信号处理工具箱,用于
butter 滤波器设计等函数)
使用方法
- 将
main.m 文件保存至 MATLAB 的工作路径中。 - 直接运行
main 函数。 - 系统将自动在命令行窗口输出处理进度、单样本判别结果表以及最终的准确率统计。
- 运行结束后,会弹出一个图形窗口展示第6个样本(女声示例)的详细分析图表。
详细功能与算法实现分析
本项目的核心逻辑完全包含在 main.m 文件中,以下是代码的详细实现流程:
1. 系统参数与数据生成
程序首先设定采样率为 8000Hz,帧长为 256 点(约32ms),重叠长度为 128 点。
为了保证代码的可移植性,程序通过循环生成了10个模拟样本:
- 男声模拟:设定基频 $f_0$ 在 100Hz 附近波动。
- 女声模拟:设定基频 $f_0$ 在 220Hz 附近波动。
信号构造采用正弦波叠加(基波 + 5次谐波)的方式模拟声带振动,并加入了少量随机噪声,最后进行归一化处理。
2. 核心处理流程(主循环)
程序对每一个生成的样本依次执行以下操作:
- 预加重:通过系数为
[1, -0.9375] 的滤波器对原始信号进行预处理,以此来补偿语音信号高频部分的衰减。 - 算法调用:分别调用 ACF、BP、AMDF 三种核心算法函数进行处理。
- 结果记录与输出:实时打印每个样本的真实标签、三种算法的预测标签以及计算出的平均基频值。
3. 实现的算法细节
#### A. 自相关函数法 (ACF) - method_autocorrelation
这是本系统的核心算法。
- 分帧与加窗:使用 Hamming 窗对信号进行分帧。
- 中心削波 (Center Clipping):为了抑制共振峰对基音检测的干扰,代码实现了中心削波技术,将幅度低于最大值 30% 的部分置零,其余部分做相应平移。
- 自相关计算:使用
xcorr 计算互相关,并在对应 60Hz-400Hz 的滞后(Lag)范围内寻找峰值。 - 基频计算:根据最大峰值的位置计算基音周期,若峰值相关性过低(<0.3)则标记为静音/清音帧。
#### B. 带通滤波器能量筛选法 -
method_bandpass_energy
这是一种基于频带能量分布的快速判别法,不依赖具体的基频数值。
- 滤波器设计:运用
butter 函数设计了两个2阶带通滤波器。
*
男声频段:60Hz - 160Hz
*
女声频段:180Hz - 350Hz
- 能量比对:计算信号分别通过两个滤波器后的均方根(RMS)能量,能量较大的一方即判定为对应的性别。
#### C. 幅度差函数法 (AMDF) -
method_amdf
作为 ACF 的一种计算量较小的替代方案。
- 差分计算:在感兴趣的滞后范围内,计算原信号与延迟信号的幅度差的绝对值之和。
- 谷值搜索:寻找 AMDF 函数在特定范围内的极小值点(谷值),该点对应的滞后即为基音周期。
- 阈值判断:如果最小差异值过大(接近平均幅度),则认为是非周期信号。
4. 判决逻辑 - judge_gender_by_pitch
对于 ACF 和 AMDF 提取出的平均基频,系统采用基于阈值的硬判决:
- 基频 > 165Hz:判定为 "女"。
- 0 < 基频 <= 165Hz:判定为 "男"。
- 基频 = 0:判定为 "未知"。
5. 结果统计与可视化
代码的最后部分负责数据的汇总与展示:
- 准确率计算:分别计算三种算法正确分类的样本比例并以百分比形式输出。
- 图形绘制:创建一个包含四个子图的 Figure:
1.
时域波形:展示原始语音信号的振幅变化。
2.
频谱图:利用 FFT 计算并展示信号的单边频谱(0-1000Hz范围)。
3.
基频轨迹:对比展示 ACF 和 AMDF 两种方法提取的基频随帧变化的曲线(F0 Contour),可以清晰看到基频的连续性。
4.
准确率柱状图:直观展示三种算法在当前测试集上的性能对比。