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

📄 test_vowels.m

📁 基于matlab,利用AMDF方法检测语音的基音周期
💻 M
字号:
clear all;Fs=10000;
load vowels,soundsc(vowels.a_1);
len=50;
Voice=vowels.a_1'/max(abs(vowels.a_1'));  %对语音进行归一化
figure,subplot(2,1,1),plot (Voice),title('原始语音 ma1-1'),axis([0 length(Voice) -1 1.2]),grid on;
f=enframe(Voice,len,len); 
[row,col]=size(f);
Energy=zeros(1,row);
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  短时平均幅度函数  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%   
%  for i=1:row
%        Ave_Fudu(1,i)=sum(abs(f(i,:)),2);
%  end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  短时能量函数  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%   
    for i=1:row
      Energy(1,i)=sum(abs(f(i,:).*f(i,:)),2);
    end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
MAX=max(Energy);
Ave_Energy=sum(Energy)/row;
Delete=zeros(1,row);
%%%%%%%%%%%%%%%%%%%%%%%%%%  Delete(i)=1 表示第i帧为清音帧  %%%%%%%%%%%%%%%%%%%%%%%%%  
  for i=1:row
      if   Energy(1,i)<Ave_Energy*0.001
          Delete(i)=1;
      end
  end
%   figure,plot(Delete);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
New=zeros(1,(row-sum(Delete))*len);     %清音帧数据全部置零
for  i=1:row
    if Delete(i)==1
        Voice(1,(i-1)*len+1:i*len)=0;
   end
end
subplot(2,1,2),plot(Voice),title('去掉静音和部分清音后的语音信号'),axis([0 length(Voice) -1 1.2]),grid on;
figure,plot (vowels.a_1'/max(abs(vowels.a_1'))),hold on,plot(Voice,'r'),,title('处理前后的语音直观比较'),grid on;
%figure,plot(Energy),title('短时能量'),axis([0 length(Energy) 0 MAX+1]),line([0 length(Energy)],[Ave_Energy Ave_Energy],'color','r'),grid on;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%     短时过零函数   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  signs=(Voice(1,1:(length(Voice)-1)).*Voice(1,2:length(Voice)))<0; 
%  figure,plot(signs),title('短时过零'),axis([0 length(Voice) -1 3]),grid on;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% f2=enframe(signs,len,len);
begin=1;                                %去掉清音后的语音存放在New数组中
for  i=1:row
    if Delete(i)==0
        New(1,(begin-1)*len+1:begin*len)=Voice(1,(i-1)*len+1:i*len);
        begin=begin+1;
   end
end
 figure,plot(New),title('去掉静音和部分清音后组成的新语音信号'),axis([0 length(New) -1 0.6]),grid on;
len=300;inc=round(len*0.3); 
f=enframe(New,len,inc); 
[row,col]=size(f);
F=zeros(row,col);
 for k=1:col
    F(:,k)=sum(abs(f(:,1:len+1-k)-f(:,k:len)),2)/(len-k+1);
 end
Min=zeros(1,row);
Xlable=zeros(1,row);
  for i=1:row
      Min(i)=min(F(i,16:round(0.6*col)));
  end
   for i=3:row                              %找出谷值点的横坐标,存储于Xlable中
      for j=round(Fs/500):round(Fs/40)      %假设人语音的基音频率为40 hz~450 hz
          if Min(i)==F(i,j)   
                Xlable(i)=j;
              if  round((Xlable(i)+1)/(Xlable(i-1)+1))==2  |  round((Xlable(i-1)+1)/(Xlable(i)+1))==2    
                   Xlable(i)=abs(Xlable(i)-Xlable(i-1));       % 对野点进行处理
              end
          end
      end
  end
  num=0;
  for i=1:row         
      if Xlable(i)>0
           num=num+1;
      end
  end
  AVE=sum(Xlable)/num;
  for i=1:row
         if Xlable(i)>AVE*1.1 | Xlable(i)<AVE*0.9 
                 Xlable(i)=0;
             end
         end
 num=0;
 for i=1:row        
      if Xlable(i)>0
           num=num+1;
      end
 end
 %%%%%%%%%%%%%%%%  把存储于Xlable中的平均基因取样点数目转为基因频率  %%%%%%%%%%%%%%%%%%%
 for i=1:row
     if Xlable(i)~=0
         Xlable(i)=Fs/Xlable(i);
     end
 end 
 figure,subplot(2,1,1),plot(Xlable,'.'),title('帧的基因频率原始分布'),grid on;
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
begin=1;
for i=1:row
    if Xlable(i)~=0
      Fra_Vow_Distr(begin)=Xlable(i);
      begin=begin+1;
   end
end
AVE=sum(Fra_Vow_Distr)/num
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%   对实验结果进行平滑   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
      for i=1:5
           Fra_Vow_Distr=smooth(Fra_Vow_Distr);
      end
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
subplot(2,1,2),plot(Fra_Vow_Distr,'b.');
line([0 length(Fra_Vow_Distr)],[AVE AVE],'color','red');
line([0 length(Fra_Vow_Distr)],[AVE*0.95 AVE*0.95],'color','m'),line([0 length(Fra_Vow_Distr)],[AVE*1.05 AVE*1.05],'color','m');
title('线性平滑后的基音频率统计'),xlabel('帧'),ylabel('基音频率/Hz'),axis([1 length(Fra_Vow_Distr) AVE*0.5 AVE*1.5]),grid on;
legend('各帧频率','平均频率','平均频率正负5%的动态范围');

⌨️ 快捷键说明

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