HADAMARD變換

for (j=0;j<16;j)
?? {
?? ??? for (i=0;i<16;i)
?? ??? {
?? ?? M1[ i ][j]=imgY_org[img->opix_y+j][img->opix_x+i]-img->mprr_2[k][j][ i ]; ?? ?? 計算當前宏塊殘差塊
?? ?? M0[i%4][i/4][j%4][j/4]=M1[ i ][j];
?? ??? }
?? }
?? current_intra_sad_2=0; ?? ?? ?? ??? // no SAD start handicap here
?? for (jj=0;jj<4;jj)
?? {
?? ??? for (ii=0;ii<4;ii)
?? ??? {
?? ?? for (j=0;j<4;j) ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? 第一次一維Hadamard變換
?? ?? { ?? ?? ?? ?? ?? ?? ?? ?? ?? ???
?? ?? ?? M3[0]=M0[0][ii][j][jj]+M0[3][ii][j][jj];
?? ?? ?? M3[1]=M0[1][ii][j][jj]+M0[2][ii][j][jj];
?? ?? ?? M3[2]=M0[1][ii][j][jj]-M0[2][ii][j][jj];
?? ?? ?? M3[3]=M0[0][ii][j][jj]-M0[3][ii][j][jj];
?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???
?? ?? ?? M0[0][ii][j][jj]=M3[0]+M3[1]; ?? ?? ?? ?? ?? ?? ??
?? ?? ?? M0[2][ii][j][jj]=M3[0]-M3[1]; ?? ?? ?? ?? ?? ?? ??
?? ?? ?? M0[1][ii][j][jj]=M3[2]+M3[3]; ?? ?? ?? ?? ?? ?? ??
?? ?? ?? M0[3][ii][j][jj]=M3[3]-M3[2]; ?? ?? ?? ?? ?? ?? ??
?? ?? } ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??

?? ?? for (i=0;i<4;i) ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???
?? ?? { ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
?? ?? ?? M3[0]=M0[ i ][ii][0][jj]+M0[ i ][ii][3][jj];
?? ?? ?? M3[1]=M0[ i ][ii][1][jj]+M0[ i ][ii][2][jj];
?? ?? ?? M3[2]=M0[ i ][ii][1][jj]-M0[ i ][ii][2][jj];
?? ?? ?? M3[3]=M0[ i ][ii][0][jj]-M0[ i ][ii][3][jj];
?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? 第二次一維Hadamard變換
?? ?? ?? M0[ i ][ii][0][jj]=M3[0]+M3[1]; ?? ?? ?? ?? ?? ?? ??
?? ?? ?? M0[ i ][ii][2][jj]=M3[0]-M3[1]; ?? ?? ?? ?? ?? ?? ??
?? ?? ?? M0[ i ][ii][1][jj]=M3[2]+M3[3]; ?? ?? ?? ?? ?? ?? ??
?? ?? ?? M0[ i ][ii][3][jj]=M3[3]-M3[2]; ?? ?? ?? ?? ?? ?? ??
?? ?? ?? for (j=0;j<4;j) ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
?? ?? ?? ??? if ((i+j)!=0) ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???
?? ?? ?? ?? current_intra_sad_2 += abs(M0[ i ][ii][j][jj]); ?? ?? 變換后的AC殘差值取絕對值求和作為代價
?? ?? } ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
?? ??? }
?? }

?? for (j=0;j<4;j)
?? ??? for (i=0;i<4;i)
?? ?? M4[ i ][j]=M0[0][ i ][0][j]/4;

?? ??? // Hadamard of DC koeff
?? ??? for (j=0;j<4;j) ?? ?? 后面兩個for循環對當前宏塊的DC殘差進行Hadamard變換并將變換后的值取絕對值求和作為代價
?? ??? {
?? ?? M3[0]=M4[0][j]+M4[3][j];
?? ?? M3[1]=M4[1][j]+M4[2][j];
?? ?? M3[2]=M4[1][j]-M4[2][j];
?? ?? M3[3]=M4[0][j]-M4[3][j];

?? ?? M4[0][j]=M3[0]+M3[1];
?? ?? M4[2][j]=M3[0]-M3[1];
?? ?? M4[1][j]=M3[2]+M3[3];
?? ?? M4[3][j]=M3[3]-M3[2];
?? ??? }

?? ??? for (i=0;i<4;i)
?? ??? {
?? ?? M3[0]=M4[ i ][0]+M4[ i ][3];
?? ?? M3[1]=M4[ i ][1]+M4[ i ][2];
?? ?? M3[2]=M4[ i ][1]-M4[ i ][2];
?? ?? M3[3]=M4[ i ][0]-M4[ i ][3];

?? ?? M4[ i ][0]=M3[0]+M3[1];
?? ?? M4[ i ][2]=M3[0]-M3[1];
?? ?? M4[ i ][1]=M3[2]+M3[3];
?? ?? M4[ i ][3]=M3[3]-M3[2];

?? ?? for (j=0;j<4;j)
?? ?? ?? current_intra_sad_2 += abs(M4[ i ][j]);
?? ??? }
?? ??? if(current_intra_sad_2 < best_intra_sad2)
?? ??? {
?? ?? best_intra_sad2=current_intra_sad_2;
?? ?? *intra_mode = k; // update best intra mode

?? ??? }
}
?? }
?? best_intra_sad2 = best_intra_sad2/2;

?? return best_intra_sad2;
}



以上是源程序里的一段,intra_16*16并不是計算SAD值,而是計算SATD。
其中M1中放的是宏塊的殘差,M0也是,不過為了下面計算HADAMARD變換方便,他表示成M0[4][4][4][4]的形式,前2個[4][4]表示8X8塊坐標,后2個[4][4]表示一個8X8里的4X4塊坐標。
程序先對殘差進行HADAMARD變換,然后把所有的DC分量提出來,再對DC分量做HADAMARD變換,
最后得到的是SATD。
有兩點不明白,誰知道的解釋一下:
1 在提取DC分量時為什么要除以4?
2 最后的best_intra_sad2 為什么要除以2?

這主要是由于SATD變換不是歸一化矩陣,變換后的系數值幅值增加,因此要相應的/2和/4

hadamard 變換本身就有一個 /2 的操作,因此每次變換都要對所有系數進行 /2。而 find_sad_16x16 函數執行了兩次 hadamard 變換:首先對 256 個系數進行一次,其次對所有 DC 系數再做一次,因此對 DC 系數應該 /4,而對 AC 系數應該 /2。find_sad_16x16 函數中的:M4[ i ][j]=M0[0][ i ][0][j]/4;就是對 DC 系數 /4,而最后的:best_intra_sad2 = best_intra_sad2/2;可以認為是對 AC 系數的變相 /2。但這里相當于是對所有系數 /2,所以 DC 系數多了一次 /2。這個多的一次就不知道原因了。

264樂園群里探討過這個問題。對于hadamard變換的/2已經有了結論。但是對DC系數多除的那一次2,目前尚未找到根據。
4階hadamard變換的定義式本身就是包含了這個/2的。可以見http://en.wikipedia.org/wiki/Hadamard_transform 。這里再多解釋一點
假設hadamard變換沒有/2, 變換矩陣為:
1?? 1?? 1?? 1
1 -1?? 1 -1
1?? 1 -1 -1
1 -1 -1?? 1
這時對一個列向量v = (1, 1, 1, 1)'做變換,即用變換矩陣左乘列向量v,得到的變換后向量v' = (4, 0, 0, 0)'。

現在觀察v和v',在歐氏空間中,對一個向量的“大小”的衡量就是其長度,通過計算內積得到。那么
len(v)?? = sqrt( 1^2 + 1^2 + 1^2 + 1^2) = 2
len(v') = sqrt( 4^2 + 0^2 + 0^2 + 0^2) = 4
由此可見如果沒有那個/2,變換前后,該向量的長度發生了變化。這樣的變換是違背正交變換的定義的。

所以,作為正交變換的hadamard變換,必須要有這個/2的歸一化。

A:推而廣之,整數 DCT 變換在變換前后向量的長度也發生了變化,為什么沒有除以 2 呢?

DCT變換(非整數)也是歸一化的整數變換也是正交變換,所以也一定會滿足歸一化的。firstime是不是忘記把scaling matrix考慮進來了啊。

按照畢厚杰書上 113 頁,變換矩陣為公式 6.15(這個時候 scaling matrix 還沒分離出來吧?):
a?? a?? a?? a
b?? c -c -b
a -a -a?? a
c -b?? b -c
其中 a = 1/2,b = (2/5)^0.5。這個矩陣對列向量v = (1, 1, 1, 1)'做變換前后的向量長度并不相等啊。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/455849.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/455849.shtml
英文地址,請注明出處:http://en.pswp.cn/news/455849.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

CSS中的塊元素,內聯元素,內聯塊元素

塊元素,內聯元素,內聯塊元素 元素就是標簽&#xff0c;布局中常用的有三種標簽&#xff0c;塊元素、內聯元素、內聯塊元素&#xff0c;了解這三種元素的特性&#xff0c;才能熟練的進行頁面布局。 塊元素塊元素&#xff0c;也可以稱為行元素&#xff0c;布局中常用的標簽如&…

django 與 vue 的完美結合

最近接到一個任務&#xff0c;就是用django后端&#xff0c;前段用vue&#xff0c;做一個普通的簡單系統&#xff0c;我就是一搞后端的&#xff0c;聽到vue也是比較震驚&#xff0c;之前壓根沒接觸過vue。看了vue的一些文檔&#xff0c;還有一些項目&#xff0c;先說一下django…

東芝確定半導體重組計劃:保留閃存其他全賣

會計丑聞給日本東芝公司的業績帶來嚴重影響&#xff0c;為了提高盈利&#xff0c;東芝正在對旗下的半導體、個人電腦、白色家電等業務進行一次重大重組。據日經新聞1月23日報道&#xff0c;東芝已經正式制定了芯片業務重組的詳細計劃&#xff0c;除了占據優勢的閃存芯片之外&am…

python畫兩條曲線圖_python繪制多個曲線的折線圖

這篇文章利用的是matplotlib.pyplot.plot的工具來繪制折線圖&#xff0c;這里先給出一個段代碼和結果圖&#xff1a; # -*- coding: UTF-8 -*- import numpy as np import matplotlib as mpl import matplotlib.pyplot as plt #這里導入你自己的數據 #...... #...... #x_axix&a…

5.19匯總

int block_x 8*(b8 & 0x01)4*(b4 & 0x01);int block_y 8*(b8 >> 1)4*(b4 >> 1);請問下老大 這兩句定義是什么意思啊&#xff1f; 帶些值進去算一下就知道了 b8 0 1 2 3b4 0 1 2 3 A&#xff1a;0 ........Er…

oracle 截取字指定的字符串

過濾指定的字符串,一字符串有重復的數據內容,所以需要去掉重復的內容,subst()截取 起止下標;instr()獲取終止下標位置 例如:substr(p.address, 0, instr(p.address, -, 1, 1)-1) ); case when length(substr(p.address, 0, instr(p.address, -, 1, 1)-1) ) 13 then substr(sub…

[django]django模型中auto_now和auto_now_add

示例: update_time models.DateTimeField(更新時間, defaulttimezone.now) create_time models.DateTimeField(創建時間, auto_now_addTrue) auto_now無論是你添加還是修改對象&#xff0c;時間為你添加或者修改的時間。 auto_now_add為添加時的時間&#xff0c;更新對象時不…

2014-7-29-阿里電面-第一輪

等了好久&#xff0c;以為簡歷要掛了&#xff0c;今天最終打來了。面試過程中手抖嘴抖有木有&#xff01; 1、經經常使用的集合類。我回到ArrayList、LinkedList、HashMap&#xff0c;接著問ArrayList、LinkedList的差別&#xff0c;以及分別的適用范圍。看了Java集合類基本上是…

數據分級分類實施指南_運營商行業數據安全治理實踐

建立組織構建大數據安全保障組一、大數據安全保障工作組職責 1、負責制定大數據信息安全策略&#xff0c;明確信息安全目標。 2、組織相關平臺負責人定期召開信息安全會議。 3、負責客戶數據安全突發事件應急方案實施和大數據信息系統日常安全運行管理的組織協調及決策工作。 4…

CSS中的定位

定位 關于定位我們可以使用css的position屬性來設置元素的定位類型&#xff0c;postion的設置項如下&#xff1a; relative 生成相對定位元素&#xff0c;元素所占據的文檔流的位置不變&#xff0c;元素本身相對文檔流的位置進行偏移absolute 生成絕對定位元素&#xff0c;元…

servlet中中文正常顯示,mysql數據庫手動插入中文正常顯示,servlet向mysql中插入中文顯示亂碼...

作者&#xff1a;http://5563447.blog.51cto.com/5553447/1422627 問題是&#xff1a;就是POST請求提交表單數據給servlet,通過JDBC插入Mysql,出現中文亂碼。 解決方式&#xff1a;在url后面加這句 ?useUnicodetrue&characterEncodingutf-8 我的項目&#xff1a; 結果&am…

rtp問題引領匯總

視頻網絡傳輸一定要用rtp嗎&#xff1f; RTP/RTCP有一套很好的反饋機制&#xff0c;通過其可以估算網絡狀況&#xff0c;然后在編碼端進行調整&#xff0c;如網絡繁忙時適當的降低畫面質量&#xff0c;減小碼率等&#xff0c;主要是想通過RTP/RTCP協議實現QoS&#xff01;同時…

Django的信號機制詳解

Django的信號機制詳解 Django提供一種信號機制。其實就是觀察者模式&#xff0c;又叫發布-訂閱(Publish/Subscribe) 。當發生一些動作的時候&#xff0c;發出信號&#xff0c;然后監聽了這個信號的函數就會執行。 Django內置了一些信號&#xff0c;比如&#xff1a; django.…

垃圾回收算法_垃圾回收算法有哪些

垃圾檢測通常通過建立一個根對象的集合以及建立一個從這些根對象開始能夠觸及的對象集合來實現。如果正在執行的程序可以訪問到根對象和某個對象之間存在引用路徑&#xff0c;這個對象就是可觸及的。對于程序來說&#xff0c;根對象總是可以訪問的。從這些根對象開始&#xff0…

不錯的電子書下載網站

為什么80%的碼農都做不了架構師&#xff1f;>>> www.jb51.net 電子書質量不錯,雖然是掃描版的,但是都是高清的. vdisk.weibo.com 網盤, 內容很多! 轉載于:https://my.oschina.net/GMT/blog/1188971

GeoHash核心原理解析

原文地址&#xff1a;http://www.cnblogs.com/LBSer/p/3310455.html geohash for php&#xff1a;附件下載geohash.tar.gz 引子 機機是個好動又好學的孩子&#xff0c;平日里就喜歡拿著手機地圖點點按按來查詢一些好玩的東西。某一天機機到北海公園游玩&#xff0c;肚肚餓了&am…

[轉載]流行視頻格式講解

*. MPEG/.MPG/.DAT MPEG也是Motion Picture Experts Group 的縮寫。這類格式包括了 MPEG-1, MPEG-2 和 MPEG-4在內的多種視頻格式。MPEG-1相信是大家接觸得最多的了&#xff0c;因為目前其正在被廣泛地應用在 VCD 的制作和一些視頻片段下載的網絡應用上面&#xff0c;大部分的…

Ajax相關介紹

ajax是什么? AJAX 是與服務器交換數據并更新部分網頁的藝術&#xff0c;在不重新加載整個頁面的情況下。 AJAX 指異步 JavaScript 及 XML&#xff08;Asynchronous JavaScript And XML&#xff09;。 AJAX 是一種在 2005 年由 Google 推廣開來的編程模式。 AJAX 不是一種新的…

解決Ubuntu中文件管理器死掉的情況

有時會遇到Ubuntu文件管理器死掉的情況&#xff0c;怎么點擊都沒有反應&#xff0c;這時只需在終端上運行 ps -A | grep nautilus&#xff0c; 查找文件管理器nautilus對應的pid,然后sudokillpid就可以關閉文件管理器進程&#xff0c;隨便點擊一個文件夾就可以重啟文件管理器了…

element table 怎么知道點擊的是第幾行_el-data-table, 讓CRUD更簡單??

基于Vue2.x, element-ui 2.x&#xff0c;以及開源組件el-form-renderer封裝了一個業務組件el-data-table&#xff0c;已在github開源&#xff0c;其目標是&#xff1a;makes restful api crud easily 特點&#xff1a;1. 使用axios自動發送請求2.自帶新增/修改/刪除邏輯(默認新…