📄 divideword_v_n.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 + -