pitch提取一(自相关函数法)

一般的声音都是由发音体发出的一系列频率、振幅各不相同的振动复合而成的。这些振动中有一个频率最低的振动,由它发出的音就是基音fundamental tone),其余为泛音人在发浊音时,气流通过声门使声带产生张驰振荡式振动,产生一股准周期脉冲气流,这一气流激励声道就产生浊音,又称有声语音,它携带着语音中的大部分能量。这种声带振动的频率称为基频,相应的周期就称为基音周期(Pitch),它由声带逐渐开启到面积最大(约占基音周期的50%)、逐渐关闭到完全闭合(约占基音周期的35%)、完全闭合(约占基音周期的15%)三部分组成

基音提取的主要困难:1.声门激励信号并不是一个完全周期的序列。2.声道共振峰有时会严重影响激励信号的谐波结构。3,语音信号是准周期的,受共振峰结构、噪声的影响。4.基音周期变化范围大。

自相关函数周期与原序列周期等同,由此利用自相关函数而提出的一种短时基音检测算法称为自相关函数法。此算法比较适合于噪声环境下的基音提取,但是通常情况下,基音频率与第一共振峰频率比较接近,当声道相应的自相关峰大于基音周期的自相关峰时,单独使用自相关函数会导致半倍和双倍基音的提取误差。

纯净的语音是一个sin函数,如图所示:


f=1/T,表示一分钟转了多少圈,一圈是2*pi个弧度,w是角频率,w=2*pi*f,所以我们也可以将sin函数写作x(t)=A*sin(wt+fan),复杂的语音信号是由多个sin波形组成的,如图所示:

pitch提取一(自相关函数法)_第1张图片       pitch提取一(自相关函数法)_第2张图片                      

谐波是由基频和它的倍频组成的,比如:          由220Hz+660Hz+1100Hz组成的波是谐波,而由100Hz+220Hz+263Hz组成的波就不是谐波,基音提取就是将混合的sin波形分开,如图所示:

                                       

x=wavread('F16A1.wav');%读取声音文件
figure;
plot(x);
title('波形');
n=160; %取1000/160ms的声音片段,即160个样点
for m=1:length(x)/n; %对每一帧求短时自相关函数
for k=1:n;
     Rm(k)=0;
     for i=(k+1):n;
     Rm(k)=Rm(k)+x(i+(m-1)*n)*x(i-k+(m-1)*n);
     end
end
p=Rm(10:n);%防止误判,去掉前边10个数值较大的点 
[Rmax,N(m)]=max(p);%读取第一个自相关函数的最大点
end%补回前边去掉的10个点
N=N+10;
T=N/8; %算出对应的周期
figure,stem(T,'.');axis([0 length(T) 0 100]);
xlabel('帧数(n)');ylabel('周期(ms)');title('各帧基音周期');
T1= medfilt1(T,5); %去除野点
figure,stem(T1,'.');axis([0 length(T1) 0 100]);
xlabel('帧数(n)');ylabel('周期(ms)');title('各帧基音周期');


 
  

你可能感兴趣的:(语音)