⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fronttoend1.m

📁 实现用MFCC作为特证向量的孤立词识别系统
💻 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 + -