時間:2007.08.14
地點:教師休息室
備註:以下是以我理解的方式做觀念解釋
更完善的拆解方式請參見:
老師的程式或小冬的Meeting紀錄7
內容:加快DCT程式的運行(作法:讓重複的運算只算一次)。
①公式

②每個8x8 Block的程式碼骨架
for(int u=0; u<8; u++)
for(int v=0; v<8; v++)
{
//----算1/4・C(u)・C(v)
for(x=0; m<8; m++)
for(y=0; n<8; n++)
{
//----算f(x,y)*cos◯cos◯
}
}
③由於之後的每個8x8 Block處理時,uˋvˋxˋy又從0再跑至8
一次。為避免每個8x8 Blcok同樣的uˋvˋxˋy組合又再運算
一次進而花時間,於是先將uˋvˋxˋy所有可能的組合與運算
出的值先一次算出來儲存於陣列裡,待之後有重複時再查詢該
陣列即可節省再運算的時間。
⒜公式中的f(x,y)代表每個點的Y(或Cb或Cr),先忽略。
⒝第一個雙層for迴圈,當知道uˋv值時即可算出公式中
的"1/4・C(u)・C(v)"。
⒞第二個雙層for迴圈,再知道xˋy值時即可再算出公式中
的

⒟算出所有的uˋvˋxˋy組合的值後,執行DCT時只需將
f(x,y)乘上陣列裡儲存的以上已算出的值即可。
心得:
進而思考到
一個值需要四捨五入時就呼叫四捨五入函數(很多次)
與將該值第一次呼叫四捨五入函數得到的值儲存...
之後要用到的時候再查詢陣列
就空間與時間兩方面考量
不知道哪個方法會比較好(?)
有待思考
沒有留言:
張貼留言