项目总结报告
—基音周期的检测
1. 项目整体框架
1.1目标
了解语音基音周期估计方法,掌握自相关法估计基音周期的原理。 1.2主要内容
本次基音周期的估算,我们选用的是短时自相关函数法,包括四个模块。
第一个模块为基音的端点检测,主要为了区分浊音和清音。第二个模块为基音检测中的带通滤波器,主要为了减少共振峰的干扰。第三个模块为短时自相关函数法做基音检测,主要为了计算出基音周期。第四个模块为平滑处理,主要为了消除偏离值点。 2. 模块一(端点检测)
2.1主要负责工作
利用能熵比法进行语音端点检测,区分语音帧的起点以及终点。 2.2具体实现方法 2.2.1实验步骤
1)取一段语音“tone4.wav”,该语音内容是“妈妈,好吗,上马,骂人”,语音长度为3.5秒,采样率Fs=8000. 进行简单的去除直流分量,然后幅值归一化,时域波形如图1所示。
2)设置好分帧参数,帧长wlen=320,帧移inc=80,调用函数y =enframe(x,wlen,inc)';
对语音信号x分帧处理。最后帧数Fn=337。
3)设置端点检测门限值T1=0.05,使用能熵比法进行端点检测。对分帧后的语音y 每一帧进行FFT运算,然后计算每一帧的能熵比值。从而计算出语音y中的语音端点。结果如图2所示。
2.2.2能熵比法
设语音信号时域波形为X(n),加窗分帧处理后得到的第i帧语音信号为Xi(m),则
FFT后表示为Xi(k),其中下标i表示为第i帧,而k表示为第k条谱线。该语音帧在频域中的短时能量为
??
2
????= Xi k ?????(??)
??=0
式中,N为FFT的长度,只去正频率部分。
而对于某一谱线k的能量谱为Yi k =Xi k ?Xi(k),则每个频率分量的归一化谱概率密
度函数定义为
???? ?? =
该语音帧的短时谱熵定义为
??/2
????(??)
/2 ????(??)??=0??
=
????(??)
??=0,1,…,???1 ????
????=? ????(??)??????????(??)
??=0
其中,只取正频率部分的谱熵,对应的能熵比表示为
????????= 1+|????/????|
2.2.3代码编写
在主程序中,执行的是[voiceseg,vosl,SF,Ef]=pitch_vad1(y,fn,T1); 而调用了以下函数
function [voiceseg,vosl,SF,Ef]=pitch_vad1(y,fn,T1,miniL) ifnargin<4, miniL=10; end
if size(y,2)~=fn, y=y'; end % 把y转换为每列数据表示一帧语音信号
wlen=size(y,1); % 取得帧长 for i=1:fn
Sp = abs(fft(y(:,i))); % FFT取幅值(:表示所有 y(:,1)表示第一列)
Sp = Sp(1:wlen/2+1); % 只取正频率部分
Esum(i) = sum(Sp.*Sp); % 计算能量值 (能量放入Esum里) prob = Sp/(sum(Sp)); % 计算概率
H(i) = -sum(prob.*log(prob+eps)); % 求谱熵值(eps表示很小的数,避免为零)(谱熵放入H里)
end
hindex=find(H<0.1);%(find返回非零元素,hindex放入,即谱熵值小于0.1的索引)
H(hindex)=max(H);%(除去元音)
Ef=sqrt(1 + abs(Esum./H)); % 计算能熵比(将每一帧的能熵比放入Ef里)
Ef=Ef/max(Ef); % 归一化
zindex=find(Ef>=T1); % 寻找Ef中大于T1的部分
zseg=findSegment(zindex); % 给出端点检测各段的信息 zsl=length(zseg); % 给出段数 j=0;
SF=zeros(1,fn);
for k=1 : zsl % 在大于T1中剔除小于miniL的部分
ifzseg(k).duration>=miniL j=j+1;
in1=zseg(k).begin; in2=zseg(k).end; voiceseg(j).begin=in1; voiceseg(j).end=in2;
voiceseg(j).duration=zseg(k).duration;
SF(in1:in2)=1; % 设置SF(有话段的SF帧为1)
end end
vosl=length(voiceseg); % 有话段的段数
2.2.4实验结果
图1 “妈妈,好吗,上马,骂人”语音的时域波形
图2图中实线代表语音起始点,虚线代表语音终点
2.2.5结果分析
基音周期是语音信号的重要参数之一,它描述了语音激励源的一个重要特征。语音的头、尾部并不能具有声带振动那样的周期性,也就是检测不到相应的基音周期。如果要进行基音周期的计算,首要的必然是检测语音端点,将有话段从整段语音中分离出来,才能开始对语音的基音周期进行计算.
利用能熵比法检测语音端点后,该语音段可分为四段,每段的起点以及终点如图二所示. 2.3总结
语音的预处理是非常关键的一环,做好这个实验的关键在于理解matlab语句的作用,录入语音信号,设定好参数,进行分帧处理,并通过能熵值的大小标比较,确定好语音信号的端点。
通过这次的检测,我了解了Matlab函数库非常的多,理解起来需要查阅很多公式以及资料,非常的耗时。做实验务必讲究认真专心,一步一个脚印的去做好每一个环节就可以了,与队友的配合以及沟通也是重要的一环,及时了解队友的情况,做好衔接。
3. 模块二(基音检测中的带通滤波器) 3.1主要负责工作
用带通滤波器减少共振峰的干扰。 3.2具体实现方法
3.2.1算法原理
在使用相关法和AMDF法的基音检测之前常用到低通滤波器和带通滤波器,其主要目的
相关推荐: