您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 数字语音处理实验指导书-通信12
第9章数字语音处理的MATLAB实现9.1语音信号的采集数字语音处理是利用数字信号处理技术对语音信号进行处理的一门学科。但是实际的语音信号是模拟信号,所以在处理前需要对语音信号进行数字化。可以通过两种方式获得数字化的语音文件。一种方式是语音研究机构提供的标准的语音数据库;另一种方式是人们通过声卡将来自麦克风的语音录入计算机,并转换成数字语音信号。MATLAB提供了一系列函数,可以借助计算机上的声卡实现对语音的录入和放音,以及对语音数据的读写。下面介绍其中常用的一些函数,并配以具体的实例。9.1.1语音信号采集的相关MATLAB函数1.wavrecord该函数利用PC机上的音频输入设备完成音频的记录,常用调用格式如下:y=wavrecord(n,Fs,ch,'dtype')说明:n为采样的点数,;Fs为采样频率,默认值是11025Hz;ch为通道数,可以取1或2,分别对应单声道或立体声,默认值是1;dtype为采样数据的存储格式,可以取double、single、int16或uint8,默认值是double。2.wavwrite该函数完成WAV文件的写操作,其调用格式如下:wavwrite(y,'filename')wavwrite(y,Fs,'filename')wavwrite(y,Fs,N,'filename')说明:变量y代表要写入文件名为filename的WAV文件的数据;Fs为WAV文件中数据的采样频率,默认值为8000Hz;N为WAV文件中每个数据的比特数,可以取8、16、24或32,默认值为16。3.soundview该函数通过音频输出设备对语音进行回放,并同时弹出一个GUI界面显示回放的语音数据。利用该函数可以快速检验数据的可靠性,其调用格式如下:soundview('filename')soundview(y,Fs)soundview(y,Fs,'name')说明:filename代表要回放的语音文件名,y代表要回放的变量名,Fs为该变量的采样频率,name代表指定的GUI窗口的标题。4.wavread该函数完成WAV文件的读操作,常用的调用格式如下:y=wavread('filename')[y,Fs,bits]=wavread('filename')说明:y代表从文件名为filename的WAV文件中读出的数据,Fs为WAV文件中数据的采样频率,bits为WAV文件中每个数据的比特数。9.1.2用MATLAB实现语音信号的采集及回放举例[例9-1]语音信号的采集及回放clear;Fs=11025;y=wavrecord(5*Fs,Fs,'double');wavwrite(y,'D:\\a');soundview(y,Fs);这段代码利用11025Hz的采样频率对输入的语音信号进行采样,采样点数为55125个,持续时间为5秒,存储格式为double。之后将数字语音数据写入D盘的a.wav文件,并通过放音设备进行回放。回放的GUI界面如图9.1所示,通过该界面可以观察采集的语音信号。图9.1用soundview函数显示的字母“a”9.2语音信号的预处理对语音信号数字化之后,为了更好的对语音信号进行分析,需要对语音信号进行预处理。主要的预处理工作包括:预加重和分帧加窗。9.2.1预加重预加重的目的是提升语音信号的高频部分,增加语音的高频分辨率。预加重可以通过一个一阶高通滤波器来实现,该滤波器的传递函数为-1-1)(zzH其中为预加重系数,0.19.0。MATLAB提供了滤波器的频率响应函数:freqz函数,利用该函数可以非常方便的实现对语音信号的预加重。9.2.2分帧加窗语音信号具有短时平稳性,因此需要把语音信号分为一段一段来分析其特性,每一段称为“一帧”,帧长一般取为10-30ms。为了对语音信号进行分帧处理,本章采用了VOICEBOX工具箱中的enframe函数。VOICEBOX工具箱是一个MATLAB语音处理工具箱(该工具箱是一个基于GNU协议的自由软件),可以通过网址:来下载。将该工具箱的目录加载到MATLAB的搜索路径后,就可以使用其中的函数了。函数enframe的常用调用格式如下:f=enframe(X,LEN,INC)说明:该调用格式实现的是对输入变量X的交叠分帧,LEN代表帧长、INC代表帧移,返回矩阵f的每一行对应一帧数据。在分帧的同时常常根据不同的应用给每一帧加上一个窗,常用的窗函数是矩形窗和汉宁窗。利用函数enframe对语音进行分帧可以理解为直接加上了矩形窗;如果希望对语音信号加汉宁窗可以利用函数hamming来实现。9.3语音信号的时域分析语音信号的时域分析就是分析语音信号的时域特性。常用的时域分析参数包括:短时能量、短时过零率、短时自相关等。下面分别介绍这些时域分析方法及其MATLAB实现。9.3.1短时能量短时能量可以度量语音信号的能量随时间的变化情况。在时域,浊音和清音的能量具有显著的差别,因此可以利用短时能量来区分浊音段和清音段。下面通过一个实例说明如何利用MATLAB实现短时能量的计算。[例9-2]计算语音信号的短时能量clear;closeall;Fs=11025;y=wavrecord(5*Fs,Fs,'double');%完成语音的记录wavwrite(y,Fs,'D:\\a');%将采集来得语音信号写入a.wavsoundview(y,Fs);%对记录的语音数据进行回放x=wavread('D:\\a.wav');%从文件a.wav读取语音x=double(x);LEN=256;INC=128;f=enframe(x,LEN,INC);%分帧energy=sum(abs(f),2);%计算短时能量subplot(2,1,1);plot(x);%绘制语音信号的时域波形axis([0,size(x,1),-0.35,0.3]);title('语音信号时域波形');xlabel('样点数');ylabel('幅度');subplot(2,1,2);plot(energy);%绘制语音信号的短时能量图title('语音信号的短时能量');xlabel('帧数');ylabel('短时能量');legend('帧长LEN=256');这段代码利用11025Hz的采样频率对输入的语音信号进行采样,并将数字语音数据写入D盘的a.wav文件,同时通过放音设备进行回放。之后读取a.wav中的语音数据,计算每一帧的短时能量,并将原始语音信号和短时能量显示出来,如图9.2所示。012345x104-0.200.2语音信号时域波形样点数幅度050100150200250300350400450010203040语音信号的短时能量帧数短时能量帧长LEN=256图9.2短时能量9.3.2短时过零率短时过零率是指每一帧内的语音信号通过零电平的次数。频率较高的信号具有较高的短时过零率,而频率较低的信号具有较低的短时过零率。浊音的大部分能量分布在较低频率上,因此具有较低的短时过零率;而清音的大部分能量分布在较高频率上,因此具有较高的短时过零率。根据语音信号的这个时域特性可以区分浊音段和清音段。下面通过一个实例说明如何利用MATLAB实现短时过零率的计算。[例9-3]计算语音信号的短时过零率clear;closeall;x=wavread('D:\\a.wav');%从文件a.wav读取语音x=double(x);LEN=256;INC=128;f=enframe(x,LEN,INC);%分帧%计算短时过零率z=zeros(size(f,1),1);difs=0.01;%设置门限用来度量相邻样点值的差异fori=1:size(f,1)s=f(i,:);%提取出一帧语音信号forj=1:(length(s)-1)ifs(j)*s(j+1)0&abs(s(j)-s(j+1))difs;%判断相邻点是否发生过零z(i)=z(i)+1;endendendsubplot(2,1,1);plot(x);%绘制语音信号的时域波形axis([0,size(x,1),-0.35,0.3]);title('语音信号时域波形');xlabel('样点数');ylabel('幅度');subplot(2,1,2);plot(z);%绘制语音信号的短时过零率title('语音信号的短时过零率');xlabel('帧数');ylabel('短时过零率');这段代码首先读取a.wav中的语音数据,之后计算每一帧的短时过零率,最后将原始语音信号和短时过零率显示出来,如图9.3所示。012345x104-0.200.2语音信号时域波形样点数幅度0501001502002503003504004500204060语音信号的短时过零率帧数短时过零率图9.3短时过零率9.3.3短时自相关短时自相关函数可以度量语音信号自身的相似程度。如果一个信号是周期的,则其短时自相关函数也是周期函数。在时域,浊音信号具有明显的周期性,因此浊音的短时自相关函数也具有相同的周期性;而清音信号无周期性、类似于白噪声,因此清音的短时自相关函数也无周期性、类似于白噪声。利用短时自相关函数的这个性质可以区分清音段和浊音段,并且估计浊音的基音周期。下面通过一个实例说明如何利用MATLAB实现短时自相关的计算。[例9-4]计算语音信号的短时自相关clear;closeall;x=wavread('D:\\a.wav');%从文件a.wav读取语音x=double(x);LEN=256;INC=128;f=enframe(x,LEN,INC);%分帧ff=f(69,:);%选取一帧浊音信号%计算短时自相关N=LEN;%获得一帧语音信号的长度R=zeros(1,N);fork=1:NR(k)=sum(ff(k:N).*ff(1:N-k+1));endfork=1:NR1(k)=R(k)/R(1);%归一化endsubplot(2,1,1);plot(ff);%绘制窗选语音信号axis([0,N,-0.5,0.5])title('加矩形窗的语音帧');xlabel('样点数');ylabel('幅度');subplot(2,1,2);plot(R1);%绘制短时自相关函数axis([0,N,-1,1])title('加矩形窗的短时自相关函数');xlabel('k');ylabel('R(k)');这段代码首先读取a.wav中的语音数据,之后选取其中的一帧浊音(可以通过观察短时能量的分布来判断哪一帧是浊音)并计算这帧浊音的短时自相关函数,最后将截取的语音信号和短时自相关函数显示出来,如图9.4所示。从图中可以看出窗选语音信号和其自相关函数具有相同的周期性,利用自相关函数的第一个峰值点和原点之间的距离可以估计出这帧浊音的基音周期。050100150200250-0.500.5加矩形窗的语音帧样点数幅度050100150200250-1-0.500.51加矩形窗的短时自相关函数kR(k)图9.4短时自相关9.4语音信号的频域分析通过频域分析方法可以分析语音信号的频域特性。最常用的频域分析方法为傅里叶分析法。语音信号是一个非平稳信号,因此需要用短时傅里叶变换对语音信号进行频谱分析。通过语音信号的短时频谱可以观察它的共振峰特性、基音频率和谐波频率。下面通过实例介绍短时傅里叶变换的MATLAB实现。[例9-5]计算语音信号的短时频谱clear;closeall;[x,Fs,bits]=wavread('D:\\a.wav');%从文件a.wav读取语音x=double(x);LEN=256;INC=128;f=enframe(x,LEN,INC);%分帧ff=f(69,:);%选取一帧浊音信号ff1=ff'.*hamming(length(ff));%加汉宁窗N=512;r=fft(ff1,N);%计算短时傅里叶变换r1
本文标题:数字语音处理实验指导书-通信12
链接地址:https://www.777doc.com/doc-2425577 .html