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波形組成的,如圖所示:

                             

諧波是由基頻和它的倍頻組成的,比如:          由220Hz+660Hz+1100Hz組成的波是諧波,而由100Hz+220Hz+263Hz組成的波就不是諧波,基音提取就是將混合的sin波形分開,如圖所示:

                                       

<pre name="code" class="cpp">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('各幀基音週期');




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章