基于短时自相关函数法的基音周期检测
- 格式:doc
- 大小:470.50 KB
- 文档页数:14
华南理工大学《语音信号处理》实验报告实验名称:基音周期估计姓名:学号:班级:10级电信5班日期:2013年5 月15日1.实验目的本次试验的目的是通过matlab编程,验证课本中基音周期估计的方法,本实验采用的方法是自相关法。
2. 实验原理1、基音周期基音是发浊音时声带震动所引起的周期性,而基音周期是指声带震动频率的倒数。
基音周期是语音信号的重要的参数之一,它描述语音激励源的一个重要特征,基音周期信息在多个领域有着广泛的应用,如语音识别、说话人识别、语音分析与综合以及低码率语音编码,发音系统疾病诊断、听觉残障者的语音指导等。
因为汉语是一种有调语言,基音的变化模式称为声调,它携带着非常重要的具有辨意作用的信息,有区别意义的功能,所以,基音的提取和估计对汉语更是一个十分重要的问题。
由于人的声道的易变性及其声道持征的因人而异,而基音周期的范围又很宽,而同—个人在不同情态下发音的基音周期也不同,加之基音周期还受到单词发音音调的影响,因而基音周期的精确检测实际上是一件比较困难的事情。
基音提取的主要困难反映在:①声门激励信号并不是一个完全周期的序列,在语音的头、尾部并不具有声带振动那样的周期性,有些清音和浊音的过渡帧是很难准确地判断是周期性还是非周期性的。
②声道共振峰有时会严重影响激励信号的谐波结构,所以,从语音信号中直接取出仅和声带振动有关的激励信号的信息并不容易。
③语音信号本身是准周期性的(即音调是有变化的),而且其波形的峰值点或过零点受共振峰的结构、噪声等的影响。
④基音周期变化范围大,从老年男性的50Hz到儿童和女性的450Hz,接近三个倍频程,给基音检测带来了一定的困难。
由于这些困难,所以迄今为止尚未找到一个完善的方法可以对于各类人群(包括男、女、儿童及不向语种)、各类应用领域和各种环境条件情况下都能获得满意的检测结果。
尽管基音检测有许多困难,但因为它的重要性,基音的检测提取一直是一个研究的课题,为此提出了各种各样的基音检测算法,如自相关函数(ACF)法、峰值提取算法(PPA)、平均幅度差函数(AMDF)法、并行处理技术、倒谱法、SIFT、谱图法、小波法等等。
基音检测技术及其在语音信号处理中的应用研究摘要:本文先对自相关函数法、平均幅度差函数法、倒谱法、小波变换法这四种经典的基音检测方法的原理进行分析;然后用MATLAB软件完成了基于短时自相关函数法、倒谱法的基音检测。
通过实验可知,这两种方法针对实验室环境下的一帧语音信号比较准确,但在噪声环境下不够理想。
为了克服这两种方法的不足,本文对它们均做了改进,对于短时自相关函数法增加了预处理,使得基音轨迹曲线更加明显。
在对基音检测的倒谱法进行分析时,提出了一种功率谱二次处理的二次谱基音检测方法,该方法克服了倒谱法基音检测的抗噪能力低的弱点,基音轨迹曲线估计的准确性也得到了改善。
关键词:基音检测;短时能量;自相关函数;倒谱函数;预处理;基音轨迹Abstract:Four typical pitch detection methods are analyzed firstly, i.e, autocorrelation function, average magnitude difference function, cepstrum, and wavelet transform. The pitch detection based on short time energy autocorrelation function and cepstrum functions are implemented with MATLAB. The experimental results show that both methods work well for the speech in the lab. But for the noised signal, the detection performance is not so good. In order to overcome these shortcomings,some improvements are presented in this article .For the short time autocorrelation, there introduce the pro-processing operations ,as a result ,the accuracy of the estimated pitch contour is improved. The cepstrum method of speech pitch detection is analyzed carefully,and also propose a secondary processing power spectrum of secondary spectrum pitch detection methods. It used the power spectrum reprocessing results of speech to extract the pitch contour. The presented method not only overcame the shortcomings of cepstrum method, but also improved the accuracy of the estimated pitch contour.Keywords:pitch detection;short time energy;autocorrelation function;cepstrum function;pro-processing;pitch contour前言基音是指发浊音时声带振动所引起的周期性,而声带振动频率的倒数就是基音周期。
一种改进的基音周期检测方法曾树华【摘要】提出了一种改进的基于自相关算法的基音周期检测方法,首先对信号进行了预滤波.消除二次谐波的影响.计算自相关系数时使用的是削波后的数据,大大降低了计算复杂度,野波平滑在保持周期的阶跃性的同时去除野波.【期刊名称】《电声技术》【年(卷),期】2011(035)004【总页数】3页(P53-55)【关键词】基音周期检测;自相关;滤波;削波;平滑【作者】曾树华【作者单位】湖南铁路科技职业技术学院,湖南,株洲,412003【正文语种】中文【中图分类】TN912语音是人类相互交流和通信最方便快捷的手段。
人类发音时,声门从一次开启到下一次开启就形成一个基音周期,而基音频率是基音周期的倒数。
基音频率是一个重要的参数,因此准确检测基音频率具有十分重要的意义。
由于基音周期[1]只具有准周期性,所以只能采用短时平均方法估计该周期,这个过程也称为基音检测(Pitch Detection)。
基音检测的方法主要有短时自相关函数法、平均幅度差函数法、倒谱解卷积法、Hilbet—Huang变换法、小波变换[2]等。
笔者提出一种改进的基于自相关函数法的基音检测方法,并在Matlab上进行仿真,实验证明,准确性得到提高。
基音周期检测分为取样、分帧、短时能量分析、自相关计算和基音周期估计,如图1所示。
取样的点数一般为帧长的整数倍,而帧长一般选15~30 ms(8 000 Hz,120~240点),短时能量分析的目的是进行清浊判别,再通过计算信号的自相关来判断信号x(n)的周期。
取样与分帧:取样是指从语音信号中取出一部分进行分析,一般取样点为帧长的整数倍。
基音的准周期性要求对语音信号采用短时分析,需要把语音信号分成一段一段来进行分析,这就是分帧。
对信号进行加窗来分帧,窗长度一般应大于基音周期的两倍,所以一般选择120~240点(8 000 Hz,15~30 ms)。
短时能量分析:语音信号的大部分能量集中在浊音段,所以浊音段的短时能量会远远大于清音段,据此可以判断清浊音的起止时间。
用修正的短时自相关检测语音的基音周期一、实验目的1.熟悉前一个实验程序以及中心削波的意义。
.2.用Matlab实现用修正的短时自相关检测语音的基音周期。
3.分析修正的短时自相关在基音周期检测中的应用。
4.能够对程序进行重新编制。
二、实验原理如果x(n) 是一个周期为P 的信号,则其自相关函数也是周期为P的信号,且在信号周期的整数倍处,自相关函数取最大值。
语音的浊音信号具有准周期性,其自相关函数在基音周期的整数倍处取最大值。
计算两相邻最大峰值间的距离,就可以估计出基音周期。
观察浊音信号的自相关函数图,其中真正反映基音周期的只有少数几个峰,而其余大多数峰都是由于声道的共振特性引起的。
因此为了突出反映基音周期的信息,同时压缩其他无关信息,减小运算量,有必要对语音信号进行适当预处理后再进行自相关计算以获得基音周期。
第一种方法是先对语音信号进行低通滤波,再进行自相关计算,因为语音信号包括十分丰富的谐波分量,基音频率的范围分布宰0~500Hz左右,即使女高音升c调最高也不会超过1Kz,所以采用1Kz的低通滤波器先对语音信号进行滤波,保留基音频率,再用2Kz采样频率进行采样;最后用2~20ms的滞后时间计算短时自相关,帧长取10~20ms,即可估计出基音周期。
且中心削波函数如式(3-1)取本帧语音幅度的60%~70%。
将削波后的序列f(x) 用短时自相关函一般削波电平XL数估计基音周期,在基音周期位置的峰值更加尖锐,可以有效减少倍频或半频错误。
三、实验要求1.实验前自己用Cool Edit 音频编辑软件录制浊音部分,并把它保存为.txt文件。
2.分别取长度N=160和N’=N+K的矩形窗函数作用于语音信号上,首先对其进行中心削波,比较削波前和削波后语音信号波形,并使得削波后的信号进行乘积并求和,计算延迟为0<K<160时的相关值,并且用得到的相关值来检测语音信号的基音周期,用MA TLAB画出图形。
项目总结报告—基音周期的检测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能熵比法设语音信号时域波形为,加窗分帧处理后得到的第i帧语音信号为,则FFT后表示为,其中下标i表示为第i帧,而k表示为第k条谱线。
该语音帧在频域中的短时能量为式中,N为FFT的长度,只去正频率部分。
而对于某一谱线k的能量谱为,则每个频率分量的归一化谱概率密度函数定义为该语音帧的短时谱熵定义为其中,只取正频率部分的谱熵,对应的能熵比表示为2.2.3代码编写在主程序中,执行的是[voiceseg,vosl,SF,Ef]=pitch_vad1(y,fn,T1);而调用了以下函数function [voiceseg,vosl,SF,Ef]=pitch_vad1(y,fn,T1,miniL)if nargin<4, miniL=10; endif size(y,2)~=fn, y=y'; end % 把y转换为每列数据表示一帧语音信号wlen=size(y,1); % 取得帧长for i=1:fnSp = 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里)endhindex=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 的部分if zseg(k).duration>=miniLj=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)endendvosl=length(voiceseg); % 有话段的段数2.2.4实验结果图1 “妈妈,好吗,上马,骂人”语音的时域波形图2 图中实线代表语音起始点,虚线代表语音终点2.2.5结果分析基音周期是语音信号的重要参数之一,它描述了语音激励源的一个重要特征。
语音的头、尾部并不能具有声带振动那样的周期性,也就是检测不到相应的基音周期。
如果要进行基音周期的计算,首要的必然是检测语音端点,将有话段从整段语音中分离出来,才能开始对语音的基音周期进行计算.利用能熵比法检测语音端点后,该语音段可分为四段,每段的起点以与终点如图二所示.2.3总结语音的预处理是非常关键的一环,做好这个实验的关键在于理解matlab语句的作用,录入语音信号,设定好参数,进行分帧处理,并通过能熵值的大小标比较,确定好语音信号的端点。
通过这次的检测,我了解了Matlab函数库非常的多,理解起来需要查阅很多公式以与资料,非常的耗时。
做实验务必讲究认真专心,一步一个脚印的去做好每一个环节就可以了,与队友的配合以与沟通也是重要的一环,与时了解队友的情况,做好衔接。
3.模块二(基音检测中的带通滤波器)3.1主要负责工作用带通滤波器减少共振峰的干扰。
3.2具体实现方法算法原理在使用相关法和AMDF法的基音检测之前常用到低通滤波器和带通滤波器,其主要目的是减少共振峰的干扰。
在文献中作者选用了500Hz作为滤波器的上限频率,并指出选择截止频率高不利于减少噪声和共振峰的影响。
所以在本书的基音检测中的预滤波器选择的带宽为60~500Hz,高频截止频率选择500Hz,是因为基频区间的高端就在这个区域中,低频截止频率选择60Hz是为了减少工频和低频噪声的干扰。
我们选用IIR滤波器中的椭圆滤波器,因为IIR滤波器的运算量比FIR少,当然IIR滤波器会带来延迟,也就是相位的变化,但语音信号是对相位不敏感的信号;又选用椭圆滤波器,因为它在经典滤波器设计中相同过渡带和带宽条件下,需要的阶数比较小。
在阶数相同的条件下,椭圆滤波器相比于其他类型的滤波器,能获得更窄的过渡带宽和较小的阻带波动, 就这点而言, 椭圆滤波器是最优的。
滤波器的要求为采样频率8000Hz,通带是60~500Hz,通带波纹为1dB,阻带分别为30Hz和2000Hz,阻带衰减为40dB。
3.2.2代码编写%% pr8_1_1clear all; clc; close all;fs=8000; fs2=fs/2; % 采样频率Wp=[60 500]/fs2; % 滤波器通带Ws=[20 2000]/fs2; % 滤波器阻带Rp=1; Rs=40; % 通带的波纹和阻带的衰减[n,Wn]=ellipord(Wp,Ws,Rp,Rs); % 计算滤波器的阶数[b,a]=ellip(n,Rp,Rs,Wn); % 计算滤波器的系数fprintf('b=%5.6f %5.6f %5.6f %5.6f %5.6f %5.6f %5.6f\n',b)fprintf('a=%5.6f %5.6f %5.6f %5.6f %5.6f %5.6f %5.6f\n',a)[db, mag, pha, grd,w]=freqz_m(b,a); % 求取频率响应曲线plot(w/pi*fs/2,db,'k'); % 作图grid; ylim([-90 10]);xlabel('频率/Hz'); ylabel('幅值/dB');title('椭圆6阶带通滤波器频率响应曲线');实验结果由程序计算出滤波器系数为:b=0.012280 -0.039508 0.042177 0.000000 -0.042177 0.039508 -0.012280a=1.000000 -5.527146 12.854342 -16.110307 11.479789 -4.4101790.713507实验结果图:图3 滤波前和后的语音信号结果分析带通滤波器使原始信号变得更加平整,滤去了杂音,为基音检测减少干扰,使检测更加顺利进行。
3.3总结通过这次课程实践,我深刻体会到自己在课程理论方面的不足,MATLAB的应用也相当生疏。
在设计过程中,看不懂的东西很多,但是学会了通过上网搜查资料和自主从书本寻找知识。
实践中遇到许多问题,但是和同学分工合作与讨论让我学会了很多平常学不到的知识。
这次实践让我明白知识就像大海一样宽广,我们要像海绵吸水一样吸取有用的知识。
4.模块三(短时自相关函数法做基音检测)4.1主要负责工作在前面两个步骤之后用自相关函数法去实现基音周期的检测4.2具体实现方法4.2.1算法设语音信号的时间序列x(n),它的自相关函数定义为:R(k)=Σx(n)x(n-k),K是时间的延迟量。
短时自相关函数有以下重要性质:①如果信号x(n))具有周期性,周期是P,那么它的自相关函数R(k) 也具有周期性,而且周期与信号x(n)的周期性相同。
②当k=0时,短时自相关函数具有最大值,即在延迟量为0,±P,±2P,,,时,周期信号的自相关函数也达到最大值。
③短时自相关函数是偶函数,即R(k) =R(-k)。
短时自相关函数基因检测的主要原理大都是利用它的这些性质,通过比较原始信号和它的延迟后的信号之间的类似性质来确定基音周期。
如果延迟量等于基音周期,那么两个信号具有最大类似性,或是直接找出短时自相关函数的两个最大值间的距离,即为基音周期的初估值。
在用短时自相关函数检测基音是,常用归一化的短时自相关函数,表达式为 r(k)= R(k)/ R(0)以上性质②中已指出,k=0,R(0)为最大值。
所以r(k)的模值永远小于或等于1。
已知基音频率围为60Hz~500Hz之间,采样率为fs时,则基音周期(样点值)围在fs/500~fs/60之间,然后在这个围之间寻找归一化相关函数的最大值,对应的延迟量就是基音周期。
4.2.2代码编写步骤①根据前面步骤所得分帧后的语音数组,对它进行处理,把它转换为每一列数据表示一阵语音信号,行数为总的帧长。
②对每一帧语音信号的基音周期进行初始化,让其为零保证清音段无基音周期。
③利用前面端点检测后所得的有话段和有话段段数,对每一段的有话段的每一帧数据计算归一化自相关函数。
④最后对每一帧所得的归一化自相关函数取正延迟量的部分,然后在基音频率围得最大值,从而可得最大值对应的样点数,利用函数循环计算,最后可以得出每段有话段每一帧的基音周期。
代码编写用短时自相关函数法的程序:function period=ACF_corr(y,fn,vseg,vsl,lmax,lmin)pn=size(y,2);if pn~=fn, y=y'; end % 把y转换为每列数据表示一帧语音信号wlen=size(y,1); % 取得帧长period=zeros(1,fn); % 初始化for i=1 : vsl % 只对有话段数据处理ixb=vseg(i).begin;ixe=vseg(i).end;ixd=ixe-ixb+1; % 求取一段有话段的帧数for k=1 : ixd % 对该段有话段数据处理u=y(:,k+ixb-1); % 取来一帧数据ru= xcorr(u, 'coeff'); % 计算归一化自相关函数ru = ru(wlen:end); % 取延迟量为正值的部分[tmax,tloc]=max(ru(lmin:lmax)); % 在基音频率围寻找最大值period(k+ixb-1)=lmin+tloc-1; % 给出对应最大值的延迟量endend实验结果图4 端点检测的语音信号图5 有话段的基音周期结果分析在端点检测和滤波后,经过短时自相关函数法处理后,由上面的实验结果图可看出基音周期有很多的偏离点即野点,需要进行平滑处理,也可以看出基音周期大约为40个样点数,即基音周期为40/fs,采样率为8000Hz,得周期为0.005s,基音频率为200Hz.4.3总结通过这次设计,我深刻体会到在信号处理方面我的严重不足,MATLAB的应用也相当生疏。