2007年8月17日 星期五

Meeting - Jiayu 02

次序:07
時間: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)乘上陣列裡儲存的以上已算出的值即可。


心得:
   進而思考到
   一個值需要四捨五入時就呼叫四捨五入函數(很多次)
   與將該值第一次呼叫四捨五入函數得到的值儲存...
   之後要用到的時候再查詢陣列
   就空間與時間兩方面考量
   不知道哪個方法會比較好(?)
   有待思考

沒有留言: