语音实验一端点检测.docx
《语音实验一端点检测.docx》由会员分享,可在线阅读,更多相关《语音实验一端点检测.docx(13页珍藏版)》请在冰豆网上搜索。
语音实验一端点检测
语音实验一端点检测
实验一语音信号端点检测
一、实验目的
1.学会MATLAB的使用,掌握MATLAB的程序设计方法;
2.掌握语音处理的基本概念、基本理论和基本方法;
3.掌握基于MATLAB编程实现带噪语音信号端点检测;
4.学会用MATLAB对信号进行分析和处理。
5.学会利用短时过零率和短时能量,对语音信号的端点进行检测。
二、实验仪器设备及软件
HPD538、MATLAB
三、实验原理
端点检测是语音信号处理过程中非常重要的一步,它的准确性直接影响到语音信号处理的速度和结果。
本次实验利用短时过零率和短时能量相结合的语音端点检测算法利用短时过零率来检测清音,用短时能量来检测浊音,两者相配合便实现了信号信噪比较大情况下的端点检测。
算法对于输入信号的检测过程可分为短时能量检测和短时过零率检测两个部分。
算法以短时能量检测为主,短时过零率检测为辅。
根据语音的统计特性,可以把语音段分为清音、浊音以及静音(包括背景噪声)三种。
在本算法中,短时能量检测可以较好地区分出浊音和静音。
对于清音,由于其能量较小,在短时能量检测中会因为低于能量门限而被误判为静音;短时过零率则可以从语音中区分出静音和清音。
将两种检测结合起来,就可以检测出语音段(清音和浊音)及静音段
1、短时能量计算
定义n时刻某语言信号的短时平均能量
为:
式中N为窗长,可见短时平均能量为一帧样点值的平方和。
特殊地,当窗函数为矩形窗时,有
2、短时过零率
过零就是指信号通过零值。
过零率就是每秒内信号值通过零值的次数。
对于离散时间序列,过零则是指序列取样值改变符号,过零率则是每个样本的改变符号的次数。
对于语音信号,则是指在一帧语音中语音信号波形穿过横轴(零电平)的次数。
可以用相邻两个取样改变符号的次数来计算。
如果窗的起点是n=0,短时过零率Z为
波形穿过横轴(零电平)的次数
短时过零可以看作信号频率的简单度量
浊音的短时平均幅度最大,无声的短时平均幅度最小,清音的短时过零率最大,无声居中,浊音的短时过零率最小。
3、短时自相关函数
是偶函数;
s(n)是周期的,那么R(k)也是周期的;
可用于基音周期估计和线性预测分析
4、判断语音信号的起点和终点
利用短时平均幅度和短时过零率可以判断语音信号的起点和终点。
语音端点检测方法可采用测试信号的短时能量或短时对数能量、联合过零率等特征参数,并采用双门限判定法来检测语音端点,即利用过零率检测清音,用短时能量检测浊音,两者配合。
首先为短时能量和过零率分别确定两个门限,一个是较低的门限数值较小,对信号的变化比较敏感,很容易超过;另一个是比较高的门限,数值较大。
低门限被超过未必是语音的开始,有可能是很短的噪声引起的,高门限被超过并且接下来的自定义时间段内的语音。
四、实验步骤及程序
(1)实验步骤:
1、取一段录音作为音频样本。
2、利用公式分别编程计算这段语音信号的短时能量和短时过零率,然后分别画出它们的曲线。
3、调整能量门限。
4、进行幅度归一化并设置帧长、短时能量阈值、过零率阈值等参数。
5、编写程序实现语音端点检测。
6、最后得到语音端点检测图像。
(2)语音信号的端点检测程序流程图:
图1.1语音信号的端点检测程序流程图
(3)语音信号的端点检测实验源程序:
clc;
clear;
[x,fs]=wavread('2.wav');
%%
[y]=end_point(x);
%%
%[f0]=pitch_sift(x,0.38,fs);
%plot(f0);
%%
e_x=(frame(x,'lpc_spectrum',fs));
%plot(e_x(2,:
));%某一维随时间变化
plot(e_x(:
89));%一帧信号各维之间变化
holdon;
c=melcepst(x,fs);
plot(c(89,:
),'k');
frame定义
%function[y]=frame(x,func,SAMP_FREQ,l,step)
%whereyisoutputonaframebyframebasis,xisinputspeech,
%andlisthewindowsize.landstepareoptionalparameters,
%bydefaultSAMP_FREQis8000,lis200,andstepis100.
%funcisastringe.g.'pitch'thatdeterminesafunctionthatyouwant
%toapplytoxonashort-timebasis.
%
%Writtenby:
LeventArslanApr.11,1994
%
function[yy]=frame(x,func,SAMP_FREQ,l,step)
[m,n]=size(x);
ifm>n
n=m;
else
n=n;
x=x';
end
ifnargin<3,SAMP_FREQ=16000;end;
ifnargin<4,l=SAMP_FREQ/40;end;
ifnargin<5,step=l/2;end;
num_frames=ceil(n/step);%NUMBEROFFRAMES
x(n+1:
n+2*l)=zeros(2*l,1);%ADDZEROSATTHEENDOFTHESPEECHSIGNAL
i=[0:
step:
num_frames*step]';%iisthearithmeticalproportionseriesbystep
j=i*ones(1,l);
i=j+ones(num_frames+1,1)*[1:
l];
y=reshape(x(i),num_frames+1,l)';
y=(hanning(l)*ones(1,num_frames+1)).*y;
fori=1:
num_frames
cmd=sprintf('yy(:
i)=%s(y(:
i));',func);
eval(cmd);
end
melcepst定义
functionc=melcepst(s,fs,w,nc,p,n,inc,fl,fh)
%MELCEPSTCalculatethemelcepstrumofasignalC=(S,FS,W,NC,P,N,INC,FL,FH)
%
%
%Simpleuse:
c=melcepst(s,fs)%calculatemelcepstrumwith12coefs,256sampleframes
%c=melcepst(s,fs,'e0dD')%includelogenergy,0thcepstralcoef,deltaanddelta-deltacoefs
%
%Inputs:
%sspeechsignal
%fssamplerateinHz(default11025)
%ncnumberofcepstralcoefficientsexcluding0'thcoefficient(default12)
%nlengthofframe(defaultpowerof2<30ms))
%pnumberoffiltersinfilterbank(defaultfloor(3*log(fs)))
%incframeincrement(defaultn/2)
%fllowendofthelowestfilterasafractionoffs(default=0)
%fhhighendofhighestfilterasafractionoffs(default=0.5)
%
%wanysensiblecombinationofthefollowing:
%
%'R'rectangularwindowintimedomain
%'N'Hanningwindowintimedomain
%'M'Hammingwindowintimedomain(default)
%
%'t'triangularshapedfiltersinmeldomain(default)
%'n'hanningshapedfiltersinmeldomain
%'m'hammingshapedfiltersinmeldomain
%
%'p'filtersactinthepowerdomain
%'a'filtersactintheabsolutemagnitudedomain(default)
%
%'0'include0'thordercepstralcoefficient
%'e'includelogenergy
%'d'includedeltacoefficients(dc/dt)
%'D'includedelta-deltacoefficients(d^2c/dt^2)
%
%'z'highestandlowestfilterstaperdowntozero(default)
%'y'lowestfilterremainsat1downto0frequencyand
%highestfilterremainsat1uptonyquistfreqency
%
%If'ty'or'ny'isspecified,thetotalpowerinthefftispreserved.
%
%Outputs:
cmelcepstrumoutput:
oneframeperrow
%
%Copyright(C)MikeBrookes1997
%
%LastmodifiedThuJun1509:
14:
482000
%
%VOICEBOXisaMATLABtoolboxforspeechprocessing.Homepageisat
%http:
//www.ee.ic.ac.uk/hp/staff/dmb/voicebox/voicebox.html
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Thisprogramisfreesoftware;youcanredistributeitand/ormodify
%itunderthetermsoftheGNUGeneralPublicLicenseaspublishedby
%theFreeSoftwareFoundation;eitherversion2oftheLicense,or
%(atyouroption)anylaterversion.
%
%Thisprogramisdistributedinthehopethatitwillbeuseful,
%butWITHOUTANYWARRANTY;withouteventheimpliedwarrantyof
%MERCHANTABILITYorFITNESSFORAPARTICULARPURPOSE.Seethe
%GNUGeneralPublicLicenseformoredetails.
%
%YoucanobtainacopyoftheGNUGeneralPublicLicensefrom
%ftp:
//prep.ai.mit.edu/pub/gnu/COPYING-2.0orbywritingto
%FreeSoftwareFoundation,Inc.,675MassAve,Cambridge,MA02139,USA.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
ifnargin<2fs=11025;end
ifnargin<3w='M';end
ifnargin<4nc=12;end
ifnargin<5p=floor(3*log(fs));end
ifnargin<6n=pow2(floor(log2(0.03*fs)));end
ifnargin<9
fh=0.5;
ifnargin<8
fl=0;
ifnargin<7
inc=floor(n/2);
end
end
end
ifany(w=='R')
z=enframe(s,n,inc);
elseifany(w=='N')
z=enframe(s,hanning(n),inc);
else
z=enframe(s,hamming(n),inc);
end
f=rfft(z.');
[m,a,b]=melbankm(p,n,fs,fl,fh,w);
pw=f(a:
b,:
).*conj(f(a:
b,:
));
pth=max(pw(:
))*1E-6;
ifany(w=='p')
y=log(max(m*pw,pth));
else
ath=sqrt(pth);
y=log(max(m*abs(f(a:
b,:
)),ath));
end
c=rdct(y).';
nf=size(c,1);
nc=nc+1;
ifp>nc
c(:
nc+1:
end)=[];
elseifpc=[czeros(nf,nc-p)];
end
if~any(w=='0')
c(:
1)=[];
end
ifany(w=='e')
c=[log(sum(pw)).'c];
end
%calculatederivative
ifany(w=='D')
vf=(4:
-1:
-4)/60;
af=(1:
-1:
-1)/2;
ww=ones(5,1);
cx=[c(ww,:
);c;c(nf*ww,:
)];
vx=reshape(filter(vf,1,cx(:
)),nf+10,nc);
vx(1:
8,:
)=[];
ax=reshape(filter(af,1,vx(:
)),nf+2,nc);
ax(1:
2,:
)=[];
vx([1nf+2],:
)=[];
ifany(w=='d')
c=[cvxax];
else
c=[cax];
end
elseifany(w=='d')
vf=(4:
-1:
-4)/60;
ww=ones(4,1);
cx=[c(ww,:
);c;c(nf*ww,:
)];
vx=reshape(filter(vf,1,cx(:
)),nf+8,nc);
vx(1:
8,:
)=[];
c=[cvx];
end
ifnargout<1
[nf,nc]=size(c);
t=((0:
nf-1)*inc+(n-1)/2)/fs;
ci=(1:
nc)-any(w=='0')-any(w=='e');
imh=imagesc(t,ci,c.');
axis('xy');
xlabel('Time(s)');
ylabel('Mel-cepstrumcoefficient');
map=(0:
63)'/63;
colormap([mapmapmap]);
colorbar;
end
五、实验结果与分析
六、实验体会
这次的实验,,给我最大的收获就是培养了独立思考的能力,通过读程序,我更加了解MATLAB的程序设计方法,进一步的了解了掌握基于MATLAB编程实现带噪语音信号端点检测的原理,让我对这门课程又有了新的理解。