📄 fronttoend1.m
字号:
function out=fronttoend1(x,fs)
% [in,fs]=wavread('test.wav');
% in=in(:,2);
% x=in;
winSizeMs=20; %确定加窗函数;
winShiftMs=20;
silenceEndMs=200;
backoffMs=250;
winSize=millitosamples(winSizeMs,fs);
winShift=millitosamples(winShiftMs,fs);
silenceEnd=millitosamples(silenceEndMs,fs);
mywindow=window('hamming',winSize);
signedSignal=sign(x);
tmp1 = enframe(x(1:end-1), winSize, winShift);
tmp2 = enframe(x(2:end) , winSize, winShift);
signs = (tmp1.*tmp2)<0;
diffs = (abs(tmp1 -tmp2))>0.02;
zc= sum(signs.*diffs, 2);
%计算短时能量
energy = sum(abs(enframe(filter([1 -0.9375], 1, x), winSize, winShift)), 2);
%计算门限
energynew=energy(1:10);
EMAX=max(energynew);
EMIN=min(energynew);
zcr=mean(energynew);
fzc=std(energynew);
I1=0.03*(EMAX-EMIN)+EMIN;
I2=4*EMIN;
ITL=min(I1,I2);
ITU=5*ITL;
IZCT=min(25,zcr+2*fzc);
N1=0;
N2=0;
%[N1,N2]=getEndPoints(ITL,ITU,IZCT,energy,zc)
duration=length(energy);
backofflength=length(1:winShift:millitosamples(backoffMs,fs)-winSize);
done=0;
%进行端点检测,首先估计起点
HPower=energy-ITU;
LPower=energy-ITL;
HP=zeros(1,length(energy));
LP=zeros(1,length(energy));
LENGTH=0;LENGTh=0;
IsWord=false;isword=false;
for i=1:length(energy)
if(HPower(i)>0)
LENGTH=LENGTH+1;
HP(i)=-1;
IsWord=true;
end
if(LPower(i)>0)
LENGTh=LENGTh+1;
LP(i)=-1;
isword=true;
end
if((HPower(i)<0&IsWord==true)|i==length(energy))
IsWord=false;
HP(find(HP==-1))=LENGTH;
LENGTH=0;
end
if((LPower(i)<0&isword==true)|i==length(energy))
isword=false;
LP(find(LP==-1))=LENGTh;
LENGTh=0;
end
end
HPower(find(HP<4))=min(HPower);
LPower(find(LP<6))=min(LPower);
P1=find(HPower>=0);
NP1=LPower(1:min(P1));NP2=LPower(max(P1):length(energy));
IsWord=true;
for i=length(NP1):-1:2
if(IsWord==true&NP1(i)>1&NP1(i-1)<=1)
N1=i-(i==min(P1));
IsWord=false;
end
end
IsWord=true;
for i=1:length(NP2)-1
if(IsWord==true&NP2(i)>1&NP2(i+1)<=1)
N2=i+(i==max(P1))+max(P1)-1;
IsWord=false;
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
startID=N2;
endID=min(N2+backofflength,length(zc));
M2=sum(zc(startID:endID)>=IZCT);
if M2 >=3
for i=max([1 startID]):endID
if zc(i)>=IZCT
N2=i;
break;
end
end
end
out=x(N1*winShift:N2*winShift);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -