语音信号基音周期检测的matlab程序

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

functionnmax=find_maxn(r)%寻找峰值最大的n值及基音周期%r,自相关序列%maxn,为峰值最大的nzer=find(r==0);%找第一个零点如果存在jiaocha=0;%找第一近零点ii=1;while(jiaocha=0)if(r(ii)0&&r(ii+1)0&&(ii+1)length(r))jiaocha=ii;endii=ii+1;ifii==length(r)%没有找到符合要求的点jiaocha=1;endendiflength(zer)0%检查是否存在零点ifzer(1)jiaocha%存在,则和jiaocha比较大小,用于祛除前点的对基音周期的查找带来的影响jiaocha=zer(1);endendr(1:jiaocha)=0;%祛除影响maxn=max(r);%找最大值temp=find(r==maxn);%返回第一个最大值nmax=temp(1);functionjiyinzhouqi(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,帧长30msn2=fix(fs*1)+1;ii=1;forii=1:(length(signal)-n1)/shift%分析次数ifn2length(signal)%防止溢出data=signal(n1:n2);N=n2-n1+1;R=zeros(1,N);%基音周期(n)多次分析数组fork=1:N-1%求自相关序列forjj=1:N-kR(k)=R(k)+data(jj)*data(jj+k);endendvalue(ii)=find_maxn(R);%调用基音周期(n)分析函数n1=n1+shift;%移动帧n2=n2+shift;endend%figure(3)%plot(R);%axis([0,1000-300300])figure(1)stem(value);axis([0length(value)01000])len=length(value);%基音周期(n)多次分析数组长度aver=mean(value);index=find(abs((value-aver))aver/5);value(index)=0;%去除大野点的影响len=len-length(index);forjj=1:3:len/3%中值平滑,滑动窗口宽度3,精度为中值1/4(剔除野点)average=(value(jj)+value(jj+1)+value(jj+2))/3;forkk=1:3ifabs((value(jj-1+kk))-average)average/4value(jj-1+kk)=0;%将野点置零,同时数组长度减一len=len-1;endendendfigure(2)stem(value);axis([0length(value)0max(value)])Tp=sum(value)/len/fs%求基音周期(Tp)

1 / 2
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功