语音信号基音周期检测的matlab程序.doc
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
function nmax=find_maxn(r)
%寻找峰值最大的n值及基音周期
%r,自相关序列
%maxn,为峰值最大的n
zer=find(r==0); %找第一个零点如果存在
jiaocha=0; %找第一近零点
ii=1;
while (jiaocha<=0)
if(r(ii)>0 && r(ii+1)<0 && (ii+1) jiaocha=ii; end ii=ii+1; if ii==length(r) %没有找到符合要求的点 jiaocha=1; end end if length(zer)>0 %检查是否存在零点 if zer(1) end end r(1:jiaocha)=0; %祛除影响 maxn=max(r); %找最大值 temp=find(r==maxn);%返回第一个最大值 nmax=temp(1); function jiyinzhouqi(filename,shift) %短时自相关分析 %filename语音文件*.wav %zhouqi基音周期 shift=10; [signal,fs]=wavread('f:/mywork/1.wav'); shift=round(fs*shift); %帧移 n1=fix(fs*0.97)+1; %分析起点970ms,帧长30ms n2=fix(fs*1)+1; ii=1; for ii=1:(length(signal)-n1)/shift %分析次数 if n2 data=signal(n1:n2); N=n2-n1+1; R=zeros(1,N); %基音周期(n)多次分析数组 for k=1:N-1 %求自相关序列 for jj=1:N-k R(k)=R(k)+data(jj)*data(jj+k); end end value(ii)=find_maxn(R); %调用基音周期(n)分析函数 n1=n1+shift; %移动帧 n2=n2+shift; end end %figure(3) %plot(R); %axis([0,1000 -300 300]) figure(1) stem(value); axis([0 length(value) 0 1000]) len =length(value); %基音周期(n)多次分析数组长度aver=mean(value); index=find(abs((value-aver))>aver/5); value(index)=0; %去除大野点的影响 len=len-length(index); for jj=1:3:len/3 %中值平滑,滑动窗口宽度3,精度为中值1/4(剔除野点) average=(value(jj)+value(jj+1)+value(jj+2))/3; for kk=1:3 if abs((value(jj-1+kk))-average)>average/4 value(jj-1+kk)=0; %将野点置零,同时数组长度减一 len=len-1; end end end figure(2) stem(value); axis([0 length(value) 0 max(value)]) Tp=sum(value)/len/fs %求基音周期(Tp)