書到用時方恨少之 speech review

回想很多年以前, 我在做 speech 的時候, 曾經和成大的王駿發教授, 交大的吳炳飛教授學過很多東西. 不過現在連王教授的弟子吳宗憲教授都升任副院長了, 可見得真是光陰似箭…. 我不免又想到當時做 internet 的時候, 也曾經和張系國教授一起開過會. 只可惜我沒有買過他的書, 我看的那些都是從交大圖書館借的或是看報紙連載的, 雖然他的著作我每一本都讀過, 但是我並沒有甚麼 "皮牧師正傳" 之類的書可以請他簽名, 想想真是殘念啊! 總之, 白頭工男話當年, 當初腦海中的知識, 似乎也俱往矣囉!

千金難買早知道, 現在我們又要做 speech 的東西了. 稍微 survey 一下, 現下的 speech 演算法還是免不了要用 LPC (linear-predictive coding) 與 LSFs (line-spectral frequencies). 過去從語音訊號中取得 LPC, 我只知道要先做 autocorrelation , 然後用 Levinsion -Durbin recursion 找出 LPC. 剛才看了一下, 還有個沒啥印象的 Yule-Walker method. 既然後者比前者晚了 10 年才推出 (2003 vs 1993), 不知道是否有比較厲害?!

得到 LPC 係數之後, 再轉到 frequency doamin,  其特性會比較'穩定. 所以 LPC 會轉成 LSP (line specttral pair) 或 LSF. 一般而言, LSP 會被量化, 就像 video coding 的 DCT 係數也要量化一樣. 接下來也和 video coding 一樣, 量化的結果再反量化, 補上一些內插值, 和原來的訊號計算求得殘餘量 (residual),  Residual 的部分就可以查表編碼了.

其中, 可以把先前獲得的資訊拿去動態建立 code book, 若是沿用固定的 code book 則可以省略這一步, 根據量化後的 LSP 和 residual, 我們可以從 code book 中找到最適當的 code 來代表這個 sub-block 或是 sub-frame. 當然, 此時多半會運用均值化 (normalization) 的技巧, 使得 11111 和 99999 都對應到一樣的 code, 只不過它們的 gain 不相同而已. 

複習起來, 差不多就是這樣了. 以後有想到什麼再來補充.

[note]

再看了一下, Levinson-Durbin 可以用來解 Yule-Walker equation. Yule-Walker method 本身是輸入 autocorrelation 數列, 輸出 PSD (power spectral density). 所以兩者之間沒有誰優誰劣的問題.

[ref]

1.  http://thesis.lib.cycu.edu.tw/ETD-db/ETD-search-c/getfile?urn=etd-0714105-140440&filename=9278046.pdf

2.  http://thesis.lib.ncu.edu.tw/ETD-db/ETD-search/getfile?URN=89521046&filename=89521046.pdf

Linux 下的 object 與 library 檔

從客戶那邊拿到一個 Linux 下的源代碼, 例行 ./config, ./make 之後, 在我的 Cygwin 底下生出很多檔案, 但是並沒有一個執行檔, 倒是有很多 .lo 和 .la, 這是平常我們用自家開發的 embedde system tool chain 所不會遇到的. 這些是甚麼東西呢?

首先我們要瞭解為何需要 L 字頭的檔案, 而不是 .o 或 .a 就好? 原因在於要支持動態連結 (dynamic link). Libtool 就是這樣的一個工具, 以便產生出有益於 dynamic link 的 .o 與 .a, 也就是 .lo 與 .la.

.la 檔是一個文字檔, 裡面描述了此 library 的 version, name 等等, 當然也定義了 dlopen, dlpreopen 要去開哪個 library. 靜態連結與動態連結的 library 分別記錄在 old_libaray = 'libxxx.a' 與 library_names = ' ' 的條目之下. 據說 .la 檔也可以包含另一個 .la 檔, 但我沒看過實例.

.lo 檔也是文字檔, 裡面大概包含 PIC object 和 non-PIC object 的 object name. 所謂 PIC 就是 position-independent code 的意思. 如果程式碼與 position 相關, 當然就不容易動態連結囉!

既然 .la 和 .lo 都是文字檔, 因此它們只是 libtool 底下的溝通工具, 透過 libtool 做 link 的時候, 它們便擔任把真正的 .a 和 .o 傳給 gcc 給工具. 

.so 這東西就是指 shared object, 適用於動態連結, 而 .o 就適合靜態連結, .a 則是 .o 的集合, 也就是靜態的 library.

[ref]

1. http://www.eetop.cn/blog/html/40/202640-8862.html (簡體)