close

 

為久違的痞客邦拔草,

順便記錄上學期(四下)的一堂課:ASAS數位訊號分析與合成,的最後一份作業。

這是一堂好課,

而這是關於 Linear Prediction Modeling (下稱LPM)*,

與它的演算法:Levinson-Durbin recursion method (下稱LDRM)* 的一份作業。

(*詳見最下方資料補充)

 

而在此作業中,除了解讀老師提供的code,

我稍微討論了程式內各種參數,對於結果的影響。

 

這就是本篇文章的目的,記錄我的心得與討論結果。

 

=========正題前的acoustic科普(?)=========

 

先假設發出聲音的過程,都可以用impedance(Z,猶如電學的電阻、超音波中的attenuation)來描述。

它是一個與截面積成反比的係數。

以人來說,氣流從肺部迅速地通過氣管、聲帶、喉嚨、口腔,向外吐出發聲。

這一路上的凹凸起伏,都可以看作是截面積不同的軟橡皮管,組裝而成。

(在形式上,是假設為全pole無zero的IIR filter*)

 

而軟管之間,氣流因為管子粗細不同會產生通過/反彈,

兩者之比名為 reflectance,

以impedance來表示即為: r12 = (Z1-Z2)/(Z1+Z2);

相等的另一種表示法就是:Z1/Z2 = (1+r12)/(1-r12)

(此關係式之後會用到)

 

LPM的目的,

就是從已知的聲音資訊,拼湊出發聲軟管的原始面貌。

得知之後,通入氣流,自然就能合成出聲音了。

 

而方法,簡單來說,LPM就是收集聲音資訊,用 Least-Square Formulation(最小平方法)*,

以逼近得到

(1) 發聲源(source)的反彈係數

(2) 發聲管道每一截的impedance

(3) 管道末端(load)的反彈係數

 

而 LSF 詳細作法如何,並不是很重要,

因為matlab已經有了lpc()這個函式,短短一行就能得到error值最小的解。

但這不太好XD

LSF 是一種O(n^3)的苦勞,計算反矩陣,即使是電腦也是很辛苦的。

於是LDRM因應而生,用空間(記憶體)換取時間的作法,是以雙重迴圈實踐O(n^2)的方法。

 

親愛的matlab也支援了這個方法:LEVINSON(R,p)

R是音訊平方;

p是LPM的order,一個隨便你設的參數,後面會提到它的影響。

 

有了以上的基礎,就能來討論一下matlab code中,各參數對於模擬結果的影響了:D

 

=========科普(?)結束=========

==========實踐步驟==========

 

以matlab實踐LPM的步驟如下:

(1) 讀取音檔 (本份作業是要自己錄五個母音)

(2) 設定 fs 重新sampling音檔(或用matlab預設的44100)

(3) 設定 frame_length。時間上連續的音檔,必須切成分開的frame才能進行分析嘛

(4) 設定p,linear prediction order,意義上是「把發聲軟管假設為幾截」,也就是IIR filter中的pole數。

(5) 是否要作 pre-emphasis

 

仔細一數,能設的也就這四個參數了,接下來就是一些固定的數值。

比如:聲速c、繪圖用的dx、每個frame能得到的equation數量:L等等,因為是受上面參數影響的定值,就不討論了。

不過它們會給參數帶來一些限制,留下一階段討論。

 

(6) 接下來把音檔做一些處理,看是乘個window、調整長度、取平方之類的,連同p一同丟給 Levinson()函式即可。

      打得好像把食物丟到烤箱一樣

(7) 觀察結果,要看頻率、error、波形等等都可。

 

      Levinson丟出來的A、E、K,分別為

      A=LPM coefficient (就是IIR filter的乘項)

      E=各階段計算出來的差值

      K=可以理解為A型態變化後的結果,是LDRM特別產生、便於計算A 的數列。

      不過非常剛好地(?),K值正是最前面假設中的reflectance。

 

      而在第一段提到的 Z1/Z2 = (1+r12)/(1-r12),就可以派上用場了,

      由於Z和截面積成反比,將Z開根號,即是和截面積半徑成反比。

      於是,當我們有一堆reflectance(K)時,就能得知每截水管的截面積半徑之比!

 

      如此累積相乘的結果,便能觀察發聲構造的幾何分佈了XD

      不需要解剖手術,就能像用手捏著一般量測身體裡喉管的寬度,

      是不是很有趣呢(巧虎調)

 

==========步驟結束==========

==========參數影響==========

(1) fs

首先是 sampling frequency:fs

使用matlab預設的44100也沒什麼不好,就是計算量大了點。

(我們還是盡量避免這點吧)

fs的下限,根據可愛的Nyquist Theorem*,fs至少要fc兩倍,

就看你音檔的fc 如何了,我對自己的音檔取了-30dB的頻率範圍,fc都在5000以下,

所以fs取了10000Hz。

 

不同fs沒有影響,只要它在Nyquist Theorem的包蔽下。

 

雖然步驟很eazy,但這個fs,將是一切的起點。

 

***

(2) P-the Linear Prediction Order

基本上,p這個數字,決定了我們模擬出來的真實度。

就像微分切得愈細愈精準,p值代表變數的數量、計算量與不同寬度管子銜接的數量。

 

但它並不能無限上漲。

 

還記得步驟的最後,我們要繪製一個人體喉道表嗎?

人體喉道的長度是有限制的,自己摸著量量能知道,大概35~40cm吧(包含轉折長度)

如果最後繪出來,長度突破天際,就……

於是這個隨著fs而來的限制,誕生了:

      dx = 聲速/fs;   % spatial, unit:cm per sample

      代入

      35(cm)<=p*dx(喉道總長)=<40(cm)

得到:0.0001020<=(p/fs)<=0.0001166

 

如果用matlab預設fs=44100,則這就是p的上限:

      p<=51.4

(也可以說是matlab執行Linear Prediction的極限……)

 

如果用我自訂的fs=10000,則下限為:

     10.2<=p 

進整數取11;

這就是尾隨而來的第二個限制。

 

而關於不同P造成的影響,繪製頻譜圖可發現,

P愈大時,模擬愈接近真實情況,所以頻率曲線變得毛躁不平滑……

是好是壞就因應用而異了。

作業內容是要找出共振峰值f1、f2,所以我使用了P=11(最小值)的頻率曲線,效果十分顯著。

反觀用P=50的話,就不是那麼直觀了。

 

而在error方面,隨著p增大,error變少的可以預期的,成為趨近於0的一直線。

 

繪製喉道表的部份,是此參數的重點,當P=11時,長度與半徑都落在合理範圍內;

而P=50時,長度長達170cm、半徑寬達20、30,明顯……不是人類(也許外星來的巨嘴長脖怪物吧:D

 

***

(3) frame_length

相較於上述,frame_length的限制比較顯而易見。

首先,frame_length不能比音檔總長度長……(不到一個frame是要做什麼呢)

第二,LPM的計算方式中,L是等式數量、P是變數數量,

矩陣中想要解出所有的變數……等式數量必須比較多:

      L>=P

而   L=frame_length*fs

(一個frame中能產生幾個等式)

所以得到:

      frame_length>=p/fs  

 

不過可惜的是,frame_length對於頻率曲線的影響、波形、error都不大,

只是影響顯示的間距,非常無用。

 

唯一值得一提的是,在繪製喉道表時,

因為frame_length影響了迴圈的次數,產生的reflectance數量不同。

frame_length較短,疊乘出來,讓半徑的寬度變寬了 。

真是誤導人的功能啊

 

***

(4) Pre-Emphasis

為什麼要做pre-emphasis?

因為聲音的高頻頻率的振幅會下降,為了方便觀察高頻部份,

處理音訊時,常會特別加強其高頻部份。

 

但這麼做是有風險的。

基本上改變音訊的本質,會直接造成結果誤差。

 

從喉道表能看出,在/a/、/e/、/o/的部份,由於此三音的高頻部份較低,

經過pre-emphasis後,需要口腔張得特別寬,才能發出具有強烈高頻的聲音:D

 

==========參數結束==========

===========結論============

 

上面打的大概只是1/4部份吧,畢竟這份作業我寫了12頁。

不過我懶了,何況這篇是記錄性質,大概沒什麼人願意讀完吧,HAHA。

 

要感謝劉老師開了這堂非常充實又愉快的ASAS課程,

深入淺出、導讀paper、練習matlab code等等,都是我進化史中不可或缺的基石!

 

很可惜(?)的是,直到最後一份作業(此份),

才從助教口中得知,應該針對各種係數進行討論,而不是單純回答作業問題。

 

而從討論中,了解到code與LPM、LDRM的實質意義,是很寶貴的。

 

如果有興趣了解作業題目、內容、講義,請連絡我。

上述有什麼錯誤,也請留言訂正,感謝:D

 

==========================

不是很重要的資料補充:

Linear Prediction Modeling:

http://en.wikipedia.org/wiki/Linear_prediction

Levinson-Durbin method:

http://en.wikipedia.org/wiki/Levinson_recursion

IIR:

http://en.wikipedia.org/wiki/Infinite_impulse_response

Least-Square formulation:

http://en.wikipedia.org/wiki/Least_squares

Nyquist Theorem:

http://en.wikipedia.org/wiki/Nyquist%E2%80%93Shannon_sampling_theorem

 

 

arrow
arrow

    卡滋里滋多里多滋 發表在 痞客邦 留言(1) 人氣()