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

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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)

相关文档
最新文档