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年之後,就經常會宕機,而且需要拔電池如此暴力的方法重啟才行。但即使如此,我也還是一直這麼用著,畢竟還能用嘛 公升級新系統是要時間,也是有風險的。直到...