1、语音信号特征的提取摘 要随着计算机技术的发展,语音交互已经成为人机交互的必要手段,语音特征参数的精确度直接影响着语音合成的音质和语音识别的准确率。因此语音信号参数提取是语音信号处理研究中一项非常有意义的工作。本文采用Matlab软件提取语音信号特征参数,首先对语音信号进行数字化处理,其次,进行预处理,包括预加重、加窗和分帧,本文讨论了预处理中各种参数的选择,以使信号特征提取更加准确。第三,讨论了各种时域特征参数的算法,包括短时能量、短时过零率等。 关键词:语音信号, 特征参数, 提取, Matlab目 录第一章 绪论1.1语音信号特征提取概况1.1.1研究意义语音处理技术广泛应用于语音通信系统
2、、声控电话交换、数据查询、计算机控制、工业控制等领域,带有语音功能的计算机也将很快成为大众化产品,语音将可能取代键盘和鼠标成为计算机的主要输入手段,为用户界面带来一次飞跃。语音信号特征的提取是语音信号处理的前提和基础,只有分析出可表示语音信号本质特征的参数,才有可能利用这些参数进行高效的语音通信和准确的语音识别,才能建立语音合成的语音库。因此语音信号参数提取是语音信号处理研究中一项非常有意义的工作。1.1.2 发展现状语音信号处理是一门综合性的学科,包括计算机科学、语音学、语言学、声学和数学等诸多领域的内容。它的发展过程中,有过两次飞跃。第一次飞跃是1907年电子管的发明和1920年无线电广播
3、的出现,电子管放大器使很微弱的声音也可以放大和定量测量,从而使电声学和语言声学的一些研究成果扩展到通信和广播部门;第二次飞跃是在20世纪70年代初,电子计算机和数字信号处理的发展使声音信号特别是语音信号,可以通过模数转换器(A/D)采样和量化转换为数字信号,这样就可以用数字计算方法对语音信号进行处理和加工,提高了语音信号处理的准确性和高效性。语音信号处理在现代信息科学中的地位举足轻重,但它仍有些基础的理论问题和技术问题有待解决,这些难题如听觉器官的物理模型和数学表示及语音增强的技术理论等,目前还有待发展。1.2 本课题研究内容本文主要介绍语音信号处理的理论及Matlab的相关内容,然后从Mat
4、lab仿真角度验证了录音、预处理、提取语音信号时域特征参数,主要讨论了预处理中各种参数的选择,以使信号特征提取更加准确。再次讨论了各种时域特征参数的算法,包括短时能量、短时过零率等,介绍了各环节的不同软件实现方法。最后对基于Matlab的语音信号特征参数提取进行总结。 第二章 Matlab简介MATLAB是国际上仿真领域最权威、最实用的计算机工具。它是MathWork公司于1984年推出,它以强大的科学计算与可视化功能、简单易用、开放式可扩展环境,特别是所附带的30多种面向不同领域的工具箱支持,使得它在许多科学领域中成为计算机辅助设计和分析、算法研究和应用开发的基本工具和首选平台。2.1 发展
5、概况Matlab是Matrix Laboratory(矩阵实验室的缩写),最初由美国Cleve Moler博士在70年代末讲授矩阵理论和数据分析等课程时编写的软件包Linpack与Eispack组成,旨在使应用人员免去大量经常重复的矩阵运算和基本数学运算等繁琐的编程工作。1984年成立的Math Works公司正式把Matlab推向市场,并从事Matlab的研究和开发。1990年,该公司推出了以框图为基础的控制系统仿真工具Simulink,它方便了系统的研究与开发,使控制工程师可以直接构造系统框图进行仿真,并提供了控制系统中常用的各种环节的模块库。1993年,Math Works公司推出的Ma
6、tlab4.0版在原来的基础上又作了较大改进,并推出了Windows版,使命令执行和图形绘制可以在不同窗口进行。1994年推出了Matlab4.2版本,并得到广泛的重视和应用。1999年,推出了Matlab5.3版本,真正实现了32位运算,其速度更快、功能更完善、界面更友好,并提供了Internet搜索引擎,可以协助用户寻求在线帮助。版本6.0、6.1又作了更精细的改进,增加了许多新的功能。版本7.0、7.1包括拥有数百个内部函数的主包和三十几种工具包。工具包又可以分为功能性工具包和学科工具包。功能工具包用来扩充Matlab的符号计算,可视化建模仿真,文字处理及实时控制等功能。学科工具包是专业
7、性比较强的工具包,控制工具包,信号处理工具包,通信工具包等都属于此类。2.2 主要功能MATLAB之所以成为世界流行的科学计算与数学应用软件,是因为它有着强大的功能。MATLAB是一种应用于计算技术的高性能语言。它将计算、可视化和编程结合在一个易于使用的环境中,此而将问题解决方案表示成我们所熟悉的数学符号,其典型的使用包括:数学计算运算法则的推导模型仿真和还原数据分析,采集及可视化MATLAB是一个交互式系统,它的基本数据元素是矩阵,且不需要指定大小。通过它可以解决很多技术计算问题,尤其是带有矩阵和矢量公式推导的问题。2.3 信号处理工具箱Matlab的信号处理工具箱是信号算法文件的集合,它的
8、推出扩展了Matlab在信号处理领域的应用,为其研究和工程应用提供了有力的基础,应用此工具箱可直观、方便地进行信号分析、数值计算及系统设计等工作,从波形的产生到滤波器的实现和设计,参数建模,谱分析,简化了编程,节省了时间。它处理的基本对象是信号与系统,包含了信号处理中经常使用的近200个函数,根据其功能,可以分为20类,经常使用的函数如下所示。滤波器分析:abs 求绝对值(幅值),conv 求卷积,filter 直接滤波器实现等;IIR滤波器设计: FIR滤波器设计:fir1 基于窗函数的FIR滤波器设计标准响应,fir2 基于窗函数的FIR滤波器设计等;变换:czt 线性调频Z变换,idct
9、 逆离散余弦变换,ifft 一维逆快速傅里叶变换等;窗函数:boxcar 矩形窗,hamming 海明窗,hanning 汉宁窗,chebwin 切比雪夫窗等;参数化建模:lpc 线性预测系数等。 2.4 录音工具在Matlab环境中,可以通过多种编程方法驱动声卡,实现对语音信号的采集和回放。同时由于Matlab是一个数据分析和处理功能十分强大的工程使用软件,它的信号处理与分析工具箱提供了十分丰富的功能函数,利用这些函数可以快捷地完成语音信号处理和分析以及信号的可视化,使人机交互更加便捷。在Matlab环境中,主要可以通过以下3种方法驱动声卡,采集语音信号:将声卡作为对象处理采集语音信号。Ma
10、tlab将声卡作为对象处理,其后一切操作都不与硬件直接相关,而是通过对该对象的操作来作用于硬件设备(声卡)。调用wavrecord函数采集语音信号。wavrecord函数使用Windows声音输入设备录制声音。函数调用方式是“wavrecord(N,fs,ch,nbits);”。其中N是采集样本数据量;fs是样本采集频率(8000Hz、11025Hz、22050Hz、44100Hz),其默认值是11025Hz;ch是样本采集通道,1为单声道,2为双声道,默认值为1(单声道);nbit是每个样本的位数(或称解析度),double、single、int16为16位,int8为8位。运用audior
11、ecorder对象采集语音信号。函数调用方式为audiorecorder(fs,nbits,ch),可以创设一个audiorecorder对象。其中fs、nbits、ch的意义同wavrecorder函数。对象创设后,可以进行录音、暂停、停止、播放以及数据读取等操作。本文使用第二种方法进行录音。因为本文是对已存信号进行处理,不需要实时处理,对语音要求不高,所以只需选择处理简单的第二种方法。第三章 语音信号分析3.1 概述语音信号分析是语音信号处理的前提和基础,只有分析出可表示语音信号本质特征的参数才有可能利用这些参数进行高效的语音通信、语音合成和语音识别等处理。而且,语音合成的好坏,语音识别率
12、的高低也取决于对语音信号分析的准确性和精确性。因此语音信号分析在语音信号处理应用中具有举足轻重的地位。贯穿于语音分析全过程的是“短时分析技术”。因为,语音信号从整体来看其特性及表征其本质特征的参数均是随时间而变化的,所以它是一个非平稳态过程,不能用处理平稳信号的数字信号处理技术对其进行分析处理。但是语音信号在一个短时间范围内其特性基本保持不变即相对稳定,即语音信号具有短时平稳性。所以任何语音信号的分析和处理必须建立在“短时”的基础上,将语音信号分为一段一段来分析其特征参数,其中每一段称为一“帧”,帧长一般取为1030ms。这样,对于整体的语音信号来讲,分析出的是由每一帧特征参数组成的特征参数时
13、间序列。3.2 语音数字化和预处理在按帧进行语音分析,提取语音参数之前必须进行一些共同的短时分析技术,如语音信号的数字化、语音信号的端点检测、预加重、加窗和分帧等,这些也是不可忽视的语音信号分析的关键技术。3.2.1 数字化语音信号的数字化一般包括放大及增益控制、反混叠滤波、采样、A/D变换及编码;预处理一般包括预加重、加窗和分帧等。语音信号首先进行反混叠滤波,反混叠滤波的目的有两个:第一,抑制输入信号各个频域分量中频率超出的所有分量(为采样频率),以防止混叠干扰;第二,抑制电源工频干扰。这样,反混叠滤波必须是一个带通滤波器,设其上、下截止频率分别是和,则对于绝大多数语音编译码器,=3400H
14、z、=60100Hz,采样频率为=8kHz。语音信号经过反混叠滤波和采样后由A/D变换器变换为二进制数字码。A/D变换中要对信号进行量化,量化不可避免地会产生误差。量化后的信号值与原信号值之间的差值称为量化误差,又称为量化噪声。A/D变换器分为线性和非线性两类。目前采用的线性A/D变换器绝大部分是12位的(即每一个采样脉冲转换为12位二进制数字);非线性A/D变换器则是8位的,它与12位线性变换器是等效的。有时为了后续处理,要将非线性的8位码转换为线性的12位码。3.2.2 预处理由于语音信号的平均功率谱受声门激励和口鼻辐射影响,高频端大约在800Hz以上按6dB/倍频程跌落,所以求语音信号频
15、谱时,频率越高相应的成分越小,高频部分的频谱比低频部分的难求,为此要在预处理中进行预加重处理。预加重的目的是提升高频部分,使信号的频谱变得平坦,保持在低频到高频的整个频带中,能用同样的信噪比求频谱,以便于频谱分析或声道参数分析。预加重可在语音信号数字化时在反混叠器之前进行,这样不仅可以进行预加重,而且可以压缩信号的动态范围,有效地提高信噪比。但预加重一般是在语音信号数字化之后,在参数分析之前在计算机里用具有6dB/倍频程的提升高频特性的预加重数字滤波器来实现,它一般是一阶的数字滤波器: (3-1)式(3-1)中,值接近于1。进行预加重数字滤波处理后,接下来就要进行加窗分帧处理。一般每秒的帧数约
16、为33到100帧,视实际情况而定。分帧可以采用连续分段的方法,但一般要采用交叠分段的方法,这是为了使帧与帧之间平滑过渡,保持其连续性。前一帧和后一帧的交叠部分称为帧移。帧移与帧长的比值一般取01/2。分帧是用可移动的有限长度窗口进行加权的方法来实现的,即用一定的窗函数w(n)乘s(n),从而形成加窗语音信号: (3-2)3.2.3 窗函数的选择在语音信号处理中常用的窗函数是矩形窗和汉明窗等,它们的表达式如下(其中N为帧长):矩形窗: (3-3)汉明窗: (3-4)窗函数的选择(形状和长度)对于短时分析参数的特性影响很大。为此应选择合适的窗口,下面从窗口的形状和窗口的长度两方面来讨论这个问题。一
17、般一个好的窗函数的标准是:在时域因为是语音波形乘以窗函数,所以要减少时间窗两端的坡度,使窗口边缘两端不引起急剧变化而平滑过渡到零,这样可以使截取出的语音波形缓慢降为零,减少语音帧的截断效应;在频域要有较宽的3dB带宽以及较小的边带最大值。这里对矩形窗和汉明窗进行比较。矩形窗的单位函数响应的数字滤波器: (3-5)其频率响应: (3-6)它具有线性相位,其频率响应为第一个零值时所对应的频率为,其中为采样频率。而汉明窗的频率响应的第一个零值频率(即带宽)以及通带外的衰减都比矩形窗要大许多。矩形窗与汉明窗的一些参照数据示于下表。表4-1 矩形窗与汉明窗的比较窗类型 旁瓣峰值 主瓣宽度 最小阻带衰减矩
18、形窗 -13 4/N -21汉明窗 -41 8/N -53从表3-1可以看出,汉明窗的主瓣宽度比矩形窗大一倍,即带宽约增加一倍,同时其带外衰减也比矩形窗大一倍多。矩形窗的谱平滑性能较好,但损失了高频成分,使波形细节丢失;而汉明窗则相反,从这一方面来看,汉明窗比矩形窗更为合适。3.3 语音信号的时域分析语音信号的时域分析就是分析和提取语音信号的时域参数。进行语音分析时最先接触到并且也是最直观的是它的时域波形。语音信号本身就是时域信号,因而时域分析是最早使用,也是应用最广泛的一种分析方法,这种方法直接利用语音信号的时域波形。语音信号的时域参数有短时能量、短时过零率、平均幅度分析等,这是语音信号的一
19、组最基本的短时参数,在各种语音信号数字处理技术中都要应用。3.3.1 短时能量及短时平均幅度分析设语音波形时域信号为x(l)、加窗分帧处理后得到的第n帧语音信号为,则满足: (3-8)其中,n=0,1T,2T,并且N是帧长,T是帧移长度,是窗函数。则第n帧语音信号的短时能量: (3-9)是一个度量语音信号幅度值变化的函数,但它有一个缺陷,即它对高电平非常敏感(因为它计算时用的是信号的平方)。为此,采用另一个度量语音信号幅度值变化的函数,即短时平均幅度函数,它定义为: (3-10)也是一帧语音信号能量大小的表征,它与短时能量的区别在于计算时小取样值和大取样值不会因取平方而造成较大差异,在某些应用
20、领域中会带来一些好处。3.3.2 短时过零率分析短时过零率表示一帧语音中语音信号波形穿过横轴(零电平)的次数。过零分析是语音时域分析中最简单的一种。对于连续语音信号,过零即意味着时域波形通过时间轴;而对于离散信号,过零率就是样本改变符号的次数。定义语音信号的短时过零率: (3-11)式中,sgn 是符号函数,即: (3-12)在实际中求过零率时,需要十分注意的一个问题是如果输入信号中包含有50Hz的工频干扰或者A/D变换器的工作点有偏移(这等效于输入信号有直流偏移),往往会使计算的过零率很不准确。为了解决前一个问题,A/D变换器前的防混叠带通滤波器的低端截频应高于50Hz,以有效地抑制电源干扰
21、。第四章 MATLAB仿真本文采用Matlab对语音信号特征参数的提取进行仿真验证。如图4-1,对语音信号进行数字化处理,从而利用软件提取特征参数并进行分析。图4-1 实验流程图4.1 语音数字化和预处理4.1.1 数字化该实验以研究者本人的声音为分析样本。在Matlab中使用wavrecord (n,fs,ch,dtype)函数录取英文“Ada”的读音。因人类语音的频谱主要集中在4kHz以内,而根据采样定理,采样频率应大于信号中最高频率的两倍,所以采样频率(fs)取8khz;本实验将录音时间规定为2s,因此采样的总点数(n)为2*8000;通道数(ch)取1,即为单通道;采样数据的存储格式(
22、dtype)取为“double”,即16位采样精度。利用wavplay函数可以较清晰地听到读音,同时发现语音开始时存在短暂杂音。用wavwrite函数将语音信号保存为“a.wav”文件,应用于下面的处理。通过wavrecord函数,语音信号便由计算机完成了采样、A/D变换及编码过程。接下来进行滤波,该实验选用了4阶的比特沃斯带通滤波器,其上下截止频率分别为3400Hz以及100Hz,这是因为语音信号一般在4kHz以内,虽然理论上可以将最高频率取为4kHz,但实际上由于比特沃斯滤波器为使通带的幅度响应最大限度地平坦,而损失了截止频率处的下降斜度,所以上截止频率应小于4kHz,从而抑制输入信号中各
23、个频域分量中频率超出4kHz的分量;电源的工频干扰一般在50Hz左右,为了防止其干扰,所以下截止频率应大于50Hz,本实验取为100Hz。图4-2 “Ada”语音信号滤波前后的时域波形如图4-2所示,滤波前后的信号波形差异不大,只有实验开始时的一段噪音以及整段语音中部分高频分量被抑制了,这是因为该实验是在低噪声的环境下完成的,所以通带外的噪声分量很小,滤波前后没有明显变化。但仅仅根据信号幅度无法准确确认语音端点的具体位置,所以有必要进一步分析。如图4-3所示,因间频谱与间频谱呈镜像对称,所以本文中频谱的数字角频率范围全部取为,在整体频谱中,看不出低频段的变化,所以将低频段频谱放大进行观察,由右
24、边两幅图可见,低频段被抑制了,电源干扰也相应地被排除了。再次用wavplay函数收听滤波后的语音,语音更加清晰,语音开始段的杂音被消除。可见,滤波可以提高得到的语音信号的质量。图4-3 “”语音信号滤波前后的频谱4.1.2 预处理用wavwrite函数将经过滤波的语音信号存储为“b.wav”文件,用于语音的预处理环节。本实验中,预处理包括预加重、加窗和分帧。求语音信号频谱时,频率越高相应的成分越小,高频段大约在800Hz以上按6dB/倍频程跌落,所以高频部分的频谱比低频部分的难求,为此要在预处理中进行预加重。本实验采用具有6dB/倍频程的一阶数字滤波器提高高频特性,来实现预加重: (4-1)其
25、中值取0.9357。如图4-4所示,就整体而言,下图比上图幅值低,下图最大幅值仅约为上图的1/3,而高频段相对变化不大,所以预加重后高、低频段的幅值差异得到压缩。因此我们可以得到结论:第一,有用的高频部分的频谱得到提升,低频部分频谱进一步被抑制,起到了滤除低频干扰(包括工频干扰和随机噪声)的作用;第二,使信号的频谱变得平坦,压缩了信号的动态范围,保持整个频带中能用同样的信噪比求频谱,便于频谱分析。如图4-5所示,下图比上图的动态范围小,整体幅值水平低,曲线更平滑,可见,预加重还起到了压缩短时能量的动态范围,消除直流漂移,抑制随机噪声的作用。将预加重后的语音用wavwrite函数存为“c.wav
26、”文件,用于下面的处理。图4-4 预加重前后的信号频谱图4-5 预加重前后的短时能量图4-6 语音信号加窗前后时域波形比较将预加重后的信号进行加窗分帧。窗函数的选择(形状和长度),对于短时分析参数的特性影响很大。为此应选择合适的窗口,使其短时参数更好地反映语音信号的特性变化。下面从窗口形状和长度来讨论这个问题。分别使用窗长240点即30ms的矩形窗和汉明窗,得到加窗后的信号波形如图4-6所示。可以观察出加窗后信号的时域特征更加明显,对应“A”和“d”的信号幅值加强;而加汉明窗的时域波形辅音的加强程度更甚于加矩形窗的波形,这是由两种窗函数的频域特性所决定的,汉明窗的带宽比矩形窗大了约一倍,同时其
27、带外衰减也比矩形窗大,矩形窗的谱虽然平滑性能好,但损失了高频成分,从而使波形的细节丢失。所以汉明窗比矩形窗更适合做语音信号的窗函数。研究窗长对信号时域、频域的影响。图4-7、图4-8及图4-9是对信号加窗长分别为20ms、30ms、40ms的汉明窗的时域、频域的比较。比较图4-7、图4-8中各加窗信号与原信号的频谱,得到窗长越长所得频谱与原信号频谱越相近,频率分辨率越高,将图4-9中各波形与图4-6原信号波形比较,发现窗口越长,波形变形就越明显,时域分辨率就越低;这是因为频率分辨率(其中N为窗口长度,为采样周期),N越大,频域分辨率越高,时域分辨率越低。综合时、频域两方面特性,N值既不能太大,
28、也不能太小。考虑到一个语音帧应包含17个基音周期,基音周期变化范围较大(从女性、儿童的2ms到老年男子的14ms),后续处理中窗长折中选为30ms(240点)。图4-7 原信号频谱与窗长20ms信号频谱图4-8 窗长分别为30ms和40ms的信号频谱图4-9 窗长分别为20ms、30ms和40ms的信号时域波形综上所述,本文选择加30ms的汉明窗,将加窗后信号存为“d.wav”文件。以30ms为一帧,为保持帧之间的连续性,采用交叠分段的方法,取帧移为10ms,完成加窗分帧。4.2 语音信号的时域分析4.2.1 短时平均能量分析三种定义的短时能量分别用下面三行Matlab命令实现:amp1=su
29、m(abs(y),2);amp2=sum(y.*y,2);amp3=sum(log(y.*y+eps),2);其中amps3中加上小的浮点数eps,是为了防止log运算中可能出现的溢出。图4-10显示了三种短时能量的波形。由图可见,第三种短时能量对低电平敏感,对于高电平分辨率低。 图4-10 三种短时能量4.2.2 短时过零率分析本节使用经过滤波和预加重但未加窗的语音信号“c.wav”进行分析,并给出两种计算短时过零率的方法,加以比较。第一种方法先将语音分帧存为二维数组,采用两重循环计算过零率zcr1,如果前后两个采样值异号则说明过零一次,同时为排除噪声干扰或系统轻微振动所引起的过零,该方法设
30、置了门限delta(这是一个经验值取为0.02),因此该方法思路为:分别对每一帧进行扫描,当前后两个采样值异号并且差的绝对值大于delta时,zcr1自加1,最后得到数列zcr1。第二种方法是将语音的第一点至倒数第二点分帧存为二维数组tmp1,将语音的第二点到最后一点用相同方法分帧存为二维数组tmp2,两个二维数组中的对应元素错开一位,将两个数组中的对应元素分别相乘,结果小于零,则在二维数组signs相应位置存1,反之存0,同理将tmp1、tmp2对应元素作差,绝对值大于门限delta,则在二维数组diffs中存1,反之存0,最后将signs、diffs数组对应位置上的元素相乘,将所得二维数组
31、的每列求和,结果存到一维数组zcr2中,即为各帧的过零率数组。此方法判别条件与第一种方法相同,但该法运用了矢量化的计算方法。如图4-11所示,用两种方法算得的过零率相同,可见效果相同。而用tic和toc命令对两种方法的运行时间进行计时,第一种方法用时0.019839s,第二种方法用时0.014780s,可见用矢量化的计算方法可以提高程序效率,虽然差别仅是数量级,但对于时长较长的语音或者实时语音处理意义重大,因此得到选用矢量化的计算方法更优。图4-11 两种不同方法求得的过零率第五章 结论与展望本文对语音信号特征参数提取进行了Matlab仿真。第一,通过录音采集信号。第二,经滤波、预加重、加窗,
32、排除电源工频及随机噪声干扰、提高信号频谱的高频特性、消除直流漂移,使提取的特征参数更加准确;本文对所加窗的形状和长度进行了讨论,由仿真得到结论,与矩形窗相比,汉明窗因为带宽大、带外衰减剧烈,所以更能突出时域波形的细节,效果更佳;窗口越长频域分辨率越高,时域分辨率越低,选择窗长时要结合时域、频域特性以及语音基音周期综合考虑,仿真中得到加30ms的汉明窗效果较好。第三,经过分帧,计算语音信号每帧的短时平均能量和短时过零率;本文讨论了三种短时平均能量表述方式,得到结论信号平方和的表述方式对高电平敏感,因此选用绝对值和以及对数表述较为理想,对于短时过零率的计算,本文采用了二重循环和矢量化两种方法,得到
33、结论;本文用Matlab进行仿真,具有方法简单、误差小、速度快、便于结果分析的优点。运用了Matlab命令对实验程序计时;绘制比较实验数据图像,得到结论。利用Matlab提高了研究的准确度和效率,加深了对语音信号时域分析理论的理解。致 谢本文是在导师陈杰老师的悉心指导下完成的,在整个设计过程中,陈老师非常认真负责、专业经验丰富,正确解答同学的提问,使我受益匪浅,在此表示谢意!经过半年的忙碌和工作,本次毕业设计已经接近尾声,由于经验的匮乏,难免有许多考虑不周全的地方,如果没有指导老师的督促指导,以及一起工作的同学们的支持,想要完成这个设计是难以想象的。再次要感谢大学三年来所有的老师,为我们打下电
34、子专业知识的基础;同时还要感谢所有的同学们,他们为我提供Matlab软件、收集相关资料,共同讨论解答问题,对我的学习和研究有很大帮助。正是因为有了你们的支持和鼓励。此次毕业设计才会顺利完成。感谢陈杰老师和帮助我的同学们。附录: 仿真程序28Luyin.m %录音Fs = 8000;y = wavrecord(20*Fs,Fs,1,int16);wavplay(y,Fs); %播放语音figure plot(1:length(y),y);wavwrite(y,Fs,16,a.wav);%保存语音信号filter.m%a.wav为原始录音信号clear allclose all%将a.wav中的数
35、据存如一维数组x中x,fs,bit=wavread(a.wav);%设定滤波器为4阶比特沃斯滤波器%上下截止频率分别为100Hz、3400Hzb,a=butter(4,0.025 0.85);%语音信号通过上述滤波器y=filter(b,a,x);Rows,Cols=size(x);L=Rows;w=0:(L-1);W=2*pi/Rows*w; %数字角频率X=abs(fft(x)+eps);X(1)=X(2); %滤波前信号频谱Y=abs(fft(y)+eps);Y(1)=Y(2); %滤波后信号频谱figure(1); %做时域波形图subplot(211);plot(x);title(滤
36、波前信号波形)grid onsubplot(212);plot(y);title(滤波后信号波形)grid on%做频域波形图figure(2);subplot(221)plot(W/pi,X(1:L);title(滤波前信号频谱);xlabel(w(单位pi);ylabel(幅值);axis(0 1 0 max(X)grid onsubplot(223)plot(W/pi,Y(1:L);title(滤波后信号频谱);xlabel(w(单位pi);ylabel(幅值);axis(0 1 0 max(X)grid onsubplot(222)plot(W/pi,X(1:L);title(滤波前低
37、频段放大的信号频谱);xlabel(w(单位pi);ylabel(幅值);axis(0 0.02 0 max(X)grid onsubplot(224)plot(W/pi,Y(1:L);axis(0 0.02 0 max(X)title(滤波后低频段放大的信号频谱);xlabel(w(单位pi);ylabel(幅值);grid onyujiazhong.m%将滤波后的语音信号预加重%b.wav为经过滤波后的语音信号clear allclose allx,fs,bit=wavread(b.wav); %读取要处理的信号x=double(x);x=x/max(abs(x); %幅度归一化y=fil
38、ter(1 -0.9375,1,x); %进行预加重FrameLen=240; %帧长设定为30msFrameInc=80; %帧移设定为10ms%预加重前的信号短时能量amp1=sum(abs(enframe(x,FrameLen,FrameInc),2);%预加重后的信号短时能量amp2=sum(abs(enframe(y,FrameLen,FrameInc),2);Rows,Cols=size(x);L=Rows;w=0:(L-1);W=2*pi/Rows*w; X=abs(fft(x)+eps); X(1)=X(2); %滤波前信号频谱Y=abs(fft(y)+eps);Y(1)=Y(
39、2); %滤波后信号频谱figure(1); %比较预加重对短时能量的影响subplot(211)plot(amp1);axis(1 length(amp1) 0 max(amp1)ylabel(短时能量);title(预加重前的短时能量);grid onsubplot(212)plot(amp2);axis(1 length(amp2) 0 max(amp2)ylabel(短时能量);title(预加重后的短时能量);grid onfigure(2); %比较预加重对信号频谱的影响subplot(211)plot(W/pi,X(1:L);title(预加重前信号频谱);xlabel(w(单位
40、pi);ylabel(幅值);axis(0 1 0 max(X)grid onsubplot(212)plot(W/pi,Y(1:L);title(预加重后信号频谱);xlabel(w(单位pi) );ylabel(幅值);axis(0 1 0 max(X)grid onwin_compare.m%加窗形状(矩形窗和汉明窗)比较%c.wav为经过预加重的语音信号clear allclose allx=wavread(c.wav);y=conv(x,boxcar(240); %加30ms的矩形窗z=conv(x,hamming(240); %加30ms的汉明窗Rows,Cols=size(x);
41、L=Rows;w=0:(L-1);W=2*pi/Rows*w;X=abs(fft(x)+eps);X(1)=X(2); %计算未加窗信号频谱Y=abs(fft(y)+eps);Y(1)=Y(2); %计算加30ms矩形窗的信号频谱Z=abs(fft(z)+eps);Z(1)=Z(2); %计算加30ms汉明窗的信号频谱subplot(311) %比较加不同窗信号的时域波形plot(x);ylabel(幅值);title(原语音信号的时域波形);grid onsubplot(312)plot(y);ylabel(幅值);title(加矩形窗的时域波形);axis tightgrid onsubp
42、lot(313)plot(z);ylabel(幅值);title(加汉明窗的时域波形);axis tightgrid onwinlength.m%预处理中加不同长度的汉明窗比较% c.wav为经过预加重的语音信号clear allclose alla=wavread(c.wav);x=conv(a,hamming(160); %加20ms的汉明窗y=conv(a,hamming(240); %加30ms的汉明窗z=conv(a,hamming(320); %加40ms的汉明窗Row,Col=size(a);LL=Row;b=0:(LL-1);B=2*pi/Row*b;A=abs(fft(a)+
43、eps);A(1)=A(2); %计算加窗前信号频谱Rows,Cols=size(x);L=Rows;w=0:(L-1);W=2*pi/Rows*w;X=abs(fft(x)+eps);X(1)=X(2); %计算加20ms汉明窗的信号频谱Y=abs(fft(y)+eps);Y(1)=Y(2); %计算加30ms汉明窗的信号频谱Z=abs(fft(z)+eps);Z(1)=Z(2); %计算加40ms汉明窗的信号频谱figure(1); %比较加不同长度的窗后的时域波形subplot(311)plot(x);ylabel(幅值);title(窗长20ms的信号时域波形);axis tightg
44、rid onsubplot(312)plot(y);ylabel(幅值);title(窗长30ms的信号时域波形);axis tightgrid onsubplot(313)plot(z);ylabel(幅值);title(窗长40ms的信号时域波形);axis tightgrid onfigure(2); %比较加不同长度的窗后信号频谱subplot(211)plot(B/pi,A(1:LL);title(原信号频谱);xlabel(w(单位pi) );ylabel(幅值);axis(0 1 0 max(A)grid onsubplot(212)plot(W/pi,X(1:L);title(窗长20ms的信号频谱);xlabel(w(单位pi) );ylabel(幅值);axis(0 1 0 max(A)grid onfigure(3);subplot(211)plot(W/pi,Y(1:L);title(窗长30ms的信号频谱);xlabel(w(单位pi);ylabel(幅值);axis(0 1 0 max(A)grid onsubplot(212)plot(W/pi,Z(1:L);title(窗长40ms的信号频谱);xlabel(w(单位pi);ylabel(幅值);axis(0 1 0 max(A)