本文是对鲍长春老师《基于归一化互相关函数的基音检测》的MATLAB复现。
-
语音信号的产生模型和清浊音特性
空气从肺部排除行成气流,气流激励升到从嘴唇或鼻孔或同时从嘴唇和鼻孔辐射出来而产生语音。当气流通过声门时,如果声带的张力刚好使声带张弛震荡,产生一股准周期的气流,这一气流激励声道就产生浊音语音。当气流通过声门时,声道的某处发生了收缩而产生一个狭窄的通道,当空气流到达此处时被迫以高速通过紧缩部分而在附近产生气流湍流,这种湍流通过声道便行成清音语音。
浊音语音信号为周期冲击序列,其周期为。清音语音信号为白噪声序列,满足均值为0,方差为1的高斯分布。
语音产生的“源-系统”模型(根据发声器官和语音产生过程):
可实现的数字模型(激励源、声道模型和辐射模型):
-
检测基音周期的基本原理
基音是指发浊音时声带振动所引起的周期性,基音周期是声带振动频率的倒数。基音检测是语音处理中一个非常重要的问题,找到一个完善的适用于不同的讲话者、不同要求和环境、准确和可靠的基音检测的方法是语音处理领域最具挑战性的任务之一。目前,大多数基音检测方法都采用的是自相关法。
对于浊音信号的互相关函数,在基音周期的整数倍位置上出现峰值,而清音的自相关函数没有明显的峰值出现;因此检测是否有峰值就可判断是清音或浊音,检测峰值的位置就可以提取基音周期值。 -
程序框图
-
读入语音信号
已知语音数据文件是经8KHz采样频率采样的信号。
clear;clc;
fid=fopen('female.dat');
x1=fread(fid,16000,'short');
figure;plot(x1);title('读信号');
grid
采用fread函数以二进制数据读入数据。设定信号长度为16000,精度为16位整数型。语音信号图如下:
- 语音信号分帧
设20ms的语音信号为一帧,计算出帧长为160个样点,并设置帧移为160。用矩形窗作为分帧的窗函数。为方便后续计算,对分帧后的矩阵作转置,计算出帧数。
%分帧
wlen=8000*20*10.^(-3); inc=160; % 给出帧长和帧移
win=boxcar(wlen); % 给出矩形窗
N=length(x1); % 信号长度
time=(0:N-1)/8000; % 计算出信号的时间刻度
X=enframe(x1,win,inc); % 分帧
X=X';
fn&#