H264系列九 熱力學(xué)熵 信息熵 哈夫曼編碼 哥倫布編碼

一、阮一峰 熵:宇宙的終極規(guī)則

為了理解熵,必須講一點物理學(xué)。

19世紀(jì),物理學(xué)家開始認(rèn)識到,世界的動力是能量,并且提出"能量守恒定律",即能量的總和是不變的。但是,有一個現(xiàn)象讓他們很困惑。物理學(xué)家發(fā)現(xiàn),能量無法百分百地轉(zhuǎn)換。比如,蒸汽機使用的是熱能,將其轉(zhuǎn)換為推動機器的機械能。這個過程中,總是有一些熱能損耗掉,無法完全轉(zhuǎn)變?yōu)闄C械能。一開始,物理學(xué)家以為是技術(shù)水平不高導(dǎo)致的,但后來發(fā)現(xiàn),技術(shù)再進步,也無法將能量損耗降到零。他們就將那些在能量轉(zhuǎn)換過程中浪費掉的、無法再利用的能量稱為熵。后來,這個概念被總結(jié)成了"熱力學(xué)第二定律":能量轉(zhuǎn)換總是會產(chǎn)生熵,如果是封閉系統(tǒng),所有能量最終都會變成熵。

熵既然是能量,為什么無法利用?它又是怎么產(chǎn)生的?為什么所有能量最后都會變成熵?這些問題我想了很久。物理學(xué)家有很多種解釋,有一種我覺得最容易懂:能量轉(zhuǎn)換的時候,大部分能量會轉(zhuǎn)換成預(yù)先設(shè)定的狀態(tài),比如熱能變成機械能、電能變成光能。但是,就像細(xì)胞突變那樣,還有一部分能量會生成新的狀態(tài)。這部分能量就是熵,由于狀態(tài)不同,所以很難利用,除非外部注入新的能量,專門處理熵。總之,能量轉(zhuǎn)換會創(chuàng)造出新的狀態(tài),熵就是進入這些狀態(tài)的能量。

現(xiàn)在請大家思考:狀態(tài)多意味著什么?狀態(tài)多,就是可能性多,表示比較混亂;狀態(tài)少,就是可能性少,相對來說就比較有秩序。因此,上面結(jié)論的另一種表達(dá)是:能量轉(zhuǎn)換會讓系統(tǒng)的混亂度增加,熵就是系統(tǒng)的混亂度。轉(zhuǎn)換的能量越大,創(chuàng)造出來的新狀態(tài)就會越多,因此高能量系統(tǒng)不如低能量系統(tǒng)穩(wěn)定,因為前者的熵較大。而且,凡是運動的系統(tǒng)都會有能量轉(zhuǎn)換,熱力學(xué)第二定律就是在說,所有封閉系統(tǒng)最終都會趨向混亂度最大的狀態(tài),除非外部注入能量。

熵讓我理解了一件事,如果不施加外力影響,事物永遠(yuǎn)向著更混亂的狀態(tài)發(fā)展。比如,房間如果沒人打掃,只會越來越亂,不可能越來越干凈。

二、知乎大黑旗回答 信息熵與熱力學(xué)統(tǒng)計物理中的熵有什么區(qū)別和聯(lián)系?

不清楚題主的學(xué)科背景,以下回答面向從未系統(tǒng)學(xué)習(xí)熱力學(xué)和信息論的朋友,從三個層次討論“熵”的意義——這其實也是這個概念本身發(fā)展的歷程。文字有些長,性急的同學(xué)可以直接看最后的總結(jié)。

一. 熵和永動機——熱力學(xué)熵的宏觀形式

“熵”是一個十分古老的概念,可以上溯至蒸汽時代人們對熱機的研究。和熱量、溫度等其他熱力學(xué)概念相比,它的確因抽象而難以理解。為避免讀者被公式和其它概念嚇到,我們從大家喜聞樂見的“永動機”的故事開始。

我們都知道,第一類永動機(即不消耗能源卻可以不斷對外做功的機器)因為違反能量守恒定律所以是不存在的。但不甘心的工程師們很快又設(shè)想出了另一種神奇的機械,被稱為第二類永動機。由于它過于神奇,為了理解它,我們必需先研究一艘正常的船。

假設(shè)這艘船的動力系統(tǒng)是一座蒸汽機,當(dāng)它工作的時候,煤在鍋爐里燃燒,釋放它的化學(xué)能變?yōu)闊崮?,然后再?jīng)卡諾循環(huán)轉(zhuǎn)化為船的機械能。而船在航行的時候,又要不斷克服水的阻力做功,機械能轉(zhuǎn)化為水的內(nèi)能。所以在船勻速航行的情況下,煤燃燒釋放的能量最終轉(zhuǎn)化為了水的內(nèi)能(也許表現(xiàn)為使海水的溫度上升了一億億分之一攝氏度)。而我們?yōu)榱吮3执暮叫?,只能不斷地?zé)骸?/p>

而如果我有一艘新船,它有一個棒棒的動力系統(tǒng),能直接從海水里吸收能量,并完全轉(zhuǎn)化為船的機械能。這樣一來,我們就能見證一個奇跡:船從海水里獲得能量,航行時克服水的阻力做功,又把能量還給?!谶@個過程中船和海的總能量沒有變多也沒有變少,因此絲毫不違反能量守恒定律——然而它不需要燒一粒煤就能環(huán)游世界。

這當(dāng)然是不可能的。但是為了證明這個“不可能”,當(dāng)時的科學(xué)家付出了很多的努力。最終,魯?shù)婪颉た藙谛匏拱l(fā)現(xiàn),任何可以自發(fā)進行的過程中,恒溫?zé)酫和溫度T的比值永遠(yuǎn)是一個正值。

克勞修斯是德國人,便用德語Entropie命名這個比值,直到幾十年后南京大學(xué)的胡剛復(fù)教授才將這個概念引入國內(nèi),并命名為“熵”(意指Q和T的商數(shù))。由定義式我們不難知道,它的量綱是J/K。

熵就像一個固執(zhí)的沙漏,能量每進行一次轉(zhuǎn)化,它就向前走一點,而它每向前走一點,能量被利用的能力就減少一點。這個過程猶如時間流逝、人的衰老一樣不能逆轉(zhuǎn)。這也就是著名的熵增原理:任何孤立系統(tǒng)的總熵不會減少。如果說能量守恒定律限定了能量的數(shù)量,那么熵增原理就限定了能量的質(zhì)量:較優(yōu)質(zhì)的能量可以完全轉(zhuǎn)化為較劣質(zhì)的能量,但較劣質(zhì)的能量卻不可能完全轉(zhuǎn)化為較優(yōu)質(zhì)的能量。比如一根簡單的電阻絲就能把電能完全轉(zhuǎn)化為熱能,但最先進的發(fā)電機也不可能把這些熱能重新轉(zhuǎn)變?yōu)榈攘康碾娔?。這就是第二類永動機不能實現(xiàn)的原因——機械能是比內(nèi)能優(yōu)質(zhì)的能量,所以直接從海水里吸收熱量,并完全轉(zhuǎn)化為船的機械能的裝置壓根就不存在。

二.熵和有序性——熱力學(xué)熵的微觀形式

1877年,玻爾茲曼提出了著名的玻爾茲曼原理:S=klnΩ。也就是熵的微觀形式,其中的k是玻爾茲曼常數(shù),量綱為J/K,由于后面對數(shù)項不具量綱,所以玻爾茲曼熵的量綱也是J/K,這是證明它和宏觀形式等價的前提。

公式中的Ω是微觀狀態(tài)數(shù),即微觀上構(gòu)型的所有可能的排列數(shù)。Ω有時也被理解成“混亂度”,這是合理的。因為作為越有規(guī)律的系統(tǒng),構(gòu)型就越少,而混亂的系統(tǒng)可以有較多個構(gòu)型。例如,設(shè)想有一組10個硬幣,每一個硬幣有兩面,擲硬幣時得到最有規(guī)律的狀態(tài)是10個都是正面或10個都是反面,這兩種狀態(tài)都只有一種構(gòu)型(排列)。反之,如果是最混亂的情況,有5個正面5個反面,排列構(gòu)型可以有C_{10}^5=252種。(這個例子摘自維基百科)

這也形成了熵最廣為人知的理解:熵是系統(tǒng)混亂度(無序程度)的量度。其實,由于宏觀系統(tǒng)的Ω是一個天文數(shù)字,以至于我們往往無法計算,所以實際應(yīng)用中熵的微觀描述遠(yuǎn)不如宏觀描述常見。但由于我們處在一個看臉的世界,連物理定律也不能例外,這種金光閃閃的表達(dá)式和解釋比土里土氣的宏觀描述容易流傳太多了(同樣可以解釋為什么E=mc^2這種東西連幼兒園小朋友都知道)。

其實我覺得玻爾茲曼原理反過來想更令人震撼——對于一個系統(tǒng),如果某一時刻它的熵確定,那么它可能的微觀狀態(tài)數(shù)也是一定的。如果這個系統(tǒng)是整個宇宙的話,這就意味著我們這個世界的可能性也是有限的(盡管非常非常多)……OMG!我要去看女神自拍壓壓驚了。另外需要注意的是,熵的微觀形式是直接和狀態(tài)數(shù)Ω對應(yīng)的,因此是一個絕對值而非相對值。而由于Ω是自然數(shù),所以熵一定非負(fù);特別的,絕對零度下的晶態(tài)物質(zhì)Ω為1,所以S=kln1=0,這也就是熱力學(xué)第三定律。
以上兩種熵都叫做“熱力學(xué)熵”,因為它們的等價性已經(jīng)被證明。

三.熵和信息量——信息熵的意義

信息熵的來歷和熱力學(xué)熵完全不同。把它也叫做“熵”完全是因為香農(nóng)老爺子當(dāng)年提出這個概念時參考了熱力學(xué)熵,并且它的表達(dá)式和熱力學(xué)熵的微觀形式非常相似(但和宏觀描述看不出任何相似性)的緣故。后來也有人提出了信息熵的其他表述形式,為了方便,下文以最早也最重要的香農(nóng)熵為準(zhǔn)。信息熵的表達(dá)式:H=-ElnP(x) 其中E是期望,P(x)是出現(xiàn)的概率(含義下面會提到)。大家發(fā)現(xiàn)了吧,它和玻爾茲曼熵表達(dá)式S=klnΩ形式完全一樣,只有常數(shù)上的差別。實際應(yīng)用中,為了對應(yīng)二進制數(shù),更常見的是以2為底的形式:H=-Elog_2P(x),此時結(jié)果的量綱為比特。

它的意義非常明確,指觀察者對某一事件(結(jié)果)的未知程度。舉個例子:我要拋一次骰子,在觀測到結(jié)果之前,骰子六個面向上都有可能,而且概率完全一樣(都是1/6).這時,這一事件的信息熵為-log_2\cfrac{1}{6}=log_26。現(xiàn)在萬能的女神給了我一個提示,這次骰子的結(jié)果一定是偶數(shù),于是可能的結(jié)果由6種降低為3種,事件的熵也就變成了log_23。也就是說,當(dāng)我得到提示后,對于事件結(jié)果的不確定性降低了。我們把信息熵降低的量規(guī)定為信息量I。上面那條提示對我的信息量是I=log_26-log_23=log_22=1,正好是1比特,相當(dāng)于對一個完全未知的命題做一次是非判斷需要的信息量。而如果我要得到唯一確定的結(jié)果,P(x)就必須等于1,此時的信息熵為零。我們需要得到的信息量就是原本的熵log_26。

看到這里,聰明的你一定已經(jīng)可以自己總結(jié)出另一個金光閃閃的結(jié)論:信息就是負(fù)熵。需要特別注意的是,這句話里的“熵”指而且僅指信息熵,試圖將這個結(jié)論擴大到熱力學(xué)熵的解釋往往都缺乏足夠的事實基礎(chǔ),并且含義也經(jīng)常是含混的。

我們再來看另一個例子:甲乙丙三個實力相當(dāng)?shù)倪\動員要進行一次比賽,老王是比賽的裁判和記分員,他必須觀察并如實記錄三位選手的名次。所以對于他來說,比賽結(jié)果有A_3^3=6種。由于運動員實力相當(dāng),每種結(jié)果出現(xiàn)的可能性一樣,所以結(jié)果的熵是log_26

小花是運動員甲的女朋友,她如此愛自己的男友以至于只關(guān)心他有沒有取得冠軍而完全不在意其它選手的成績。對于小花來講,比賽的結(jié)果只有兩種,它的熵大約是0.92(計算略去,大家應(yīng)該不會對數(shù)學(xué)計算感興趣吧)。有的同學(xué)會奇怪,這里的熵為什么不是1?原因是由于甲乙丙三個運動員實力相當(dāng),所以甲獲得冠軍的幾率只有1/3。也就是說如果小花足夠聰明的話,在比賽前就可以知道甲獲得冠軍的可能比不獲得冠軍的可能小。這種預(yù)期降低了事件的未知程度(熵),也降低了結(jié)果對小花的信息量。

老李是比賽場地的管理員,他完全不關(guān)心誰勝誰負(fù),而只想等到比賽結(jié)束下班回家,那么比賽對他的熵是多少呢?答案是零,因為他只關(guān)心比賽有沒有結(jié)束,而比賽只要一開始就注定會結(jié)束,這個結(jié)果是唯一確定的。所以老李根本不用觀察比賽,只要坐著等就可以了。

這個例子說明對于不同的觀察者,由于目的和觀測能力的差異,同一個事件的熵也可能是不同的。

我們再回頭看老王的記分板,他用三組二進制數(shù)記錄比賽結(jié)果。第一組記錄甲的名次,第二組記錄乙的名次,第三組記錄丙的名次,由于名次有三個可能的值(第1第2第3),每組二進制數(shù)都必需是兩位的,所以老王對比賽結(jié)果的記錄由六位二進制數(shù)構(gòu)成。

老王的兒子小王是一個多才多藝的程序員,他看到了老王的記分板開始了吐槽:由于比賽只有三位選手,只要其中兩位選手的名次確定第三位選手的名次也就確定了。因此第三組二進制數(shù)完全是沒有必要的(我們也稱它為冗余),老王只需要四位二進制數(shù)就能表示全部的信息。

老王十分羞愧,忙請教小王能否更加簡潔。小王想了想,把所有六種可能的結(jié)果羅列了出來,并給每種情況賦予了一個代號,比如001表示甲乙丙的結(jié)果,010表示甲丙乙的結(jié)果……這樣老王每次就只需要三位二進制數(shù)(3比特)就可以記錄原本要6比特才能表示的信息了。這個故事告訴我們,同樣的信息用不同形式描述,會產(chǎn)生長度不同的記錄(我們稱之為消息),因此無損壓縮是可能的。這也是清晰度差不多的視頻文件有的格式卡成狗有的格式卻十分流暢的原因。

故事的最后,老王貪心不足,希望用更短的消息來記錄比賽結(jié)果,然而多次嘗試之后可恥的失敗了。這是因為比賽結(jié)果的熵是log2(6),大約是2.58,因此至少需要3位二進制數(shù)(3比特)才能描述,即消息不可能比它所包含的信息更短。也就是說無損壓縮有其極限,判斷這個極限是信息熵的另一個應(yīng)用。

四、總結(jié)

好了,我們現(xiàn)在總結(jié)一下,并試著回答題主的問題。

  • 1.熱力學(xué)熵有兩個表述,即宏觀形式和微觀形式,它們的意義和表達(dá)式都不同,然而卻被證明是等價的。
  • 2.熱力學(xué)熵的宏觀描述的直接意義是能量中不能用來做功的那一部分,可以用來描述能量的優(yōu)劣。
  • 3.熱力學(xué)熵的微觀描述直接反映了體系的混亂(無序)程度。
  • 4.信息熵(香農(nóng)熵)描述觀測者對未知事件的不確定性,也表示未知事件可能含有的信息量。

那么信息熵和熱力學(xué)熵有什么區(qū)別和聯(lián)系呢?

首先要說的是,信息熵和熱力學(xué)熵是完全不同的兩個概念。它們形成于不同的理論體系中,無論含義、量綱、研究對象、作用都不相同。據(jù)我所知,目前也沒有成熟的理論揭示二者有實質(zhì)上的聯(lián)系。

那么為什么許多人把這兩者聯(lián)系在一起呢?我想最重要的原因就是二者的數(shù)學(xué)表達(dá)式實在太像了,以至于它們在數(shù)學(xué)上的性質(zhì)也很類似,甚至可以把統(tǒng)計力學(xué)中研究熱力學(xué)熵的方法直接移植到信息論中研究信息熵,這導(dǎo)致了“信息熱力學(xué)”的建立。

其實除了信息熵之外,生態(tài)學(xué)家和社會學(xué)家也借鑒熱力學(xué)熵,在各自領(lǐng)域中提出了類似概念。

看到有同學(xué)在追問,補充幾點:

1.我們理解一個概念時不應(yīng)脫離產(chǎn)生這個概念的并使之發(fā)揮作用的理論體系。比如脫離熱力學(xué)的框架談熱力學(xué)熵,或者脫離信息論的框架談?wù)撔畔㈧卦谶壿嬌隙际谴嗳醯摹?/p>

2.如果要證明二者是一回事,不能只看形式是否相似,而是要通過嚴(yán)格的理論證明。而做到這一點的前提是必須有一套理論體系能夠把二者都包括進去。比如熱力學(xué)熵的兩種形式等價是嚴(yán)格的理論計算證明了的,于是熱力學(xué)和統(tǒng)計力學(xué)也就變成了一門統(tǒng)一的學(xué)科。而目前信息論和熱力學(xué)并沒有統(tǒng)一的跡象。

3.前排回答中的某些計算,在我看來很明顯是錯誤的。比如拋硬幣的那個例子:原答主計算“拋硬幣”系統(tǒng)的玻爾茲曼熵和香農(nóng)熵,并認(rèn)為二者是相等的。然而玻爾茲曼公式中的Ω意義很明確,就是微觀狀態(tài)數(shù)。它由系統(tǒng)的結(jié)構(gòu)、溫度、體積、質(zhì)量等因素決定,是一個客觀的物理量(它的取值不依賴于觀測者)。而“拋硬幣”是一個抽象的邏輯模型,顯然不具有這些性質(zhì),因此根本無法計算它的熱力學(xué)熵。說得更普遍些:你無法計算一個邏輯模型的熱力學(xué)熵,同樣也無法計算熱力學(xué)系統(tǒng)的信息熵(因為缺乏明確的觀測者和觀測標(biāo)準(zhǔn))。這也是為什么說上面第一點很重要的原因。其次,這個計算中該答主將玻爾茲曼常數(shù)遺漏了,以至于竟得出了以比特為量綱的“熱力學(xué)熵”。

4.有人說玻爾茲曼熵是信息熵的上限。這個說法在哲學(xué)上也許是正確的,但它目前似乎也只有哲學(xué)上的意義。

三、【H.264/AVC視頻編解碼技術(shù)詳解】七、 熵編碼算法(1):基礎(chǔ)知識
  1. 熵編碼概念

“熵”這一概念原本來自于化學(xué)和熱力學(xué),用于度量能量退化的指標(biāo),即熵越高,物體或系統(tǒng)的做功能力越低。后來香農(nóng)將這一概念引入到信息論中,用于表示消息的平均信息量。信源的熵通??梢员硎拘旁此l(fā)出信息的不確定性,即越是隨機的、前后不相關(guān)的信息,其熵越高。

在信息論中,香農(nóng)提出了信源編碼定理。該定理說明了香農(nóng)熵與信源符號概率之間的關(guān)系,說明信息的熵為信源無損編碼后的平均碼字長度的下限。任何的無損編碼方法都不可能使編碼后的平均碼長小于香農(nóng)熵,只能使其盡量接近。

基于此,對信源進行熵編碼的基本思想,是使其前后的碼字之間盡量更加隨機,盡量減小前后的相關(guān)性,更加接近其信源的香農(nóng)熵。這樣在表示同樣的信息量時所用的數(shù)據(jù)長度更短。

(插入?yún)⒖?a target="_blank" rel="nofollow">三分鐘學(xué)習(xí) | 熵編碼)
那什么是熵編碼?在信息熵的極限范圍內(nèi)進行編碼就是熵編碼。例如信息熵算出來是3bit/字符,你用4bit/字符來編碼,就是熵編碼,你用2bit/字符來編碼,就不叫熵編碼,因為這種情況下,就失真了嘛。從這里也看以看出,信源熵是編碼這個信源平均所需要的最小位數(shù)。所以,熵編碼是無損壓縮。

熵編碼有很多種:

  • 霍夫曼編碼 (Huffman)
  • 算術(shù)編碼
  • 行程編碼 (RLE)
  • 基于上下文的自適應(yīng)變長編碼(CAVLC)
  • 基于上下文的自適應(yīng)二進制算術(shù)編碼(CABAC)

在實際使用中,常用的熵編碼主要有變長編碼和算術(shù)編碼等方法。其中變長編碼相對于算術(shù)編碼較為簡單,但平均壓縮比可能略低。常見的變長編碼方法有哈夫曼編碼和香農(nóng)-費諾編碼等。例如JPEG用的是Huffman編碼和算術(shù)編碼,H264用的是CAVLC和CABAC。

  1. 熵編碼的簡單實現(xiàn)——哈夫曼編碼

戴維·哈夫曼(David·A·Huffman)于1952年在麻省理工學(xué)院的羅伯特·費諾的指導(dǎo)下攻讀博士學(xué)位時,發(fā)明了一種基于有序頻率二叉樹的編碼方法,該方法的編碼效率超過了他的導(dǎo)師和信息論之父香農(nóng)的研究成果(香農(nóng)-費諾編碼),因此又稱作“最優(yōu)編碼方法”。

哈夫曼編碼時變長編碼方法的一種,該方法完全依賴于碼字出現(xiàn)的概率來構(gòu)造整體平均長度最短的編碼方法。進行哈夫曼編碼的關(guān)鍵步驟是建立符合哈夫曼編碼規(guī)則的二叉樹,該樹又稱作哈夫曼樹。

哈夫曼樹是一種特殊的二叉樹,其終端節(jié)點的個數(shù)與待編碼的碼元的個數(shù)等同,而且每個終端節(jié)點上都帶有各自的權(quán)值。每個終端節(jié)點的路徑長度乘以該節(jié)點的權(quán)值的總和稱為整個二叉樹的加權(quán)路徑長度。在滿足條件的各種二叉樹中,該路徑長度最短的二叉樹即為哈夫曼樹。

在使用哈夫曼編碼執(zhí)行對碼元的實際編碼過程時,碼元的權(quán)值可設(shè)置為其概率值,那么可以根據(jù)其權(quán)值來構(gòu)建哈夫曼樹。我們假設(shè)使用哈夫曼編碼對以下概率的碼字進行編碼:

碼字 概率
A 0.1
B 0.1
C 0.15
D 0.2
E 0.2
F 0.25

根據(jù)概率表構(gòu)建哈夫曼樹的過程如下圖所示:


image.png

最終我們可以得到如下圖所示的哈夫曼樹:


image.png

在哈夫曼樹構(gòu)建完成后,便可以得到每一個碼元的哈夫曼編碼的碼字。具體方法是:從哈夫曼樹的根節(jié)點開始遍歷,直至每一個終端節(jié)點,當(dāng)訪問某個節(jié)點的左子樹時賦予碼字0,訪問右子樹時賦予一個碼字1(反之亦可),直到遍歷到終端節(jié)點時這一路徑所代表的0和1的串便是該碼元的哈夫曼編碼碼字。

例如上圖的哈夫曼樹,根節(jié)點訪問左子樹ABCF,賦予碼字0;然后再訪問左子樹ABC,賦予碼字0,此時整個碼字為00,然后訪問右子樹得到終端節(jié)點C,賦予碼字1,此時便可以得到C的哈夫曼編碼碼字001。以此規(guī)律,整個六個元素的碼元集合的編碼碼表為:

碼字 編碼
A 0000
B 0001
C 001
D 10
E 11
F 01

從這個碼表中還可以看出另外一個規(guī)律:哈夫曼編碼的任意一個碼字,都不可能是其他碼字的前綴。因此通過哈夫曼編碼的信息可以緊密排列連續(xù)傳輸,而不用擔(dān)心解碼時的歧義性。

缺點:

  • 數(shù)據(jù)的概率變化難于實時統(tǒng)計
  • Huffman樹需要編碼傳輸給解碼器(對信源進行哈夫曼編碼后,形成一個哈夫曼編碼表,解碼時,必須參照這一哈夫曼編碼表才能正確解碼)
  • 只有在p(x_i)=1/2^{ki}時是最優(yōu)編碼(由于哈夫曼編碼的依據(jù)是信源符號的概率分布,故其編碼效率取決于信源的統(tǒng)計特性。當(dāng)信源符號的概率相等時,其編碼效率最低;只有在概率分布很不均勻時,哈夫曼編碼才會收到顯著效果;當(dāng)符號出現(xiàn)概率分布為1/2^{ki} 型時,哈夫曼編碼能使平均碼長降奧信源熵值H(x),編碼效率為100%)
  • 最小碼字長度為1比特/符號
四、【H.264/AVC視頻編解碼技術(shù)詳解】八、 熵編碼算法(2):H.264中的熵編碼基本方法、指數(shù)哥倫布編碼

指數(shù)哥倫布編碼同哈夫曼編碼最顯著的一點不同在于,哈弗曼編碼構(gòu)建完成后必須在傳遞的信息中加入碼字和碼元值的對應(yīng)關(guān)系,也就是編碼的碼表,而指數(shù)哥倫布編碼則不需要。

1.先看例子,再說概念:
使用指數(shù)哥倫布編碼來表示數(shù)值codeNum = 10,那么其前綴0的長度為prefixLen = floor[log2(codeNum+1)] = 3,因此指數(shù)哥倫布碼的前綴為 0 0 0。其后綴部分的二進制表示為codeNum+1-2^prefixLen = 11-8 = 3 = b(0 1 1),因此10的指數(shù)哥倫布編碼碼字為0 0 0 1 0 1 1。

也就是說,哥倫布編碼以中間的1為對稱軸,前綴全寫0,需要先算出一共要寫幾個0。然后再算后綴的信息位,上面使用的公式暫時先不解釋。

看一下怎么還原:當(dāng)讀取到指數(shù)哥倫布編碼碼字為0 0 0 1 0 1 1時,先計算前綴個數(shù)是3,然后越過中間的1,得到后綴信息位是二進制的011,也就是十進制的3。那么解碼值就是2^3-1+3=10

使用以上技巧再看下20的編碼:

codeNum = 20
prefixLen = floor[log2(codeNum+1)] = floor[log2(21)]=4
surfix = codeNum+1-2^prefixLen=20+1-2^4=5=二進制的101
編碼值=0000,1,0101(為方便觀看,以逗號分隔了)

看一下解碼:
前綴4個0,后綴信息位0101,也就是5。所以2^4-1+5=20

2.概念
在H.264的標(biāo)準(zhǔn)協(xié)議中,不同的語法元素指定了不同的熵編碼方法。在協(xié)議文檔中共指定了10種語法元素的描述符,這些描述符表達(dá)了碼流解析為語法元素值的方法,其中包含了H.264標(biāo)準(zhǔn)所支持的所有熵編碼方法:

語法元素描述符 編碼方法
b(8) 8位二進制比特位串,用于描述rbsp_byte()
f(n) n位固定模式比特位串,從最左bit開始計算
u(n) 使用n位無符號整數(shù)表示,由n位bit換算得到
i(n) 使用n位有符號整數(shù)表示,由n位bit換算得到
ue(v) 使用無符號指數(shù)哥倫布編碼
se(v) 使用有符號指數(shù)哥倫布編碼
te(v) 使用截斷指數(shù)哥倫布編碼
me(v) 使用映射指數(shù)哥倫布編碼
ce(v) 上下文自適應(yīng)的變長編碼
ae(v) 上下文自適應(yīng)的二進制算術(shù)編碼

常用的指數(shù)哥倫布編碼通??梢苑譃樗念悾簎e(v)、se(v)、me(v)、te(v)。其中無符號指數(shù)哥倫布編碼ue(v)是其他編碼方式的基礎(chǔ),其余幾種方法基本可以由ue(v)推導(dǎo)得出。

3.指數(shù)哥倫布編碼同哈夫曼編碼的比較
指數(shù)哥倫布編碼同前文中提到的哈夫曼編碼都遵循了同一規(guī)律,即針對不同的碼元分配了bit位長度不同的碼字,因此各自都屬于變長編碼的一種。然而二者仍然具有較大的差別,具體如:

  • 哈夫曼編碼在編碼過程中考慮了信源各個符號的概率分布特性,根據(jù)符號的概率分布進行編碼,因此對于不同的信源,即使是相同的符號的哈夫曼編碼的結(jié)果也是不同的;指數(shù)哥倫布編碼針對不同的信源采用的編碼是統(tǒng)一的,因此無論是什么樣的輸入,輸出的編碼后的數(shù)據(jù)都是一致的。

  • 由于哈夫曼編碼是針對信源特性進行的編碼,因此在存儲或傳輸編碼后的數(shù)據(jù)之前必須在前面保存一份碼表供解碼段重建原始信息使用;而指數(shù)哥倫布編碼不需要存儲任何額外信息就可以進行解碼。

  • 由于未考慮信源的實際特性,指數(shù)哥倫布編碼的壓縮比率通常比較低,對于有些信息甚至完全沒有壓縮效果,輸出數(shù)據(jù)比原始數(shù)據(jù)更大,在這一點上哈夫曼編碼作為“最優(yōu)編碼”在效率上更高;然而由于哈夫曼編碼運算較指數(shù)哥倫布編碼更為復(fù)雜,且必須保存碼表信息增加了傳輸負(fù)荷,也對壓縮比率造成了不利影響。

實際上,對于視頻壓縮這樣的需求而言,類似于哈夫曼編碼所提供的壓縮比率的優(yōu)勢遠(yuǎn)遠(yuǎn)不夠,而且像H.264等編碼標(biāo)準(zhǔn)都不會指望靠這樣的方式來提高壓縮比率。

在H.264碼流結(jié)構(gòu)(如NAL Unit、Slice Header等)的解析中,大多使用定長編碼或者指數(shù)哥倫布編碼實現(xiàn)。而例如預(yù)測殘差等占據(jù)碼流大量體積的數(shù)據(jù)則必須使用壓縮率更高的算法,如CAVLC和CABAC等。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容