您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 交通运输 > (620512681)自相关基频提取算法的MATLAB实现
第31卷总第80期西北民族大学学报(自然科学版)V01.31.No.42010年12月JournalofNonhw铭tUniversityforNationalities(NaturalScience)Dec,2010自相关基频提取算法的MATLAB实现马效敏1,郑文思2,陈琪2(西北民族大学科研处,甘肃兰州730030;2.中国民族信息技术研究院,甘肃兰州730030)孽膊-聘妒掣摩护-庸、护岬—b序妒峰庸护峥高、。,砖、—气—昏尊舟峥舟、-,南[摘要]在对自相关基音检测算法进行分析的基础上,对自相关基频提取算法进行了探讨.考虑到检测准确度和检测速率两方面的因素,结合带通滤波及三电平削波模块,设计了基于Madab的估计方法,然后通过对一段具体的语音进行处理,得到了比较准确的浊音语音的基音周期.实验证明。该方法简单有效.【关键词]Matlab;基音检测;自相关函数;三电平削波[中图分类号】TP391[文献标识码]A[文章编号]1009—2102{2010104—0054—05O引言基频是指浊音发声过程中声带振动的频率.它是语音信号中的重要参数之一,在语音识别、语音合成和语音编码中有广泛的应用.由于语音信号变化十分复杂,声门激励信号并不是一个完全周期的序列、不同发声类型声带振动的复杂性和不同信号在反映声带振动时的差异有时会严重影响到激励信号的基频检测.同时,基音周期变化范围大,从老年男性的80Hz到儿童女性的500Hz。接近三倍频程.这些困难使得基频检测一直没有得到很好的解决,所以虽然已经提出各种各样的基音检测算法,如自相关函数(ACF)法、峰值提取算法(PPA)、平均幅度差函数(AMDF)法等及基于它们的改进算法,但没有一种算法,在各种环境条件下对各类人群都能获得满意的检测结果.此外,声道特性与基音周期估计有关,会对基频提取造成一定干扰.从语音信号中去除声道的影响,直接取出仅与声带振动有关的声源信息并非易事.声道共振峰可能强烈改变声门波形的结构,从而严重影响激励信号的谐波结构⋯,给基音检测造成困难.因此,减少声遭共振峰的影响对基频提取尤为重要.减少共振峰影响通常可用的方法:①采用带通滤波.②采用中心削波.本文在采用滤波和削波的基础上,对用自相关函数提取语音基频进行了探讨.对于一段具体的语音信号先通过带通滤波去掉语音信号中的高次共振峰,然后从语音信号中选取一段样本并将样本中获得的语音样值点分为若干个语音帧;再经过三电平削波滤除大多数次要的峰,只保留明显的周期性的峰.再用自相关函数求出自相关序列,并把自相关序列的周期转化为频率.最后通过中值平滑进行后处理,平滑掉半频点、倍点和随机错误点,较准确地提取出浊音语音信号的基音频率.1基频提取算法原理自相关函数的性质:若原信号具有周期性,那么它的自相关函数也具有周期性,并且周期与原信号的周期相同.清音信号没有周期性,它的自相关函数R(”会随着k的增大呈衰减趋势.浊音信号具有准周期性,它的R(k)在基音周期整数倍上有很大的峰值,通常取第一最大峰值点为基音周期点.自相关函数法基音检测正是利用这一性质对语音信号进行基音检测的,同时结合滤波和三电平削波及[收稿日期]2010—10—20[作者简介]马效敏(1967一),男,甘肃临夏人,讲师,主要从事计算机应用技术方面的研究_。——54--——万方数据后处理使基频提取更准确、高效.1.1带通滤波语音基音的频率范围是50Hz~450Hz,为了保留语音的一二次谐波以保证正确的处理结果,一般先使语音信号通过一个频率范围为60Hz~900Hz的带通滤波器,下截止频率为60Hz可以抑制电源的干扰,上截止频率为900Hz不但可以保留基音的一二次谐波,还可以滤掉高次谐波【2|.在语音信号中,基音的频率一般在100Hz~200Hz之间,而第一共振峰在300Hz~1000Hz之间,通过带通滤波器,可以去掉语音信号中的高次共振峰.实验表明,滤波处理后的信号只含有第一共振峰以下的基波和谐波分量,明显改善了检测效果.1.2采样分帧这里的“采样”是指从语音信号中选取一段样本,一般取样点数为帧长的整数倍.每秒钟的采样样本数叫做采样频率.分帧主要完成将取样模块中获得的语音样值点分为若干个语音帧.语音是不平稳的时变信号,在时间足够短的情况下,可以近似认为是平稳的,短时分析将语音流分为一段一段来处理,每一段就被称为一“帧”.分帧时需对语音信号进行加窗操作,即用一个有限长度的窗序列截取一段语音信号来进行分析.该窗函数可以按时间方向滑动,以便分析任一时刻附近的信号.常见的窗函数有:方窗、Hamming窗及Harm窗.如果把窗函数理解成为某个滤波器的单位冲激响应,由于窗函数一般是中间大两头小的光滑函数,因此该滤波器具有低通特性.窗口长度的选择非常重要,窗长过短会使分析窗内没有包含足够的数据点来进行周期判断,且短时能量变化剧烈窗长过长,短时能量是一段长时间的平均,不但不能反映语音信号基频的细节变化部分,而且使得计算量增大.窗口长度至少要大于基音周期的两倍.1.3三电平削波自相关函数提基频,运算量很大,其原因是乘法运算非常费时.然而从提取基频的角度看,短时自相关函数所包含的信息许多是多余的,用自相关函数提取基音频率时,关心的是时间,也就是自相关函数峰值出现的位置,而与峰值本身大小没有什么关系.这样就可以采用三电平削波法,其输入输出关系式为:卜“行?CL1Y(玎)=C7[z(n)]=0,lz(行)l≤CL},【一1,z(n)一CLJ即削波器的输出在z(竹)C/.时为1,z(n)一CL时为一1,除此以外都为0.这样可以增加刚刚超过电平的峰的重要性,滤除大多数次要的峰,只保留了明显的具有周期性的峰,避免了对清音段不必要的分析处理,这对后期处理有很大的好处.削波电平由语音信号的峰值幅度来确定,它等于语音段最大幅度的一个固定百分数.这个门限的选择是重要的,由于在整个语音段的持续时间内,信号幅度可能有较大变化,因此,采用较高的削波电平可能会把一些有用的波形削去,然而削波电平太低,又达不到应用的效果.所以在不损失基音信息的情况下应尽可能选得高些,以达到较好的效果.1.4自相关函数经三电平削波后:自相关函数的计算极为简单.用Y(n)表示削波器的输出,则短时自相关函数如下所示:N一1一KR(k)=芝:[Y(咒+仇)硼7(优)][Y(,l+优+k)W7(m+k)].,A=0由自相关函数的定义可以看出其所具有的一些性质:1)自相关函数是偶函数,满足R(k)=R(一k);2)k=0时函数取得最大值;3)如果原序列是周期为丁的周期信号,那么自相关函数也是周期为T的周期函数,即一55—万方数据R(愚)=R(T+k)⋯.1.5基频计算因为浊音语音的自相关函数具有一定的周期性,在相隔一定的取样后,自相关函数达到最大值.浊音语音的周期可用自相关函数中的第一个峰值的位置来估算.得到语音的周期后,根据周期与频率的倒数关系就可容易得到语音频率.1.6后处理没有任何一种预测方法能够准确计算出所有的基音频率.往往大部分的点是比较准确的,但基音频率轨迹中总是会有一个或几个基音频率的估计值偏离了正常的轨迹(通常是偏离到正常值的两倍或1/2),称这种偏离点为基音轨迹的“野点”.此时为了去除这些野点,可以采用各种平滑算法,其中最常用的是中值平滑算法、线性平滑算法及组合平滑算法.此处采用的是中值平滑处理.中值平滑处理的基本原理是:设z(ft)为输入信号,Y(咒)为中值滤波器的输出,采用一个滑动窗,输出值就是将窗外的中心移到咒处时窗口输入样点的中值,及扎点的左右各取L个样点.连同被平滑点中心共同构成一组信号采样点(共2L+1个样值),然后将这(2+1)个样点按大小序列排成一排,此序列中中间者作为平滑器的输出.L值一般为1或2,即中值平滑处的“窗口”一般套住3个或5个样点.中值平滑的优点是既可以有效地除去少量的野点,又不会破坏基音周期轨迹中两个平滑段之间的阶跃性变化[4I.2算法实现与实验结果Matlab作为mathworks公司的高性能的数值计算和可视化软件,集成数值分析、矩阵计算、信号运算、信号处理和图形显示于一体,构成了一个方便且界面友好的用户环境.以下,我们在voicebox工具箱的帮助下完成对一段具体语音的基频提取.2.1带通滤波图1为语音信号波形图,图2为滤波前后波形图对照.很明显,滤波后谐振峰的影响被削弱了,语音波形得到了改善,而且信号能量比较集中.图1语音信号波形图图2滤波前后波形图对照2.2三电平削波三电平消波Matlab程序如下:forJJ=1iNif(data(jj)Amax)data(jj)=1;一56一万方数据elseif(data(jj)一Amax)data(jj)=一l;elseif(data(jj)(=Amax&&data(jj))=一Amax)data(jj)=0;endend其中Amax取最大幅值的0.65,data存放的是加窗之后的数据,长度为一帧.其中一帧语音经Matlab编程削波处理后的语音波形如图3所示.图3削波前后波形图对照图4基颏轨迹2.3自相关求基频经过三电平滤波后,自相关函数的计算由繁复的乘法运算变为简单的逻辑组合,其Matlab实现如下:fork=1:N一1%求自相关序列forjj=1:N—kR(k)=R(k)+data(jj)*data(jj+k);endend其中N为每一帧的长度.由信号周期转换为频率的Matlab程序为:value(ii)=Fs/find-maxn(R).其中Fs为采样频率,读取语音时获得,find—maxn(R)为寻找最大峰值位置的函数,其具体实现为:zer=find(r==0);%找第一个零点如果存在clozer;%找第一近零点ii=1:while(dozer=O)if(r(ii)0&&r(ii+1)0&&(ii+1)length(r))dozer=ii;endii=ii十l:ifii==length(r)%没有找到符合要求的点dozer21;endendiflength(zer)0%检查是否存在零点一57—万方数据ifzer(1)clozer%存在,则和clozer比较大小,用于去除前点对基音周期的查找带来的影响clozer=zer(1);endendr(1:clozer)=0;%去除影Ⅱ向maxn=max(r);%找最大值temp=find(r==rnaxn);%返回第一个最大值nmax=temp(1);2.4后处理在后处理之前先对频率数组执行去除大野点操作,即将偏移值超出均值的1/5的基音频率值去除,后处理采用中值平滑算法,具体实现如下:aver=mean(value)%基音频率的平均值,未去除野点value-vaIue(1。gical(abs(value—aver)=aver/5));%找出偏移均值超出均值的1/5的基音频率,将其去除len=length(value)%去除大野点后剩余的基音点数forJJ=1:3:len/4%中值平滑,滑动窗口宽度3,精度为中值1/4(剔除野点)average=(value(jj)+value(jj+1)+value(jj十2))/3;forkk=1:3ifabs((value(jj一1+kk))一average)average/4value(jj一1+kk)=O;%将野点置零endendendvalue=value((value=0));%除去所有野点后的基音频率数组以男声汉语普通话b6为例,经处理后得到的基频轨迹如图4所示.3总结本文中自相关函数法通过带通滤波减小了共振峰的影响,同时采用了三电平削波方法,避免了自相关函数中繁杂的乘法运算,从而提高了程序的运行速度及准确度.实验表明,本文所用方法能较精确地提取出具体语音的基频.笔者在对自相关基音检测基本原理进行分析的基础上,设计了Matlab算法实现方案,通过浊音的自相关函数波形图进行语音的基音检测,得到了较好的结果,且算法结构简单,运算量小.由于使用Matlab编程,计算中有很多现有的函数可以利用,更有一些免费的第三方工具的支持,结
本文标题:(620512681)自相关基频提取算法的MATLAB实现
链接地址:https://www.777doc.com/doc-3042689 .html