Labfans是一个针对大学生、工程师和科研工作者的技术社区。 | 论坛首页 | 联系我们(Contact Us) |
![]() |
![]() |
#1 |
初级会员
注册日期: 2009-04-23
年龄: 36
帖子: 2
声望力: 0 ![]() |
![]()
我现在利用MATLAB做MFCC语音识别的实现,还有些问题,希望达人指点
对语音信号进行预处理有一步是进行端点检测,采用基于短时能量和短时平均过零率法,程序有点问题,请大人帮忙看看 function [ITL,ITU,IZCT,energy,zc,N1,N2]= epdStats(signal,fs) winSizeMs=10; %每帧设置为10 ms winShiftMs=10; winSize=millitosamples(winSizeMs,fs); signedSignal=sgn(signal); j=1; %计算短时能量和过零率 for i=1:winShift:length(signal)-winSize energy(j)=(sum((abs(signal(i:i+winSize-1))))); zc(j)=sum(abs(signedSignal(i+1:i+winSize)-signedSignal(i:i+winSize-1))); j=j+1; end %设置短时能量门限值 IMX=max(energy); IMN=mean(energy(silenceRange)); I1=0.03*(IMX-IMN)+IMN; I2=4*IMN; ITL=min(I1,I2); ITU=5*ITL; N2=0; %function[N1, N2] = getEndPoints(ITL, ITU,IZCT,energy,zc) duration=length(energy); backoffLength=length(1:winShift:millitosamples(backoffMs,fs)-winSize); done=0; %设置过零率门限值 IF=(((25*winSizeMs)/10)/10000)*fs; IZC=mean(zc(silenceRange)); zcstd=std(zc(silenceRange)); IZCT=min(IF,IZC+2*zcstd); %开始端点检测 for m=1:duration if and(energy(m)>=ITL,~done) for i=m:duration if energy(i)<ITL break else if energy(i)>=ITU if ~done N1=i-(i==m); done=1; end break end end end end end startID=max(N1-backoffLength,1); endID=N1; M1=sum(zc(startID:endID)>=IZCT); if M1>=3 for i=startID:endID if zc(i)>=IZCT N1=i; break; end end end done=0; %结束端点检测 for m=duration:-1:1 if and(energy(m)>=ITL,~done) for i=m:-1:1 if energy(i)<ITL break; else if energy(i)>=ITU if ~done N2=i+(i==m); done=1; end break end end end end end startID=max(1,N2); endID=min(N2+backoffLength,length(zc)); M2=sum(zc(startID:endID)>=IZCT); if M2>=3 for i=max([1 startID]):endID% max added by MPC to prevent neg indices if zc(i)>=IZCT N2=i; break; end end end 多谢了 |
![]() |
![]() |
![]() |
#2 |
高级会员
注册日期: 2008-11-01
年龄: 39
帖子: 406
声望力: 26 ![]() |
![]()
lz 能否把matlab的提示错误整句发上来 大家一起讨论一下?
|
![]() |
![]() |