A律十三折線法G711編譯碼介紹

2021-10-23 14:49:40 字數 3831 閱讀 7224

g711國際電信聯盟itu-t定製出來的一套語音壓縮標準,主要用於對pcm音訊資料編碼,將pcm16bit資料壓縮為為8bit,它是主流的波形音訊編碼器,相當於只在幀內壓縮,不會從幀間之間來考慮壓縮,輸出位元速率通常大於32kbps,所以推薦輸入訊號位元速率為64kbps,8khz和s16的取樣格式,壓縮比為1:2;

g711有兩套編碼標準a-law用於13bit壓縮為8bit,u-law則是用於15bit壓縮為8bit;前者主要用於北美和中國地區,後者則用於歐美和日本地區;

簡單來說,g711可以將16bit資料壓縮為8bit資料。編碼有兩種a-law和u-law,a-law編碼針對計算機做了設計處理,將13bit壓縮為8bit,而u-law則是15bit資料壓縮;國內通用前者,所以我們以a-law為例講解,它的函式公式:

a=87.6時,函式影象接近原點,函式影象如下:

該函式圖中,x表示輸入訊號,y表示輸出訊號,且均歸一化到(-1, +1)區間;將x軸(0,1)非均勻量化為為8段1/2、1/4、… 1/64、1/128最終到原點0,共8段;同理每段對應到y軸上也有8段,並且x負軸也分為這相同的8段,在原點(0,0)處,-1/64到+1/64是實質是相同的斜率,可歸納乙個段,加上剩餘的12段,也就是十三段,經過十三折線後的函式影象不再像上圖的曲線,而是一段段的直線連線,折線圖逼近a-law曲線圖,故稱十三折線法;並且十三段折線對應不同的斜率,在值較小時,曲線斜率近似於折線,精度較高,而值較大時,則曲線斜率與折線相差較大,精度較低

在以上基礎上,我們將每乙個(如1-1/2、1/2-1/4)大段稱為「段落」,在每個段落內部實現均分16分,這樣在x軸上(-1,+1)就有16個段落 * 16個均分 = 256個量級;對應到y軸上也是256個量級,這樣我們就將輸入訊號編碼離散化到256個量級範圍,剛好是8bit,也就是編碼後的值範圍在256量級,也就是8bit;而輸入端x,我們段落之間非均勻化劃分,段內16分均勻劃分,這種均勻-非均勻量化範圍可以0~2048(12bit)的範圍,加上還有負數的情況(1bit極性),所以我們輸入訊號可以對13bit的資料進行編碼,按照這種原理進行量化的**如下:

量化範圍

歸一化段落碼(3bit)

權重值0~16

0~1/128

0 0 0

8 4 2 1

16~32

1/128~1/64

0 0 1

8 4 2 1

32-64

1/64~1/32

0 1 0

16 8 4 2

64~128

1/32~1/16

0 1 1

32 16 8 4

128~256

1/16~1/8

1 0 0

64 32 16 8

256~512

1/8~1/4

1 0 1

128 64 32 16

512~1024

1/4~1/2

1 1 0

256 128 64 32

1024~2048

1/2~1

1 1 1

512 256 128 64

總段落實質是16個段落,8個正8個負,負數情況下轉為正進行查表,同時記錄正負極性

而段內碼是均勻劃分,**如何:

量化範圍

段內碼(4bit)

00x0

10x1

20x2……

150xf

擁有上面兩張表後,我們就可以實現對輸入訊號進行編碼壓縮了,上面段落碼+段內碼一共才7bit,還差一位bit,這個就是訊號的極性,正負了;

例如,輸入訊號2000,請問輸出編碼是多少?

以上是十三折線法原理,但是轉化到計算機上來還是有區別的,例如我們一般儲存資料型別都是8的倍數型別儲存,如short型別就是16bit,但是十三折線是針對13bit的資料壓縮,這個時候就需要自行處理,移除低位3bit或者高位3bit,根據自己的需求處理;並且計算機處理做了特殊的改動,以下表為準:

所以,按照上述**,進行編碼的步驟:

獲取符號位

確定序號位的第乙個高位1的位置,並確定序號編碼

獲取強度為abcd,也就是序號位後緊跟的4bit

最後還需要進行異或處理

#define         sign_bit        (0x80)      

/* sign bit for a a-law byte. */

#define quant_mask (0xf)

/* quantization field mask. */

#define nsegs (8)

/* number of a-law segments. */

#define seg_shift (4)

/* left shift for segment number. */

#define seg_mask (0x70)

/* segment field mask. */

#define bias (0x84)

/* bias for linear code. */

#define clip 8159

#define g711_a_law (0)

#define g711_mu_law (1)

#define data_len (16)

確定序號位的順序index

static

short seg_aend[8]

=;編碼函式

unsigned

char

linear2alaw

(int pcm_val)

else

查詢序號位index

seg =

search

(pcm_val, seg_aend,8)

;

編碼超過最大值,去範圍內最大值0x7f

if(seg >=8)

/* out of range, return maximum value. */

return

(unsigned

char)(

0x7f

^ mask)

;else

}解碼過程

intalaw2linear

(unsigned

char a_val)

根據符號位確定返回正負值

return

((a_val & sign_bit)

? t :

-t);

}

以上就是a-law的演算法原理以及實現過程,u-law是15折線法,和a-law原理差不多,感興趣的可以自行去研究,這裡就不再闡述了!

關於二進位制的基礎知識

pcm的a律13折線編碼介紹

通訊原理之13折線

遞迴遞推練習 G7

老 師會按考號分配固定的座位,但唯一不變的是每兩個人之間肯定至少會留下兩個空座位,原因相信大家都懂得。那麼問題來了,我們現在只關注教室裡的一排座位,假設每排有 n個座位,小銀想知道這一排至少坐乙個人的前提下,一共有多少種坐法。此題分析一下,假如有n個座位,分析第n個座位,有兩種情況,一是坐人,那麼n...

TiDB 在 G7 的實踐和未來

2010 年,g7 正式為物流運輸行業提供面向車隊管理的 saas 服務,經過持續創新,通過軟硬一體化的產品技術能力,致力於數位化每一輛貨車,以實時感知技術創造智慧型物流新生態。g7 為客戶提供全方位的資料服務 智慧型的安全和運營管理 手機管車 數字運力 以及 etc 油和金融等增值服務。目前,g7...

老G7公升級安卓4 0

我不是乙個會主動追著時髦東西跑的人,我的老g7上自帶的安卓2.2,一直用到現在,但是不知是裝的軟體有啥衝突,還是用的時間長了系統出了什麼問題 大概用了1年之後,就經常會宕機,而且需要拔電池如此暴力的方法重啟才行。但即使如此,我也還是一直這麼用著,畢竟還能用嘛 公升級新系統是要時間,也是有風險的。直到...