2009年6月19日 星期五

Harmonic Transform

這是一個由F.Zhang, G. Bi與Y.Q. Chen於2001在ICASSP上所提出的一種轉換,它是延伸自Fourier Transform而來,它在FT的公式中加入unit phase function,而這個function即為fo的phase function除上fo的結果。當 unit phase function = t 時,HT就會退化成FT。

在2007年另一篇EUSIPCO論文中,他提出了一種訊號的特例:chirp signal。一般DFT在分析chirp signal時結果會如圖:

image

因此,在論文中便針對這一類的訊號特性去說明如何設計unit phase function,以至於HT的結果會如下圖:

image

FT 雖能幫助我們分析訊號在頻域上的現象,不過對於一些樂器常見的特性諸如gliding , vibrato,分析時常有解析度難以訣擇的問題。HT 開啟了一道門,讓我思考是否針對unit phase function的設計可以更精確的做好某些特殊演奏手法的f0 detection or partials tracking。

投影片: 點我下載

reference:

F Zhang, G Bi, YQ Chen, Y Zeng, Harmonic Transform, ICASSP IEEE INT CONF ACOUST SPEECH SIGNAL PROCESS PROC, 2001

P Zubrycki, A Petrovsky, ACCURATE SPEECH DECOMPOSITION INTO PERIODIC AND APERIODIC COMPONENTS BASED ON DISCRETE HARMONIC TRANSFORM

2009年6月18日 星期四

二胡音樂的分析合成以及夢想的延伸

幾年前, 我的學生AL的碩士論文做的是二胡音樂的分析與轉換合成, 其工作是將一般的二胡路因經過分析, 取出其瞬時的音高與音量的資訊, 再用合成的方式照原樣合成出來. 合成的時候, 可以選用其他樂器的音色, 也就像是同一個人換了一把樂器一般, 當然, 也可以將錄音中的樂器的音色做成音色庫, 而用元音色再合成, 不過會跟原錄音有一點差異. 我做了簡單的投影片如下:

二胡分析與合成

請下載再解壓縮即可.

AL是拉胡琴的, 所以可以知道這樂器眾要的地方在哪裡, 加上他的程式功力一流, 對我的啟發是很大的, 所以一值以來, 我們希望將此一技術再進一步發揚光大, 希望可以Apply在其他樂器上面.

以下是他在Youtube上的一些影片介紹.

AL除了論文本體之外, 也開發了一些人機介面, 提供使用者"玩"音樂, 師大的趙菁文老師也用過這的工具做了一首曲子, 據說非常受到歡迎, 這是我們做工程研究的人的莫大榮幸, 也就是可以受到音樂家的喜愛.

目前我們較不滿意的是合成的音色還不盡理想, 而主要是頭音部分, 目前我的另一位學生showmin還在努力當中.

未來, 我們還希望擴充道可以處理整個管弦樂團, 也就是用虛擬合成的方式來合成整首交響樂, 其中每一把樂器都付與其一個個別的合成器, 讓每一把樂器都有其特別的音色與表情變化, 而且可以讓使用者即席指揮, 不過這牽涉到龐大的計算量的問題, 所幸除了現在的cuda外, 成大電機系與資工系正在合作開發多核心(Multi-core)的CPU與GPU, 希望在不久的將來, 我們可以從演算法到計算用的引擎都用自己開發的東西來完成.

相關的研究或資訊可以在以下看到:

Pitch/Partial Tracking

Musical Information Retrieval

cuda

Multi-core

 

2009 訊號與系統

這是Signals and Systems 課程第一章的投影片, 字跡潦草, 請大家見諒. 我找到時間後會把它整理整齊.

投影片PDF在此.

投影片PPT在此.

因為第一章已經上完了, 請助教可以開始整理一下此一power point檔案了. 整理完請傳給我一下

第二章講的是連續性訊號的一些基本操作. 基本上請大家把訊號看成函數就好. 請多注意他在時間軸上的轉換, 這不是用來刁難大家的, 以後許多定理以及應用會需要他們的. 還有就是注意一下系統的定義以及基本的系統怎麼由其block diagram算出他的transfer function或system equations.

最後提醒大家多去了解與注意impulse function. 這個defined by property的函數對未來是很重要的.

第二章的PPT在此.

第三章的用意在於了解各式的系統表示方法以及利用Transfer function來簡化對Complex Exponential Input的解法. 請多注意不同表示法之間的異同.

第三章的PPT在此.

第四章從Fourier Series著手, 以便將來進入Fourier Transform. 請多注意Linear Algebra的一些基本概念, 如內積, Basis, Orthogonal,...., 等觀念.

第四章的PPT在此.

第五章進入Fourier Transform, 其實跟Fourier Series沒差太多, 但是把Periodic的限制拿掉了. 這樣對訊號分析來說理論上更完整了.

第五章的PPT在此.

2009年6月16日 星期二

Cell Programming 工作報告 - 逼逼逼



我發的前幾篇標題都不好,所以另開一篇標題。


11/24 報的paper:Optimizing Assignment of Threads to SPEs on the Cell BE Processor





請點此



另外進度報告
我們切的方式是要在QP=25,INTRA_PERIOD=30才能得到最好比較好的Performance

----------------------------------我是分隔線--------------------------------
12/01

請點此


測了幾個Block的時間~
最先一開始是讓SPE去讀檔案,然後扣掉檔案的讀取時間。
所測得的時間非常不穩定,時間上下抖動的範圍太大。
之後就想到,疑?是不是讓PPE去讀進來放到External Memory,
然後再去從External Memory去抓這些資料就好。

試了之後效果還不錯,
不過這又產生一個大問題了。
當PPE去讀取很大筆的資料放到Memory,例如要花了兩百多MB。
當我去測它的執行時間時,它的執行時間範圍就有時2秒、有時51秒。
差距非常大。我想了一想,也許是用到虛擬記憶體導致變慢。
所以我將要讀進來的檔案切成五等份, 每一等份是23681筆資料。
每一次我就只做一等份,之後再將這所有的五等份時間相加,得到每一個component時間。
之後所測得的時間就蠻穩定的。

註:老師說時間很奇怪,建議只接收一筆資料,同一筆資料做很多次。
再測其時間看看有沒有變。

----------------------------------我是分隔線--------------------------------
趕緊來記一下跟老師討論的文件大綱

第一章 Overview(大綱,提到Toshiba)
第二章 Cell BE硬體架構
第三章 編譯環境
3.1 PS3上的作業系統 - Yellow Dog Linux
3.1.0 安裝作業系統
3.1.1 介紹Toolchain
3.1.2 如何編譯
3.1.3 其他Compiler (XLC compiler)
3.2 Cell Simulator
3.2.0 安裝Simulator
3.2.1 介紹Simulator的各種mode
3.2.2 如何編譯
3.2.3 各種mode跑幾個範例
第四章 Library的使用:寫程式介紹很多API
第五章 自製Toolchain

---------------------------我是20081208分隔線-----------------------------
投影片內容說明了我們怎麼測SPE的時間
另外還有Queue的實作方式,未來會越改越好地。(希望)

註:拿GNU Pofiler測試一下時間,確定各個block時間的合理性

Future work就是把Queue通通的改成漂亮的Queue,
然後做小實驗。

我是投影片

---------------------------我是20081222分隔線-----------------------------

今天報了有關Cell B.E. blocking, non-blocking channel的介紹
Intro: 每一個SPE上MAILBOX或Signal或其實都是一個個的channel。
透過MMIO(Memory Mapped I.O.)去抓取任何一個channel都將是non-blocking。
SPU讀寫channel的話,要根據channel的type決定是blocking或non-blocking。

我是投影片

進度報告:
實作了將DMA做成多筆一次傳,跑出的數據是多少。
實作了另一種版本的Queue,此版本Queue只有一次DMA,測出數據是沒有達到預期效果。
未來要再解一些bug。

刪了某些圖的投影片

---------------------------我是20081229分隔線-----------------------------

1.
今天報告另外一種切割的方法,簡單的說就是做os的task分配的意思,讓每一個block都能
夠滿滿的、負擔都差不多,不要一直只等著事情做。

2.
報告程式流程

Future work:
解決在一開始的初始化時資料被蓋掉的情況


註:下星期與忠和學長討論有關SystemC的部份

投影片

---------------------------我是20090105分隔線-----------------------------
一. paper的outline
data-flow for mpeg4 decoder on cell
1. Introduction
i) multicore programming
ii) data-flow, Pipelined
iii) MPEG4 on cell
iv) cell architecture, programming thread communication
v) Related Work Difference (only MB-level parallelism)
vi) Contribution
2. Design Methodology
i) mpeg-4 component graph
ii) profiling computation communication
iii) Task Allocation
3. Queue Implementation
i) Mailbox/Signal/DMA Synchronization
ii) Batch Transfer
4. Experiment Results
第一個是不同傳輸方式
第二個是不同切法
第三個是不同node數
5. Conclusion

二. 書的outline
當然是還沒有...
目前我有稍微看過阿六仔寫的書,我還沒有看的很仔細。因為看簡體字也需要想一下。
個人觀感是書的前半部份感覺像是英翻中的手冊,例如講一下SPE的架構,然後列出有哪些指令可以用,感覺比較稍微草率一點,後半部份的某些章節我覺得還不錯,例如它有一章列出你可能會遇到哪三樣錯誤,然後這錯誤大概是因為什麼。
我覺得這章節很不錯,如果使用者遇到的錯誤都能在這本書找到所以然,這本書的價值也許會比較高。





---------------------------我是20090108分隔線-----------------------------


Toshiba SpursEngine
Toshiba所出的這塊媒體串流器(SpursEngine)與Cell B.E.的不同點有






1. Cell B.E有8顆SPE,SpursEngine只有4顆


2. 為了Low Power的設計,將減少的4顆SPE換成MPEG-2與MPEG-4/H.264 Encoder/Decoder


3. 不採PPE為主CPU,可用PC上的Intel Processor


4. IO變更





以上4點摘自 東芝半導體公司披露繼承Cell設計構思的處理器真面目





reference:


[1] Full HD趨勢化的波濤,掌握加工編輯關鍵的影像處理引擎


提到了各種影像處理的加速卡優缺




---------------------------我是20090217分隔線-----------------------------


1. 本書導覽

2. Cell BE 硬體架構
2.1 PowerPC Processor Unit
2.2 Synergistic Processor Unit
2.3 Element InterConnect Bus

3. Cell BE 工具列
3.1 安裝Yellow Log Linux
3.2 安裝軟體開發工具列SDK3.0
3.2.1 Cell Simulator
3.2.2 compiler
3.2.3 Eclipse IDE

4. Cell Programming基本概念
4.1 Process and Thread
4.2 Create SPE Thread
4.3 Create PPE Process
4.4 編譯程式

5. Direct Memory Access
5.1 MMIO concept
5.2 DMA concept
5.2.1 mfc_put, mfc_get
5.2.2 barrier和fenced
5.2.3 alignment
5.3 DMA List
5.4 Double buffer
5.5 Atomic Method

6. 訊息傳遞與同步
6.1 Mailbox
6.1.1 介紹SPE的Mailbox種類
6.1.2 PPE與SPE之間的通信
6.2 Signal
6.2.1 介紹SPE的Signal種類
6.2.2 PPE與SPE之間的通信
6.2.3 OR-mode與Overwrite Mode
6.3 使用DMA達到SPE之間訊息傳遞
6.4 使用Queue達成資料資料傳遞

7. Vector Programming
7.1 在PPE上使用SIMD
7.2 在SPE上使用SIMD
7.3 PPE與SPE上使用SIMD的異同

8. 錯誤解決

---------------------------我是20090224分隔線-----------------------------
今日報告,
完成Queue Type II的Doble Buffer,
我們交互使用兩個不同的參數與標籤(TAG),以節省Communication time。

未來要做的事
1. channel(queue) code generator
2. scheduler code generator

欲先完成第一件事,在經過簡單的程序建立如下的Graph後,
能夠幫我在每個core build channel,並在consumer core初始化queue。















scheduler code generator要等到我把這個先弄完才會繼續,

目前怕參數太多,產生出來的code很複雜。



老師的comment:

1. 未來Cell Programming搭配OpenESL GUI,拉幾下就就可以build connection (這點應該沒問題)

自動產生scheduler,需要user告知scheduler額外資訊。



今天我誤會老師問我的問題?老師問說scheduler寫在哪裡?

scheduler的code當然是另外寫的一支程式,產生的code是跑在componenet裡。

我以為老師是問產生的code跑在哪。



我們目前是想說scheduler會產生一張圖,什麼時候哪個core該做什麼事,都在這張圖上。











目前大概就是這樣,萬事都想好,只欠一步一步完成。



---------------------------我是20090303分隔線-----------------------------

















欲用一個Graph來代表Core與Core之間的溝通機制,
所以我們建一個Graph,經由加Vertex與Directional Edge(有向邊),
語法
1. Add Vertex ex: myGraph.AddEdge(VLD);
2. Add Edge ex: myGraph.AddEdge("VLD","IMC1","IQ_para","IQ_ARRAY");
Vertext 代表module name,Edge代表channel,如同我們在SystemC語法宣告一個channel,
必須給它一個channel type和channel name,後面這兩個變數就是這個Edge的Feature(屬性)。

依據這個圖我們可以分析每個Vertex,它是當了幾個Core的Producer,自己是誰的Producer。
根據這樣的資訊建立channel initialize Code。
下一步就是scheduler code generator,而scheduler code還在改,希望能簡單到可以自動產生,不然原本的code太複雜了。

-----------------------我是20090317分隔線-----------------------------

User一開始會給我們以下幾個資訊

0. DataFlow的流程圖


1. Core的數目,Ex: 現在要跑在6個core上面

2. 每一個Task的loading Ex: VLD必須花500 ms,IMC花2000ms等等的資訊



我們根據以上的資訊,找出最好的Duplication

演算法我們這邊就不提,以後補上。

根據演算法我們會產生每一個Core的Scheduler Graph,如下圖11個duplication分給6core




















根據這張scheduler graph,我們能夠建一張Table描述core與core之間的communication關係之後根據這張Table我們就能跟建立之前我們所說的communication graph,之後就能使用communication(channel) code Generator。目前只做channel code Generator,接著再將code改一改就能完成codeGen了。
老師今天的comment:
1. Eclipse GUI與阿凡討論,列出規格與規劃進度,之後meting拿出來討論進度
2. 4月之後希望能開始改SIMD,然後將改完的SIMD的時間再來重新build graph,讓大家知道不一樣的load會產生不同的scheuler graph
3. 希望未來能再porting一個codec上去,希望這個scheduler code generator是夠general的




















































































































































































































































































































































































































Core 0 VLD0VLD1VLD2VLD3VLD4IQ3VLD5IQ4VLD6IQ5VLD7IQ6IDCT2VLD8VLD9IQ8VLD10IQ9IQ10
Core 0 0~419419~838838~12571257~16761676~20952095~27052705~31243124~37343734~41534153~47634763~51825182~57925792~80658065~84848484~89038903~95139513~99329932~1054210542~11152
Core 1 IDCT3IMC0IDCT5IMC1IMC2IMC3IMC4IDCT8IMC5IMC6IMC7IMC8IMC9IMC10
Core 1 2705~49784978~54845484~77577757~82638263~87698769~92759275~97819781~1205412054~1256012560~1306613066~1357213572~1407814078~1458414584~15090
Core 2 PB0PB1PB2PB3PB4PB5PB6IQ7PB7IDCT7PB8PB9PB10IDCT10
Core 2 419~11621162~19051905~26482648~33913391~41344134~48774877~56205620~62306230~69736973~92469246~99899989~1073210732~1147511475~13748
Core 3 IQ0IQ1IDCT0IQ2IDCT1IDCT4IDCT6IDCT9
Core 3 419~10291029~16391639~39123912~45224522~67956795~90689068~1134111341~13614








---------------------------我是20090401分隔線----------------------------




今天報的是有關IBM所開發的Accelerated FrameWork(ALF)




附上投影片




---------------------------我是20090408分隔線----------------------------




今天提出兩個問題,其中之一已能妥善解決,以下描述我遇到的問題。




1. 初始化中,Race Condition的問題。解決方式:使用PPE做主端控制,將控制權依順序交給各個SPE做初始化。同時間只有一個SPE能做寫入的動作。這樣雖然初始化會慢了一點點,但是卻能不用變更到現層的架構所提出的方法。




2. 遇到架構上的缺限,scheduler所產生的排程,應用在core與core之間的channel對應會有問題存在。




目前先寫論文,目前要兩步驟方式,




第一 產生scheduler圖




第二 檢查schduler圖可否產生code,可以的話gen code。




---------------------------我是20090414分隔線----------------------------




解決conflict的問題。Future work: 當candidate list為空的時候,找尋workload此少的core去assign。




數據看起來不make sense,目前要固定某種變量,看數據跑出來的狀況。




1. 為什麼相同Duplication, 比較多Core卻較差




2. 為什麼相同Core, 比較多Duplicatoin卻較差。




是不是因為Queue SIZE未達到最佳的臨界點。




我目前打算產生兩樣數據




1. 固定每一個core的Queue Size,測出數據圖。




2. 紀錄每張圖的最佳Queue size是多大。




---------------------------我是20090429分隔線----------------------------




老師的comment




1. 更改演算法,讓4core在1個duplication下的時間能比3core在1個duplication的時間少




2. 產生出來的數據有多點疑問,必須一一釐清




2.1 Estimate的時間怎麼會比Real跑出來的還慢?必需再去確認這方面的code有沒有錯,還有就是Estimate的時間要再精確點,例如使用SystemC去model整個執行環境。




3. codeGen有一些bug存在,必須把它解掉




4. mplayer那部份的code要重寫,整合Eclipse IDE部份




5.列出論文大綱




第3,4,5點的部份我會先把它做掉,之後再從第1、2點開始解。







---------------------------我是20090512分隔線----------------------------










根據這張圖,老師的疑問說,為什麼4core在1個duplication會比3core的執行時間長。




我們更改程式分配行為,每一顆core上有兩種時間,一種是current time,另一種是workload time。workload time本來是紀錄是此核心上的所有的Task的時間總和。我們現在加上idle time。current time是目前該核心的時間。我們是根據最小的workload來分配Task。



此圖是更改後。


老師的comment,解釋3,4core在1個duplication的時間為什麼會一樣,5,6core為什麼在1個duplication的時間會一樣,而且會比3,4core好。


解釋1. 4 core的執行時間會一樣,是因為task的之間有dependency的關係。如IDCT0要等到IQ0做完才可做,所以雖然多了一顆核心,但是最長的執行時間仍然坐落在做IDCT0與IMC0的核心上。


解釋2. 5,6 core的執行時間會一樣,是因為在1個duplication的狀況下,Task有5個,所以剛好可以分配給五個core。但是多了一顆core其實是沒有做事的。


小新的問題:為什麼4,5core同樣的Estart Time,5core卻會比較好?


解釋 5core在1個duplication的狀況下會比4core好,是因為剛好每一個task都分配給一個核心做。而沒有dependency的Task,可以自由的先執行,例如VLD1不用等IMC0執行完才做,所以這樣的時間就會重疊起來。所以執行時間是該核心最後一個task的結束時間減去第一個Task開始的時間。


小新的問題: duplication的名詞有點怪,以為是要等到1個Macroblck都做完才能輪到下個Macroblock做。


阿拉給我的旨意: 想辦法取每一個Module的最佳的程式時間,但分配用的是平均時間。




-------------------------------------------------------------------------------------------

將程式部份的名稱改的好看

函式名稱有個DB代表使用Double Buffer機制

DB_funName(para1,para2,para3)

para1用來表示channel是跟誰建立的,如圖中的C_SPE0

表示我是當Consumer,SPE0是Producer。我要接收從SPE0傳遞過來的資料。

ToSPE3(para1,para2,para3);

To後方接的名稱代表我要將計算完的資料重送到哪一個core,例如SPE3。

如果是要傳送給做IMC的core,因為我們使用角色互換的trick。

所以它不是固定給哪個core做,這裡我們使用ToIMC傳遞參數

這個函式會幫我們判斷OutputSel是0或1的時候要送給哪一個Core。

我們的CodeGenerator要寫的適合各種case的話

必須讓User設定很多參數,例如要讓這些code執行多少次,要使用的Function是input、output是什麼。

所以我們原先的使用方式是我們先將程式改成可以Codegen的格式,再來寫code generator

而目前沒有辦法做到任何case都可以適用,最大的問題也許是角色互換的那個trick。

再來就是我們要幫它們的module function 建立Double Buffer機制、然後傳遞資料時要有TAG的資訊,TAG不能都用一樣的,因為會有效率上的問題。

期待學弟了解這些機制後和寫法後能夠改善。