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