function zhouqi=jiyinzhouqi(filename)
%帧长和帧位移是重要的参数,位移是帧长的0~1/2
%短时自相关分析
%filename语音文件*.wav
%zhouqi基音周期,以毫秒为单位表示
[signal,fs]=wavread(filename);%用于得到声音文件的数据和采样率
shift=0.01;%每次移动10毫秒
shift=round(fs*shift); %帧移
n1=fix(fs*0.01)+1; %分析起点0.01ms,帧长30ms
n2=fix(fs*0.03)+1;
shift_count=fix((length(signal)-n1)/shift);
value =zeros(1,shift_count);%存放每次移位后的帧的基音周期
for ii=1:shift_count %分析次数
if n2<length(signal) %防止溢出
data=signal(n1:n2);%加窗,提取一帧数据
N=n2-n1+1;%每一帧的长度
R=zeros(1,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); %调用基音周期分析函数,求最大值所对应的位置,即基音周期
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); %基音周期多次分析数组长度
aver=mean(value);%基音周期的平均值,未去除野点
% index=find(abs((value-aver))>aver/5);%找出偏移均值超出均值的1/5的基音,将其去除
% value(index)=0; %去除大野点的影响
% value=value(value>0);%将基音周期曲线中不符合的野点抠出
value=value(logical(abs(value-aver)<=aver/5));%找出偏移均值超出均值的1/5的基音周期,将其去除
len= length(value);%去除大野点后剩余的基音点数
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
value=value(( value~=0));%出去所有野点后的基音周期数组
len= length(value);%去除野点以后的基音点数
figure(2)
stem(value);
axis([0 length(value) 0 max(value)])
zhouqi=1000*sum(value)/len/fs; %求平均的基音周期,单位是毫秒
% zhouqi=sum(value)/len;%用采样的点数表示基音周期
- 1
- 2
- 3
- 4
- 5
- 6
前往页