Speaker : Chungyi Wang Adviser : Quincy Wu Date : 20070305
outline PCM G.711 的取樣基本原理 A-law Mu-law A-law V.S Mu-law Reference 2007/3/5
PCM PCM (Pulse code modulation) 波形編碼,把類比的音訊信號轉換為數位信號 G.711有兩個編碼方式,分別是 A-law Mu-law G.711的編碼方式會將14bits(所以會用16bits儲存)的樣本訊息轉換成8bits的樣本以期傳送資料壓縮 from:http://en.wikipedia.org/wiki/Pulse_code_modulation 2007/3/5
G.711 的取樣基本原理 低位數的差異 取較具影響的位數 由16bits轉成8bits 0000 0001 1111 1111 (511) 前N位較具影響,好比說N = 5 (強度1位,樣本4位) 由16bits轉成8bits 傳送時將重要的位數encode成8bits (保留重要位數) 接收端將此decode成PCM的16bits (有些許失真) 0000 0001 1111 1111 (511) 0000 0001 1111 0000 (496) 0001 1111 1111 1111 (8191) 0001 1111 0000 0000 (7936) 2007/3/5
A-law(1/4) 規則 取影響最大的5位 s 代表的是sign, 於樣本為正數時填1 逢偶數位取補數 s x’ x x’ w x’ y z’ 2007/3/5
A-law(2/4) 範例 -- 3210 (0000110010001010)2 => 10011100 取s,s = 1 範例 -- 3210 (0000110010001010)2 => 10011100 取s,s = 1 取強度位置 0 0001 10010001010 Xs = 100 取高位樣本 wxyz = 1001 結合以上數字 s xxx wxyz 1 100 1001 逢偶位數取補數 1 1001001 1 0011100 2007/3/5
A-law(3/4) 範例 -- 321(0000000101000001)2 => 11000001 取s,s = 1 取強度位置 範例 -- 321(0000000101000001)2 => 11000001 取s,s = 1 取強度位置 0 0000001 01000001 Xs = 001 取高位樣本 wxyz = 0100 結合以上數字 s xxx wxyz 1 001 0100 逢偶位數取補數 1 0010100 1 1000001 2007/3/5
A-law(4/4) 範例程式 使用mediastreamer2的g711common.h unsigned char s16_to_alaw(int pcm_val) 將16bit的原始樣本 encode 成為8bit的a-law碼 int alaw_to_s16(unsigned char a_val) 將8bit的a-law碼 decode 成為16bit的原始樣本 unsigned char s16_to_ulaw(int pcm_val) int ulaw_to_s16(unsigned char a_val) 2007/3/5
Mu-law(1/6) 規則 1.取得範圍值, 得到8-bit基本值b (ex 0x80) 2.取得間隔數值size (ex 256) 2007/3/5
Mu-law(2/6) 7903 4063 2015 991 479 223 95 31 規則 3.取得區間基本值rb (ex 2015) 8159 4319 4063 2143 2015 1055 991 511 479 239 223 103 95 35 31 3 1 規則 3.取得區間基本值rb (ex 2015) 4.算出與區間基本值rb的距離d d = rb - sample 5.依據間距大小size,算出平移量 s = d / size 6.與8-bit基本值相加 output = b + s 2007/3/5
Mu-law(3/6) 4063 範例 – 2345 => 0x9D 1.取得範圍值 1-1.得到8-bit基本值 2.取得間隔數值 range => 4063~2015 1-1.得到8-bit基本值 b = 0x90 2.取得間隔數值 size = 128 3.取得區間基本值 rb = 4063 4.算出與區間基本值rb的距離d d = rb – sample = 4063 – 2345 = 1718 4063 2143 2007/3/5
Mu-law(4/6) 5.依據間距大小size,算出平移量 6.與8-bit基本值相加 s = d / size = 1718 / 128 = 13.42… => 13 6.與8-bit基本值相加 output = b + s = 0x90 + 13 = 9D 2007/3/5
Mu-law(5/6) Decode 先前的 2345 => 0x9D, private static final int[] ULAW_TO_LINEAR_16_BIT = new int[ ] { -32124, -31100, -30076, -29052, -28028, 27004, -25980, -24956, -23932, -22908, 21884, -20860, -19836, -18812, -17788, 16764, -15996, -15484, -14972, -14460, 13948, -13436, -12924, -12412, -11900, 11388, -10876, -10364, -9852, -9340, … 1180, 1116, 1052, 988, 924, 876, 844, 812, 780, 748, 716, 684, 652, 620, 588, 556, 524, 492, 460, 428, 396, 372, 356, 340, 324, 308, 292, 276, 260, 244, 228, 212, 196, 180, 164, 148, 132, 120, 112, 104, 96, 88, 80, 72, 64, 56, 48, 40, 32, 24, 16, 8, 0}; Decode 建立對應的陣列 大小為255 先前的 2345 => 0x9D, 執行結果得到>> ulaw 9d becomes 2271 2007/3/5
Mu-law(6/6) 範例程式 秀出Mu-law全部的Decode結果 2007/3/5
A-law V.S Mu-law (1/2) Encode方法 Mu-law A-law 使用區域 North America & Japan Europe, rest of the world 2007/3/5
A-law V.S Mu-law (2/2) 如果將A-law的間距加大一倍到8192,那麼與Mu-law的量化執行結果會相近 (link 3) 在A-law於較小的數值有較大的動態範圍值(dynamic range) ,也就是靜音時會比較採樣雜訊,而不是僅取靜音 (link 3) 於33-127的數值兩者的執行效果相近,但是Mu-law如果在數值32之前的區間加入粒狀理論(granularity),Mu-law會較少使用all-zero來取代雜音的訊息量化 (link 4) 2007/3/5
Reference http://www.itu.int/rec/dologin_pub.asp?lang=e&id=T-REC-G.711-198811-I!!PDF-E&type=items ITU-T G.711 pdf http://en.wikipedia.org/wiki/G.711 Wikipedia : G.711 & A-law http://en.wikipedia.org/wiki/Mu-law Wikipedia : Mu-law http://72.14.235.104/search?q=cache:CIgTx4nuxeQJ:telecom.tbi.net/pcm1.html+mu-law+Comparison+with+A-law&hl=zh-TW&ct=clnk&cd=5&gl=tw A-law & Mu-law 較詳盡的介紹 2007/3/5