關(guān)于離散余弦變換(DCT)

1.轉(zhuǎn)自:離散余弦變換(DCT)的定義_小火車_新浪博客

已知離散傅里葉變換(DFT)為:

由于許多要處理的信號都是實信號,在使用DFT時由于傅里葉變換時由于實信號傅立葉變換的共軛對稱性導致DFT后在頻域中有一半的數(shù)據(jù)冗余。

離散余弦變換(DCT)是對實信號定義的一種變換,變換后在頻域中得到的也是一個實信號,相比DFT而言,DCT可以減少一半以上的計算。DCT還有一個很重要的性質(zhì)(能量集中特性):大多書自然信號(聲音、圖像)的能量都集中在離散余弦變換后的低頻部分,因而DCT在(聲音、圖像)數(shù)據(jù)壓縮中得到了廣泛的使用。由于DCT是從DFT推導出來的另一種變換,因此許多DFT的屬性在DCT中仍然是保留下來的。

推導N點長實序列的DCT,首先來定義一個新的長度為2N的序列:

可看作是將周期為N的序列x[m]做一個周期延拓成一個周期為2N的序列。如圖1中第一張圖。

再來看圖1中第一張圖是關(guān)于x = -1/2對稱的,要讓他關(guān)于x = 0對稱需要將其向右平移1/2個單位,得到x’[m] = x’[m – 1/2]就是關(guān)于x = 0對稱的周期序列了(如圖1中第二張圖)。

然后求這個2N序列的DFT:

就是DCT-2型離散余弦變換.從上面的過程也可以直接看出,離散余弦變換相當于一個長度大概是它兩倍的離散傅里葉變換.

變換后的x[n]是以2N為周期,偶對稱的序列: X[N+n] = X[N+n-2N] = X[n-N] = x[N-n]

定義變換矩陣C[n,m]:

用計算機計算DCT-2 (用的是O(n^2)樸素算法,用于驗證正交特性以及觀察其頻域數(shù)據(jù)):

DCT的結(jié)果:

對相同序列FFT的結(jié)果:

比較DFT和FFT的結(jié)果可以觀察出DCT變換只有實部,而DFT變換后有虛部。在這個例子中DCT在頻域中只用3個點就可以表示這個信號,而DFT變換后在頻域中需要5個點來表示信號。

參考:http://fourier.eng.hmc.edu/e161/lectures/dct/node1.html



2.轉(zhuǎn)自:二維DCT變換 - Wuyuan's Blog

寫這篇文章的目的主要是為了給x264打好基礎(chǔ),x264用的是整數(shù)DCT變換,所以就先來說說DCT變換吧。

DCT(Discrete Cosine Transform),又叫離散余弦變換,它的第二種類型,經(jīng)常用于信號和圖像數(shù)據(jù)的壓縮。經(jīng)過DCT變換后的數(shù)據(jù)能量非常集中,一般只有左上角的數(shù)值是非零的,也就是能量都集中在離散余弦變換后的直流和低頻部分,下面我會用matlab來演示整個過程。

1.一維DCT變換

我們首先來看看一維的DCT變換,這是二維的基礎(chǔ)。一維的DCT變換共有8種,其中最實用的是第二種形式,公式如下:

其中c(u)是加上去一個系數(shù),為了能使DCT變換矩陣成為正交矩陣,在后面二維變換將看到他的作用。N是f(x)的總數(shù)。相比其他幾種形式,他的運算還是比較簡單的,因此也用的比較廣。

2.二維DCT變換

二維DCT變換是在一維的基礎(chǔ)上再進行一次DCT變換,這個比較好理解,直接看公式:

這里我只討論兩個N相等的情況,也就是數(shù)據(jù)是方陣的形式,在實際應(yīng)用中對不是方陣的數(shù)據(jù)都是先補齊再進行變換的。為了matlab仿真方便點,寫成矩陣形式:

下面就用matlab來模擬一下,使用隨機生成的4x4矩陣作為輸入,程序如下:


Y是使用上面的公式進行變換,YY是用matlab自帶的dct2函數(shù)變換,結(jié)果是是:


可以看出Y和YY的結(jié)果是一樣的,這也進一步驗證了上面的公式是正確的。由于X是我隨機生成的,相關(guān)性很小,變換后的結(jié)果比較亂;如果是信號或圖像這樣相關(guān)性比較大的數(shù)據(jù)的話,數(shù)值會集中在左上角,右下角一般都是零,再使用“之”字型掃描得到數(shù)據(jù)流會包含很多連續(xù)的零,編碼后數(shù)據(jù)量會非常小,這就是DCT變換帶來的好處。

3.二維DCT反變換

DCT逆變換的公式如下:

矩陣形式可以由正變換的公式直接推出來,因為在A中加了c(i)這個系數(shù),使得A成為了正交矩陣,所以我們就可以這樣做:

在用matlab來驗證是否能反變換出原來的數(shù)據(jù):


X使用的是上面正變換用的數(shù)據(jù),運行后得到的X1為:

X1=

61.000019.000050.000020.0000

82.000026.000061.000045.0000

89.000090.000082.000043.0000

93.000059.000053.000097.0000

和X完全相等。在實際進行編碼的時候,比如JPEG壓縮的時候,只會對Y左上角的數(shù)據(jù)進行傳輸,所以解碼出來的內(nèi)容不會完全和原來的相同。

4.整數(shù)DCT變換

說道DCT就順便提一下x264中的整數(shù)DCT變換,整數(shù)DCT變換是以DCT變換為基礎(chǔ)的,為了減少計算量做的一些調(diào)整,下面我寫一下整數(shù)DCT變換公式的大致推導過程:

然后根據(jù)A是正交矩陣,把c=bd帶入A中,使行向量為單位向量可以得到d=0.4142。令d=0.5,得到b*b=0.4,代入上面的式子中,把0.5提取出來放到右邊的點乘中就得到了:

這樣在對大括號部分進行計算時就都是加法和減法了,而且在精度上沒有太大降低。在x264實際編碼中,變換和量化是一起進行的,使得編碼速度有了很大的提高。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 一、傅立葉變換的由來 關(guān)于傅立葉變換,無論是書本還是在網(wǎng)上可以很容易找到關(guān)于傅立葉變換的描述,但是大都是些故弄玄虛...
    constant007閱讀 4,491評論 1 10
  • 數(shù)學是計算機技術(shù)的基礎(chǔ),線性代數(shù)是機器學習和深度學習的基礎(chǔ),了解數(shù)據(jù)知識最好的方法我覺得是理解概念,數(shù)學不只是上學...
    闖王來了要納糧閱讀 22,848評論 2 48
  • 采用混合編碼方式的HEVC編碼技術(shù),先對視頻數(shù)據(jù)進行空間預(yù)測或時間預(yù)測,隨后對預(yù)測殘差進行整數(shù)變換,再對變換后的系...
    Persistently閱讀 4,290評論 0 1
  • Chapter_8 Image Compression 圖像壓縮為了減少以下三種冗余的影響:Coding redu...
    涉風閱讀 646評論 0 0
  • 1.在生命周期里面的第一個方法,例如onCreate里面設(shè)置屏幕的樣式 2.完成對配置的初始化: 3.完成緩存策略...
    浪漫晨風閱讀 6,337評論 0 2