语音信号特征提取程序设计代码文档格式.docx
《语音信号特征提取程序设计代码文档格式.docx》由会员分享,可在线阅读,更多相关《语音信号特征提取程序设计代码文档格式.docx(5页珍藏版)》请在冰豆网上搜索。
N=128;
n=0:
N-1;
y=fft(x);
mag=abs(y);
f=(0:
length(y)-1)'
*fs/length(y);
%进行对应的频率转换
subplot(212);
plot(f,mag);
原始信号频谱图'
频率(Hz)'
y=wavread('
%预加重
figure();
原始波形(幅值)'
xx=double(y);
plot(xx);
预加重波形(幅值)'
%对指定帧位置进行加窗处理
Q=y'
;
N=256;
%窗长
Hamm=hamming(N);
%加窗(汉明窗)
Rect=rectwin(N);
%加窗(矩形窗)
frame=60;
%需要处理的帧位置
M=Q(((frame-1)*(N/2)+1):
((frame-1)*(N/2)+N));
Frame=M.*Hamm'
%加窗后的语音帧
frame=M.*Rect'
plot(Frame);
汉明窗'
plot(frame);
矩形窗'
%语音信号分帧
plot(y);
原始'
y=enframe(y,256,80);
帧数'
分帧'
%端点检测
[x1,x2]=vad(x);
%调用函数vad实现
%浊音,取13270--13510个点
%短时自相关函数
temp=y(13271:
13510);
Rn1=zeros(1,240);
fornn=1:
240
forii=1:
240-nn
Rn1(nn)=Rn1(nn)+temp(ii)*temp(nn+ii);
end
end
figure(6);
jj=1:
240;
plot(jj,Rn1,'
b'
浊音自相关函数'
短时自相关函数'
%清音,取12120--12360个点
temp=y(12121:
12360);
Rn2=zeros(1,240);
Rn2(nn)=Rn2(nn)+temp(ii)*temp(nn+ii);
plot(jj,Rn2,'
清音自相关函数'
分帧功能子程序:
functionf=enframe(x,win,inc)
%F=ENFRAME(X,LEN)splitsthevectorX(:
)upinto
%frames.EachframeisoflengthLENandoccupies
%onerowoftheoutputmatrix.ThelastfewframesofX
%willbeignoredifitslengthisnotdivisiblebyLEN.
%ItisanerrorifXisshorterthanLEN.
nx=length(x(:
));
nwin=length(win);
if(nwin==1)
len=win;
else
len=nwin;
end
if(nargin<
3)
inc=len;
nf=fix((nx-len+inc)/inc);
f=zeros(nf,len);
indf=inc*(0:
(nf-1)).'
inds=(1:
len);
f(:
)=x(indf(:
ones(1,len))+inds(ones(nf,1),:
if(nwin>
1)
w=win(:
)'
f=f.*w(ones(nf,1),:
End
选端点功能子程序:
function[x1,x2]=vad(x)
%[x]=audioread('
1.wav'
%幅度归一化到[-1,1]
x=double(x);
x=x/max(abs(x));
%常数设置
FrameLen=240;
FrameInc=80;
amp1=10;
amp2=2;
zcr1=10;
zcr2=5;
maxsilence=8;
%6*10ms=30ms
minlen=15;
%15*10ms=150ms
status=0;
count=0;
silence=0;
%计算过零率
tmp1=enframe(x(1:
end-1),FrameLen,FrameInc);
tmp2=enframe(x(2:
end),FrameLen,FrameInc);
signs=(tmp1.*tmp2)<
0;
diffs=(tmp1-tmp2)>
0.02;
zcr=sum(signs.*diffs,2);
%计算短时能量
amp=sum(abs(enframe(filter([1-0.9375],1,x),FrameLen,FrameInc)),2);
%调整能量门限
amp1=min(amp1,max(amp)/4);
amp2=min(amp2,max(amp)/8);
%开始端点检测
x1=0;
x2=0;
forn=1:
length(zcr)
goto=0;
switchstatus
case{0,1}%0=静音,1=可能开始
ifamp(n)>
amp1%确信进入语音段
x1=max(n-count-1,1);
status=2;
silence=0;
count=count+1;
elseifamp(n)>
amp2|...%可能处于语音段
zcr(n)>
zcr2
status=1;
count=count+1;
else%静音状态
status=0;
count=0;
end
case2,%2=语音段
amp2|...%保持在语音段
zcr(n)>
count=count+1;
else%语音将结束
silence=silence+1;
ifsilence<
maxsilence%静音还不够长,尚未结束
count=count+1;
elseifcount<
minlen%语音长度太短,认为是噪声
status=0;
silence=0;
count=0;
else%语音结束
status=3;
end
case3,
break;
end
end
count=count-silence/2;
x2=x1+count-1;
subplot(311)
plot(x)
axis([1length(x)-11])
Speech'
line([x1*FrameIncx1*FrameInc],[-11],'
Color'
'
red'
line([x2*FrameIncx2*FrameInc],[-11],'