📄 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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -