我们这组的期末报告有两个部分是猜数字的小游戏第二.DOC

我们这组的期末报告有两个部分是猜数字的小游戏第二.DOC

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
我们这组的期末报告有两个部分是猜数字的小游戏第二

我們這組的期末報告有兩個部分,第一部分是猜數字的小遊戲,第二部分則是嘗試複雜度比較高的影像壓縮和解壓縮(DCT IDCT)。以下就是我們對第二部分題目的講解。 DCT這個題目是來自我們演算法課程的作業,因為感覺很有趣而且非常值得在速度和壓縮比上作加強和改進,所以我們選擇它來作我們第二部分的題目。我們這個題目的目標有兩個方向: 用C寫出整個DCTIDCT,並在壓縮比上盡量增大。 第二,用我們目前所學過的組合語言,和加速技巧,來改寫原來程式中的某些部分,然後用__asm還將其與原來的主程式結合在一起,希望能讓整個程式的執行速度有所提升。 DCTIDCT C 在coding的過程中,我們發現浮點數的運算對我們而言難度似乎頗高,但是不用浮點數的運算,將會使壓縮的誤差大幅度提升。我們也不確定能否在期限前將組語的部分完全的完成,不過畢竟我們已經在過程中學到不少。 還有,似乎也有其他不少組別也決定用這個題目,雖然如此,我們仍然把這份報告當作獨立的一份報告,因此也仍然盡量作的完整。以下,就是我們對影像壓縮及解壓縮技術和程式間的連結做個簡單扼要的介紹。 *壓縮: 首先,在程式的一開始,我們先將一張圖片切成許許多多8乘8的小方塊,每個小方塊存共存有64點,也就是64像素的資訊。 而每張圖片皆是由RGB紅黃綠三種亮度信號組合而成的,我們可以透過一套公式把他轉換為一個亮度訊號及兩個色差訊號,不過因為這個過程並不包含在我們程式中,故省略不談。 接下來就是整個程式的重心,Discrete Cosine Tranfer(DCT)個過程。這個過程的概念在於:圖片的能量集中在低頻的部分,故我們經由DCT保留大部分低頻的資訊,而捨棄部份高頻的資訊。其公式如下: 經過DCT的轉換,我們便將轉換完成的MN座標除以下這個量化標準矩陣: 16 11 10 16 24 40 51 61 12 12 14 19 26 58 60 55 14 13 16 24 40 57 69 56 14 17 22 29 51 87 80 62 18 22 37 56 68 109 103 77 24 35 55 64 81 104 113 92 49 64 78 87 103 121 120 101 72 92 95 98 112 100 103 99 以上為亮度的量化矩陣,另外還有色差的量化矩陣,不過因為我們程式只處理亮度訊號的壓縮,所以就略過色差的部分。除以量化矩陣的意義也和DCT相同:壓縮高頻資訊,保留低頻資訊。 MN座標經過量化矩陣的處理過後,大致會變成一個左上角都為正值,右下角都為0的矩陣,故我們可以經由zigzag的方法將MN矩陣寫入一個一維陣列(再此暫定其為z[64]),並且此一維陣列的後半會出現連續的0。以下就是我們做zigzag的順序。 接下來我們的程式先計算z[64]由後面算來會有多少連續的0,接著開始將z[64]依序寫入file裡(我們儲存壓縮結果的地方),如果寫入到了後面都是0的地方,就寫入大寫字母「E」來作記號。 我們的壓縮程式大致就到此完成,結果大概可以壓縮到原本大小的21%左右,失真率也控制在不錯的範圍內。 程式接下來就是解壓縮的部分,其內容簡而言之就是壓縮時的相反,其內容便不再重複,只列出IDCT的公式: 組語 基本上看過整個code之後,發現了主要有兩個地方可以做修改: 屬於整數的乘除法,可以利用移位來達成加速的結果。 其中以2的倍數的乘除最有效率,因為通常只需要一次的移位,就能達到乘除的目的。但是浮點數在測試過後似乎是不能這樣用…所以裡面特別只挑了可以用的整數來使用。 比如說要乘以4(假設被除數存在eax)時可以 shl eax,02H 其結果需要1 clocks。 但是若是要除以非2的整數,比如說6,就需要 lea eax,[eax+eax*2] add eax,eax 需要2 clocks 即使要乘以一個相當大的數字,如2005也只需要用 mov ebx,eax shl ebx,08H sub ebx,eax lea eax,[eax+eax*4] sub ebx,eax lea eax,[eax+ebx*8] 這樣6 clocks的指令即可結束,當在一迴圈內要作很多次這樣的計算時,將可大量減少計算的時間。 矩陣要進行一種有規律的運算之時,內嵌的組語中使用SSE或MMX來達成減少計算量以及空間的效果。因為其中牽涉到了浮點數運算,使得SSE又比MMX還要適用於這個程式。 因為SSE有8個128 bit 的暫存器(xxm0~xxm7),各可以存放4個32 bit的單精確度浮點數,可用其來進行運算,比起普通運算,可以少掉許多時間,跟MMX比起來在處理浮點數的功能上又有許多優勢。相對適合在這個程式中使用。 然後

文档评论(0)

youbika + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档