離散餘弦演算法
A. 關於離散餘弦變換(DCT)
1.轉自: 離散餘弦變換(DCT)的定義_小火車_新浪博客
已知離散傅里葉變換( DFT)為:
由於許多要處理的信號都是實信號,在使用DFT時由於傅里葉變換時由於實信號傅立葉變換的共軛對稱性導致DFT後在頻域中有一半的數據冗餘。
離散餘弦變換(DCT)是對實信號定義的一種變換,變換後在頻域中得到的也是一個實信號,相比DFT而言,DCT可以減少一半以上的計算。DCT還有一個很重要的性質(能量集中特性):大多書自然信號(聲音、圖像)的能量都集中在離散餘弦變換後的低頻部分,因而DCT在(聲音、圖像)數據壓縮中得到了廣泛的使用。由於DCT是從DFT推導出來的另一種變換,因此許多DFT的屬性在DCT中仍然是保留下來的。
推導N點長實序列的DCT,首先來定義一個新的長度為2N的序列:
可看作是將周期為N的序列x[m]做一個周期延拓成一個周期為2N的序列。如圖1中第一張圖。
再來看圖1中第一張圖是關於x = -1/2對稱的,要讓他關於x = 0對稱需要將其向右平移1/2個單位,得到x』[m] = x』[m – 1/2]就是關於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)樸素演算法,用於驗證正交特性以及觀察其頻域數據):
DCT的結果:
對相同序列FFT的結果:
比較DFT和FFT的結果可以觀察出DCT變換只有實部,而DFT變換後有虛部。在這個例子中DCT在頻域中只用3個點就可以表示這個信號,而DFT變換後在頻域中需要5個點來表示信號。
參考: http://fourier.eng.hmc.e/e161/lectures/dct/node1.html
2.轉自: 二維DCT變換 - Wuyuan's Blog
寫這篇文章的目的主要是為了給x264打好基礎,x264用的是整數DCT變換,所以就先來說說DCT變換吧。
DCT(Discrete Cosine Transform),又叫離散餘弦變換,它的第二種類型,經常用於信號和圖像數據的壓縮。經過DCT變換後的數據能量非常集中,一般只有左上角的數值是非零的,也就是能量都集中在離散餘弦變換後的直流和低頻部分,下面我會用matlab來演示整個過程。
1.一維DCT變換
我們首先來看看一維的DCT變換,這是二維的基礎。一維的DCT變換共有8種,其中最實用的是第二種形式,公式如下:
其中c(u)是加上去一個系數,為了能使DCT變換矩陣成為正交矩陣,在後面二維變換將看到他的作用。N是f(x)的總數。相比其他幾種形式,他的運算還是比較簡單的,因此也用的比較廣。
2.二維DCT變換
二維DCT變換是在一維的基礎上再進行一次DCT變換,這個比較好理解,直接看公式:
這里我只討論兩個N相等的情況,也就是數據是方陣的形式,在實際應用中對不是方陣的數據都是先補齊再進岩洞碧行變換的。為了matlab模擬方便點,寫成矩陣形式:
下面就用matlab來模擬一下,使用隨機生成的4x4矩陣作為輸入,程序如下:
Y是使用上面的公式進行變換,YY是用matlab自帶的dct2函數變換,結果是是:
可以看出Y和YY的結果是一樣的,這也進一步驗證了上面的公式是正確的。由於X是我隨機生成的,相關性很小,變換後的結果比較亂;如果是信號或圖像這樣相關性比較大的數據的話,數值會集中在左上角,右下角一般都是零,再使用「之」字型掃描得到數據流會包含很多連續的零,編碼後數據量會非常小,這就是DCT變換帶來的好處。
3.二維DCT反變換
DCT逆變換的公式如下:
矩陣形式可以由正變換的公式直接推出來,因為在A中加了c(i)這個系數,使得A成為了正交矩陣,所以我們就可以這樣做:
在用matlab來驗證是否能反變換出原來的數據:
X使用的是上面正變換用的數據,運行後得到的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左上角的數據進行傳輸,所以解碼出來的內容不會完全和原來的相同。
4.整數DCT變換
說道DCT就順便提一下x264中的整數DCT變換,整數DCT變換是以DCT變換為基礎的,為了減少計算量做的一些調整,下面我寫一下整數DCT變換公式的大致推導過程:
然後根據A是正交矩陣,把c=bd帶入A中,使行向量為單位向量可以得到d=0.4142。令d=0.5,得到b*b=0.4,代入上面的式子中,把0.5提取出來放到右邊的點乘中就得到了:
這樣在對大括弧部分進行計算時就都是加法和減法了,而且在精度上沒有太大降低。在x264實際編碼中,變換和量化是一起進行的,使得編碼速度有了很大的提高。
B. 離散餘弦變換演算法
公式神凳
http://image..com/i?ct=503316480&z=0&tn=imagedetail&word=dct+%B9%AB%CA%BD&in=28008&cl=2&cm=1&sc=0&lm=-1&pn=18&rn=1&di=9783368550&ln=536&fr=&ic=0&s=0&se=1
有游搜旅漏宏256個
C. 離散餘弦變換和分形編碼圖像壓縮演算法的性能比較
目前,分形編碼還未完全實用化 ,其主要困難在於傳統空域的分形壓縮有很多瓶頸 ,例如,運算復雜度太大、收斂過程較難預測和控制、高壓縮倍率時的塊狀效應等 。盡管自動圖像壓縮演算法的改進工作 已持續 了十幾年 ,但編碼時間、壓縮 比以及壓縮效果仍不夠理想 ,遠沒有達到分形本身應該達到的效果,因而 ,在當前 圖像壓縮編碼 中還不 佔主 導地位。為了能真正發揮分形高壓縮 比的潛力,必須尋求 IFS碼演算法 的突破,找到編碼實現的快速演算法 ,或者對分形塊壓縮方法作出重大改進,否則分形圖像壓縮技術很難與成熟的JPEG和 MPEG競爭。
離散餘弦變換,尤其是它的第二種類型,經常被信號處理和圖像處理使用,用於對信號和圖像(包括靜止圖像和運動圖像)進行有損數據壓縮。這是由於離散餘弦變換具有很強的"能量集中"特性:大多數的自然信號(包括聲音和圖像)的能量都集中在離散餘弦變換後的低頻部分,而且當信號具有接近馬爾科夫過程(Markov processes)的統計特性時,離散餘弦變換的去相關性接近於K-L變換(Karhunen-Loève 變換--它具有最優的去相關性)的性能。
例如,在靜止圖像編碼標准JPEG中,在運動圖像編碼標准MJPEG和MPEG的各個標准中都使用了離散餘弦變換。在這些標准制中都使用了二維的第二種類型離散餘弦變換,並將結果進行量化之後進行熵編碼。這時對應第二種類型離散餘弦變換中的n通常是8,並用該公式對每個8x8塊的每行進行變換,然後每列進行變換。得到的是一個8x8的變換系數矩陣。其中(0,0)位置的元素就是直流分量,矩陣中的其他元素根據其位置表示不同頻率的交流分類。