www.pudn.com > manvoice.rar > manvoice.m


clear; 
[x,fs,NBITS]=wavread('voice.wav'); 
x=resample(x,8000,fs);figure(1);plot(x);title('重抽样后的信号');grid; 
%figure(1);plot(x);grid; 
figure(2); 
specgram(x,512,8000,hamming(256),250);    %窄带语谱图 
title('窄带语谱图'); 
figure(3); 
specgram(x,128,8000,hamming(60),50);    %宽带语谱图 
title('宽带语谱图'); 
frmlen=60;          %帧长 
frmn=ceil((length(x)/frmlen));       %帧数 
m=zeros(1,800);  %可能有冗余 
x=cat(1,x,m');    %在x后补零以构成整数帧 
y=zeros(1,2*frmn);  %向量y存每帧的操作结果 
count=zeros(1,2*frmn);  %向量count存每帧的过零率 
for i=1:2*frmn                      %帧长为60点,帧移为30点 
    sqsum=0; 
     for j=1:60        
          sqsum=sqsum+x(j+30*(i-1))^2;  %短时能量 
         %sqsum=sqsum+abs(x(j+30*(i-1))); %短时幅度 
         if (x(j+30*(i-1))*x(j+1+30*(i-1)))<0   %过零率 
           count(i)=count(i)+1; 
        end 
     end 
       y(i)=sqsum;     
end; 
aaa=y.*count;   %短时能量除以短时过零率 
figure(4);plot(y);title('短时能量');grid; 
figure(5);plot(count);title('短时过零率');grid; 
figure(6);plot(aaa);title('两种算法的结合');grid; 
%以下为基音检测 
for i=1:length(x)            %三电平削波 
    if x(i)<-.2           %此门限值应该根据各人语音进行调整 
        x(i)=-1; 
    elseif x(i)>.2 
        x(i)=1; 
    else x(i)=0; 
    end 
end 
for i=5000:5499              %窗口上下限应该根据各人语音进行调整,选取浊音周期性好的一段 
    y(i-4999)=x(i); 
end 
for i=5000:5749 
    yy(i-4999)=x(i); 
end 
sfrsum=zeros(1,251); 
for k=0:250 
    for m=1:500 
        sfrsum(k+1)=sfrsum(k+1)+y(m)*yy(m+k);             %修正的短时自相关 
    end 
end 
figure(7);plot(sfrsum);title('基音周期的检测自相关函数值');grid;