登录论坛

查看完整版本 : [MATLAB毕业设计] 我现在利用MATLAB做MFCC语音识别的实现,还有些问题,希望达人指点


chclucas
2009-04-23, 21:20
我现在利用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


多谢了

silas_xue
2009-04-24, 06:20
lz 能否把matlab的提示错误整句发上来 大家一起讨论一下?