www.pudn.com > rw_pitch.rar > rw_pitch.m, change:2006-04-19,size:1775b


%由自相关法求取基音周期 
clear all 
 
%读取语音信号,原始语音采样频率为96000Hz 
[filename,filepath]=uigetfile('*.wav'); 
signal=wavread([filepath,filename]); 
subplot(211) 
plot(signal); 
title('原始语音信号'); 
xlabel('时间') 
ylabel('幅度') 
 
%下采样到9.6kHZ(实际语音信号处理中fs通常取7-10kHz) 
signal=decimate(signal,10); 
 
%分帧 
FrameLen = 450; 
FrameInc = 200; 
temp = enframe(signal, FrameLen, FrameInc); 
[m,n] = size(temp); 
t=1; 
 
%每帧进行预处理(滤波)并求取基音周期 
while t=m 
    j=1; 
    for i=1:n 
        newsignal(j)=temp(t,i); 
        j=j+1; 
    end 
     
    %低通滤波 
    f=900; 
    fs=9600; 
    [B,A]=butter(30,2*f/fs); 
    newsignal=filter(B,A,newsignal); 
     
    %设置门限电平 
    amax=max(newsignal(1:100)); 
    bmax=max(newsignal(n-99:n)); 
    cl=0.68*min(amax,bmax); 
     
    %中心削波,三电平量化 
     for i=1:n 
        if newsignal(i)>cl 
            newsignal(i)=newsignal(i)-cl; 
        elseif newsignal(i)<-cl 
            newsignal(i)=newsignal(i)+cl; 
        else 
            newsignal(i)=0; 
        end 
     end 
     newsignal0=sign(newsignal); 
      
     %求取信号的互相关值R(k),Rk(1)对应于短时能量 
     Rk=zeros(1,150); 
     for i=21:300 
         Rk(1)=Rk(1)+newsignal(i)*newsignal0(i);  
     end 
      
     for i=20:150 
         for j=21:300 
             Rk(i)=Rk(i)+newsignal(j)*newsignal0(j+i); 
         end 
     end 
      
     %基音周期即为使R(k)为最大值Rmax时位置k的值与采样频率fs的倒数的乘积 
     Rmax=max(Rk(20:150)); 
     if Rmax<0.25*Rk(1) 
        p=0;                    %本帧为清音,令其基音周期值为0 
     else 
        [y,p]=max(Rk(20:150));   
     end     
     s(t)=p; 
     t=t+1; 
end 
 
subplot(212) 
s=s*1/fs; 
plot(s); 
title('基音轨迹') 
xlabel('帧数') 
ylabel('基音周期')