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

📄 divideword_v_n.m

📁 实现用MFCC作为特证向量的孤立词识别系统
💻 M
字号:
function postion=DivideWord_V_N(in,fs)
x=in-mean(in);
x=x/max(x); 
winSizeMs=20; 
winShiftMs=20;
winSize=millitosamples(winSizeMs,fs);
winShift=millitosamples(winShiftMs,fs);

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);

x_power=x.^2;
matix=enframe(x_power, winSize, winShift);
energy=sum(matix');

LowPower=(energy)<7;
LowZeroC=(zc)<1;
Power=zeros(1,length(energy));
ZeroC=zeros(1,length(energy));
LENGTH=0;
LENGTh=0;
IsWord=false;isword=false;
%
for i=1:length(energy)
    if(LowPower(i)==1)
        LENGTH=LENGTH+1;
        Power(i)=-1;
        IsWord=true;
    end
    if(LowZeroC(i)==1)
        LENGTh=LENGTh+1;
        ZeroC(i)=-1;
        isword=true;
    end
    if((LowPower(i)==0&IsWord==true)|i==length(energy))
        IsWord=false;
        Power(find(Power==-1))=LENGTH;
        LENGTH=0;
    end
    if((LowZeroC(i)==0&isword==true)|i==length(energy))
        isword=false;
        ZeroC(find(ZeroC==-1))=LENGTh;
        LENGTh=0;
    end
end
%----------------------------------------------------
%如果第一个字有清音的话,销掉第一个字的清音
p=find(Power>0);
if(min(p)<10)
    l=min(p);
    for i=0:Power(l)-1
        Power(l+i)=0;
    end
end
%------------------------------------------------------
%给每个候选区间打上标记
Power(find(Power==max(Power)))=-1*max(Power);
ZeroC(find(ZeroC==max(ZeroC)))=-1*max(ZeroC);
Power(find(Power>0))=0;Power=Power*-1;
ZeroC(find(ZeroC>0))=0;ZeroC=ZeroC*-1;

numberE=1;numberZ=1;
for i=1:length(energy)-1
    if(Power(i)>0)
        Power(i)=numberE;
    end
    if(ZeroC(i)>0)
        ZeroC(i)=numberZ;
    end
    if(Power(i)>0&Power(i+1)==0)
        numberE=numberE+1;
    end
    if(ZeroC(i)>0&ZeroC(i+1)==0)
        numberZ=numberZ+1;
    end
end
%-------------------------------------------------------
%只留下一个待选区间
if(numberE>2)
    for i=1:numberE-1
        PE=find(Power==i);PME=sum(PE)/i;p1(i)=PME;
    end
    p1=min(abs(p1-length(energy)*.51));
    Power(find(Power)==p1)=-1;Power(find(Power>0))=0;Power=Power*-1;
end
if(numberZ>2)
    for i=1:numberZ-1
        PZ=find(ZeroC==i);PMZ=sum(PE)/i;p2(i)=PMZ;
    end
    p2=min(abs(p2-length(energy)*.51));
    ZeroC(find(ZeroC)==p2)=-1;ZeroC(find(ZeroC>0))=0;ZeroC=ZeroC*-1;
end
%-------------------------------------------------------
a=find(Power>0);b=find(ZeroC>0);
if((max(a)-min(b))*(min(a)-max(b))<=0)
    out=[max(min(a),min(b)) min(max(a),max(b))];
else
    if(max(a)<min(b)) 
        out=[max(a) max(a)];
    else
        out=[min(a) min(a)];
    end
end
postion=out*winShift;
postion=[1 postion length(x)];

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -