首頁 > 評測 > 音頻算法從這里開始——【嵌入式音頻】第四章·G711編解碼
音頻算法從這里開始——【嵌入式音頻】第四章·G711編解碼
- [導(dǎo)讀]
- “EveryBoard Can Sing” 21ic打算攜手資(tu)深(ding)直男癌晚期工程師zhanzr21,來給大家講一講嵌入式系統(tǒng)與音頻處理的故事。 關(guān)于zhanzr21: 曾經(jīng)混跡于兩岸三地,摸爬滾打在前端后端,搞過學(xué)術(shù)上過班,F(xiàn)在創(chuàng)業(yè)中,歡迎各種撩
這一章開始介紹一些算法相關(guān)的內(nèi)容.前面有幾章對播放強(qiáng)調(diào)較多,這期本來想寫錄音方面的內(nèi)容.但是普通的麥克風(fēng)電路主要是模擬電路,獨立做一章來寫覺得內(nèi)容有點少,所以會在其他章節(jié)穿插介紹.至于MEMS麥克風(fēng),因為涉及到PDM解碼,可以在后面做獨立一章來寫.
本章內(nèi)容:
l G711協(xié)議
l ALaw與uLaw編解碼
l ALaw與uLaw生成與驗證
l 在開發(fā)板上實現(xiàn)G711編解碼
本章實踐:
l 【驗證】1:ALaw算法分析驗證
l 【驗證】2:uLaw算法分析驗證
l 【實驗】1:Audacity操作轉(zhuǎn)音頻
l 【實驗】2:Python制作ALaw和uLaw數(shù)據(jù)
l 【實驗】3:SNR計算
l 【訓(xùn)練】:板子播放
工具:
l Python
l Excel
l Audacity
l 開發(fā)板
l 音箱
點擊鏈接加入群【嵌入式音頻信號處理】:https://jq.qq.com/?_wv=1027&k=45wk8Ks
嵌入式音頻專用資料代碼分享:https://pan.baidu.com/s/1dFh5pWd
本期活動地址:[喜迎兒童節(jié)]嵌入式音頻活動第四期
---
前言
本章這里說的算法,主要是指的編碼解碼的算法,就是所謂的CODEC(Encode/Decode).語音識別,語音合成,環(huán)境音效等技術(shù)屬于另外不同的算法,這些算法主要針對原始(raw)的音頻數(shù)據(jù)進(jìn)行.而在實際工程實踐中,編解碼算法是研究的最多的內(nèi)容.原因以前也說過,原始音頻內(nèi)容太多,對存儲傳輸?shù)膸捯筮^大,而音頻數(shù)據(jù)本身又有相當(dāng)大的冗余,故此這一方面的研究可以說在個人電腦誕生之前就開始了.早期的電信行業(yè)與計算機(jī)行業(yè)屬于不同的兩個行業(yè),電信行業(yè)資格要老些.電報,電話,廣播這些技術(shù)在一次世界大戰(zhàn)之前就應(yīng)用很廣泛了.當(dāng)然真正跟現(xiàn)代電信業(yè)有直接關(guān)系的技術(shù)則是二戰(zhàn)之后才迅速發(fā)展的.
簡介: ITU音頻標(biāo)準(zhǔn)G711
ITU(國際電信聯(lián)盟)是由國際電報聯(lián)盟發(fā)展而來的一個國際組織,1865年在法國巴黎創(chuàng)建. 1947年成為聯(lián)合國的一個下屬機(jī)構(gòu),總部設(shè)在日內(nèi)瓦.主要從事電信行業(yè)的各種技術(shù)的標(biāo)準(zhǔn)化,推進(jìn)等活動.大概跟ISO,IEC,EIA,IEEE這些機(jī)構(gòu)齊名.其中負(fù)責(zé)標(biāo)準(zhǔn)制定的機(jī)構(gòu)原稱做CCITT,1993改名為ITU-T.近幾年因為呼吁加強(qiáng)互聯(lián)網(wǎng)管制而跟各大壟斷公司,強(qiáng)權(quán)國家發(fā)生了一些爭吵.不過這跟本文沒有啥關(guān)系,只是說到ITU,帶一筆交代一下.
關(guān)于音頻算法,ITU出了很多標(biāo)準(zhǔn),主要著重于語音領(lǐng)域,因為ITU老本行就是研究電話語音傳輸?shù)?因為ITU發(fā)布的語音算法標(biāo)準(zhǔn)很多,一一介紹就有點過于繁瑣.所以挑一兩個出來介紹,其余的標(biāo)準(zhǔn)感興趣的讀者可以自行研究.這里先給出一個概覽,ITU對于標(biāo)準(zhǔn)化的音頻算法,是按照帶寬來分類的:
圖 ITU音頻算法分類
NB就是NarrowBand,即窄帶
WB就是WideBand,即寬帶
SWB就是SuperWideBand,即超寬帶
FB就是FullBand,即全帶寬
這些所謂的寬與窄都是約定俗成的,從采樣率,編解碼的算法等角度綜合衡量的.
圖 ITU窄帶音頻算法標(biāo)準(zhǔn)
圖 ITU寬帶音頻算法標(biāo)準(zhǔn)
圖 ITU超寬帶音頻算法
對于全帶寬,目前只有G.729. 某些標(biāo)準(zhǔn)算法有多個版本,分屬不同帶寬需求類型. 這一大波算法中,G711屬于歷史最悠久的.本文主要介紹G711,計劃后面文章還寫一個G726.其余算法暫時不打算專門分出章節(jié)來寫.
G711的內(nèi)容是將14bit或者13bit采樣的PCM音頻數(shù)據(jù)編碼成8bit的數(shù)據(jù)流,播放的時候?qū)⒋?bit的數(shù)據(jù)還原成14bit或者13bit進(jìn)行播放.不同于MPEG這種對整體或者一段音頻數(shù)據(jù)進(jìn)行考慮再進(jìn)行編解碼的做法,G711是波形編解碼算法,就是一個sample對應(yīng)一個編碼.所以壓縮比是固定的,為
8/14 = 57% (uLaw)或者
8/13 = 62% (aLaw).
因為主要用于語音音頻,采樣率一般使用8KHz,這樣帶寬為8bit乘以8KHz = 64Kbps.這個64Kbps也常常被稱作"一路數(shù)字電話"作為非正式的帶寬計算單位.
之所以取這些看起來比較低端的參數(shù),是因為早期硬件能力有限,且此技術(shù)當(dāng)初主要用于電話語音傳輸所致.G711是1972年制定的標(biāo)準(zhǔn),專利早就過期了,所以現(xiàn)在屬于Public Domain的內(nèi)容,任何人都能任意使用.
G711主要的兩種版本稱之為uLaw(u律,14bit版本)與ALaw(a律,13bit版本).
uLaw主要用于日本和北美地區(qū),除了日本和北美地區(qū)世界上基本上所有地方都用ALaw.從技術(shù)的角度來講, ALaw因為提供了更大的動態(tài)范圍,同時對硬件要求高一點.uLaw則對音量較低的信號提供更好的量化分辨率.一般來講,如果兩個國家的數(shù)字電話對接,如果有一方使用A-Law,另一方使用u-Law,那么就會采用A-Law.
有人會問,直接將14bit和13bit的PCM采樣進(jìn)行移位,丟掉低位得到8bit結(jié)果,豈不是更簡單.但是音頻數(shù)據(jù)的特點不適合這樣的線性編碼,直接移位的結(jié)果會丟棄音頻的主要變化的部分(低位部分)從而導(dǎo)致直接移位的結(jié)果是音頻質(zhì)量大大降低.不管是ALaw還是uLaw,其核心思想是,音頻的大多數(shù)變化發(fā)生在整個動態(tài)范圍的低部分.而且人耳對音頻幅度的感覺成對數(shù)關(guān)系.從這個角度來講,說G711是前PC時代的MP3算法也有點道理.
下面分別介紹兩種版本算法的詳細(xì)情況.
A-Law詳解
A-Law的編碼公式如下:
其中x為輸入,F(x)為編碼結(jié)果,A為壓縮參數(shù)一般取值為87.6 .
A-Law解碼公式,也就上述函數(shù)的反函數(shù)如下:
其中y為上述函數(shù)的結(jié)果編碼.
現(xiàn)在動手來做一個編碼與解碼的程序來觀察一下子整個過程.Python 3腳本.
【驗證】1:ALaw算法分析驗證
# ALaw Encode Decode Test
# Author: zhanzr21 @ 21ic BBS
#
# If you just want to do G711 A-Law encode/decode, use the audioop package,
# This script is just for analysis and study of the algorithm itself.
#
import math
#Byte format test
LineData =[i for i in range(-4096,4096)]
#normalization
NormaData = [i/4096 for i in LineData]
A = 87.6
A_1 = (1/A)
f_test = open('g711_alaw_test.csv',mode='w')
for x in NormaData:
#Encode
if(abs(x)
y = A*abs(x)/(1+math.log(A))
y = math.copysign(y, x)
elif((abs(x)<=1) and (abs(x)>=A_1)):
y = (1+math.log(A*abs(x)))/(1+math.log(A))
y = math.copysign(y, x)
else:
#Should not come here
print("ErrorEn %f", x)
yQ = (int(y*128))/128
res = 0
resQ = 0
#Decode
if(abs(y)<(1/(1+math.log(A)))):
res = abs(y)*(1+math.log(A))/A
res = math.copysign(res, y)
elif((abs(y)<=1) and ( abs(y)>=(1/(1+math.log(A))) ) ):
res = math.exp(abs(y)*(1+math.log(A))-1)/A
res = math.copysign(res, y)
else:
#Should not come here
print("ErrorDe %f", y)
#Decode(Quantization)
if(abs(yQ)<(1/(1+math.log(A)))):
resQ = abs(yQ)*(1+math.log(A))/A
resQ = math.copysign(resQ, yQ)
elif((abs(yQ)<=1) and ( abs(yQ)>=(1/(1+math.log(A))) ) ):
resQ = math.exp(abs(yQ)*(1+math.log(A))-1)/A
resQ = math.copysign(resQ, yQ)
else:
#Should not come here
print("ErrorDeQ %f", yQ)
#for debug
f_test.write('%f,%f,%f,%f,%f\n' % (x, y, yQ, res, resQ))
f_test.close()
將結(jié)果畫成圖表以便觀察(Excel):
圖 從-1至1的PCM數(shù)據(jù)的ALaw編解碼曲線
其中:
Series1為原始13bit的PCM采樣數(shù)據(jù)[-4096,4096),歸一化到[-1,1)的范圍
Series2為連續(xù)編碼
Series3為量化后的編碼,可以看出在信號幅度高時誤差較大
Series4為連續(xù)解碼結(jié)果幾乎沒有失真
Series5為量化編碼的解碼結(jié)果,幅度大的時后誤差較大
可以看出ALaw對0附近的數(shù)據(jù)的編碼分辨率較高,而對于幅度較大的信號則分辨率較低.當(dāng)然,實際使用的的時候,不管什么語言都有現(xiàn)成的庫函數(shù)可供調(diào)用,這是個非常常見的算法.對于Python而言,使用audioop庫函數(shù)(https://docs.python.org/3/library/audioop.html)即可.對于C/C++,ITU給出了參考代碼,本文后面會進(jìn)一步說明.
u-Law詳解
uLaw的編解碼公式分別如下:
其中u通常取值255.
還是動手來做一個編碼與解碼的程序來觀察一下子整個過程.Python 3腳本.
【驗證】2:uLaw算法分析驗證
# uLaw Encode Decode Test
# Author: zhanzr21 @ 21ic BBS
#
# If you just want to do G711 u-Law encode/decode, use the audioop package,
# This script is just for analysis and study of the algorithm itself.
#
import math
#Byte format test
LineData =[i for i in range(-4096,4096)]
#normalization
NormaData = [i/4096 for i in LineData]
U = 255
U_1 = (1/U)
f_test = open('g711_ulaw_test.csv',mode='w')
for x in NormaData:
#Encode
y = math.log(1 + U*abs(x))/math.log(1 + U)
y = math.copysign(y, x)
yQ = (int(y*128))/128
res = 0
resQ = 0
#Decode
res = U_1*((1+U)**abs(y) - 1)
res = math.copysign(res, y)
#Decode(Quantization)
resQ = U_1*((1+U)**abs(yQ) - 1)
resQ = math.copysign(resQ, yQ)
#for debug
f_test.write('%f,%f,%f,%f,%f\n' % (x, y, yQ, res, resQ))
f_test.close()
這個代碼比ALaw的代碼要簡單一些,但是因為有中間結(jié)果的冪函數(shù)運算,對硬件的要求要嚴(yán)格一些的.
圖 uLaw的編解碼數(shù)據(jù)曲線
此圖與ALaw的類似,只是因為原始采樣多了1bit,故此數(shù)據(jù)多了一倍.本貼的共享目錄中有所有腳本與實驗數(shù)據(jù),感興趣的同學(xué)可以下載到電腦上仔細(xì)品味一番.與ALaw相同,此處的代碼僅為研究內(nèi)部信號過程,實際使用中有現(xiàn)成的庫函數(shù)可用(從標(biāo)準(zhǔn)符合度,優(yōu)化度等方面考慮).
在電腦上制作/驗證G711數(shù)據(jù)
兩種方式,一種使用工具制作,一種使用程序來編碼.實際工作當(dāng)中當(dāng)然使用工具制作,用程序來編碼是為了驗證我們對算法的理解.工具還是老熟人:Audacity.
【實驗】1:Audacity操作轉(zhuǎn)音頻
打開一個2ch/16bit的音頻文件.
圖 原始16bit/2ch/11.025K的音頻文件
為了更清楚理解,我們把它處理成單通道8K,16bit的數(shù)據(jù),具體之前的章節(jié)講過,也不贅述.結(jié)果是這樣的.
點File/Export Audio在格式中選擇ALaw/uLaw分別導(dǎo)出兩個文件出來.
這樣,制作就完成了,我們可以先重新打開工具,導(dǎo)入這兩個文件看看波形試聽一下子以驗證上述操作無誤.
圖 導(dǎo)入的時候選格式
圖 從上到下分別是ALaw還原,uLaw還原,原始16bit的PCM波形,肉眼看不出差別來的.后面我們會用程序來計算SNR.
至于文件大小,原始文件是1100248 bytes, 兩個G711編碼的文件都是550124 bytes.壓縮比看起來是2:1,但是如同前文所言,ALaw僅僅使用了13bit的數(shù)據(jù),uLaw使用了14bit的數(shù)據(jù),都是取的數(shù)據(jù)的MSB開始的部分.所以壓縮比其實沒有這么大的.
現(xiàn)在開始用程序來對這個原始文件分別進(jìn)行ALaw/uLaw的編碼/解碼.為了更好的兼容性,直接使用python的標(biāo)準(zhǔn)庫函數(shù)audioop,ALaw/uLaw的代碼分別如下:
【實驗】2:Python制作ALaw和uLaw數(shù)據(jù)
ALaw測試代碼:
# ALaw Encode Test using the audioop package
# Author: zhanzr21 @ 21ic BBS
#
import math
import sys
import audioop
DEFAULT_INPUT = 'test_8k16bitmono.bin'
DEFAULT_OUTPUT = 'test_8k16bitmono.alaw'
DEFAULT_BACK = 'test_8k16bitmono.aback'
raw_name = ''
alaw_name = ''
back_name = ''
def alaw_encode(in_name, out_name):
fin = open(in_name, mode='rb')
fout = open(out_name, mode='wb')
raw_data = fin.read()
fin.close()
test_ba = audioop.lin2alaw(raw_data, 2)
fout.write(test_ba)
fout.close()
return
def alaw_decode(in_name, out_name):
fin = open(in_name, mode='rb')
fout = open(out_name, mode='wb')
raw_data = fin.read()
fin.close()
test_ba = audioop.alaw2lin(raw_data, 2)
fout.write(test_ba)
fout.close()
return
if __name__ == "__main__":
if(2 <= len(sys.argv)):
raw_name = sys.argv[1]
else:
raw_name = DEFAULT_INPUT
if(3 <= len(sys.argv)):
alaw_name = sys.argv[2]
else:
alaw_name = DEFAULT_OUTPUT
if(4 <= len(sys.argv)):
back_name = sys.argv[3]
else:
back_name = DEFAULT_BACK
alaw_encode(raw_name, alaw_name)
#for verification
alaw_decode(alaw_name, back_name)
#for compare with Audacity
alaw_decode('test_8k16bitmono_ref.alaw', 'test_8k16bitmono_ref.aback')
uLaw測試代碼:
# uLaw Encode Test using the audioop package
# Author: zhanzr21 @ 21ic BBS
#
import math
import sys
import audioop
DEFAULT_INPUT = 'test_8k16bitmono.bin'
DEFAULT_OUTPUT = 'test_8k16bitmono.ulaw'
DEFAULT_BACK = 'test_8k16bitmono.uback'
raw_name = ''
ulaw_name = ''
back_name = ''
def ulaw_encode(in_name, out_name):
fin = open(in_name, mode='rb')
fout = open(out_name, mode='wb')
raw_data = fin.read()
fin.close()
test_ba = audioop.lin2ulaw(raw_data, 2)
fout.write(test_ba)
fout.close()
return
def ulaw_decode(in_name, out_name):
fin = open(in_name, mode='rb')
fout = open(out_name, mode='wb')
raw_data = fin.read()
fin.close()
test_ba = audioop.ulaw2lin(raw_data, 2)
fout.write(test_ba)
fout.close()
return
if __name__ == "__main__":
if(2 <= len(sys.argv)):
raw_name = sys.argv[1]
else:
raw_name = DEFAULT_INPUT
if(3 <= len(sys.argv)):
ulaw_name = sys.argv[2]
else:
ulaw_name = DEFAULT_OUTPUT
if(4 <= len(sys.argv)):
back_name = sys.argv[3]
else:
back_name = DEFAULT_BACK
ulaw_encode(raw_name, ulaw_name)
#for verification
ulaw_decode(ulaw_name, back_name)
#for compare with Audacity
ulaw_decode('test_8k16bitmono_ref.ulaw', 'test_8k16bitmono_ref.uback')
【實驗】3:SNR計算
SNR計算代碼:
#SNR Test for 16bit PCM data
#Author: zhanzr21 @ 21ic BBS
import math
import sys
import audioop
EFAULT_INPUT_A = 'test_8k16bitmono.aback'
EFAULT_INPUT_U = 'test_8k16bitmono.Uback'
DEFAULT_REF = 'test_8k16bitmono.bin'
inA_name = ''
inU_name = ''
ref_name = ''
def SNR_S16(input16, ref16):
EnergySignal = 0.0
EnergyError = 0.0
SNR = 0.0
temp = 0
for i in range(len(input16)//2):
#input value
u16_sample = input16[i*2] + input16[1 + i*2] * 256
#unsigned to signed
if(u16_sample>32767):
test_sample = u16_sample - 65536
else:
test_sample = u16_sample
#normalization
test = test_sample / 32768
#Ref value
u16_sample = ref16[i*2] + ref16[1 + i*2] * 256
#unsigned to signed
if(u16_sample>32767):
test_sample = u16_sample - 65536
else:
test_sample = u16_sample
#normalization
ref = test_sample / 32768
EnergySignal = EnergySignal + ref * ref
EnergyError = EnergyError + (ref - test) * (ref - test)
try:
SNR = 10 * math.log10 (EnergySignal / EnergyError);
except ZeroDivisionError:
SNR = math.inf
return (SNR)
def SNR_S16_FILE(inF, refF):
fin = open(inF, mode='rb')
ba_in = fin.read()
fin.close()
fref = open(refF, mode='rb')
ba_ref = fref.read()
fref.close()
if(len(ba_in) != len(ba_ref)):
print("Size Not Equal %s,%s" % inF, refF)
return 0
else:
return SNR_S16(ba_in, ba_ref)
if __name__ == "__main__":
if(2 <= len(sys.argv)):
inA_name = sys.argv[1]
else:
inA_name = EFAULT_INPUT_A
if(3 <= len(sys.argv)):
inU_name = sys.argv[2]
else:
inU_name = EFAULT_INPUT_U
if(4 <= len(sys.argv)):
ref_name = sys.argv[3]
else:
ref_name = DEFAULT_REF
print('Ref SNR:%f' % SNR_S16_FILE(ref_name, ref_name))
print('alaw SNR:%f' % SNR_S16_FILE(inA_name, ref_name))
print('ulaw SNR:%f' % SNR_S16_FILE(inU_name, ref_name))
#for comparign with Audacity result
print('Audicatiy alaw SNR:%f' % SNR_S16_FILE('test_8k16bitmono_ref.aback', ref_name))
print('Audicatiy ulaw SNR:%f' % SNR_S16_FILE('test_8k16bitmono_ref.uback', ref_name))
分別運行以上三個腳本,就能得到ALaw編碼,uLaw編碼文件,以及同library解碼的文件,另外為了參考,把Audacity的編碼文件也使用audioop進(jìn)行了解碼.
SNR計算的結(jié)果:
Ref SNR:inf
alaw SNR:37.544108
ulaw SNR:37.150272
Audicatiy alaw SNR:37.523572
Audicatiy ulaw SNR:37.166987
可以看出audioop編碼的SNR要比Audacity的效果有小小差別,也有可能是兩者對原始數(shù)據(jù)的量化取舍方法不同導(dǎo)致.另外ALaw在我們這個例子中取得SNR稍稍好于uLaw的結(jié)果.這是因為這段音頻的本身特點決定的.
在板子上播放G711數(shù)據(jù)——【訓(xùn)練】:板子播放
(以GD32F105開發(fā)板為例)
C語言解碼G711,已經(jīng)有非常多的例子,優(yōu)化也很成熟了.這里參考已有的SpanDSP工程中的代碼給出解碼代碼片段.其余代碼因為跟之前的文章重復(fù)較多請參考共享文件夾中的工程.總體來說,把原理搞懂之后,G711是非常簡單的算法,一個sample對應(yīng)一個sample.可以說G711是常用的算法中,最簡單的音頻編解碼算法.
C語言解碼ALaw/uLaw代碼:
#define ULAW_BIAS 0x84 /* Bias for linear code. */
#define ALAW_AMI_MASK 0x55
static __inline int16_t alaw_to_linear(uint8_t alaw) {
int i;
int seg;
alaw ^= ALAW_AMI_MASK;
i = ((alaw & 0x0F) << 4);
seg = (((int) alaw & 0x70) >> 4);
if (seg)
i = (i + 0x108) << (seg - 1);
else
i += 8;
return (int16_t)((alaw & 0x80) ? i : -i);
}
/*! \brief Decode an u-law sample to a linear value.
\param ulaw The u-law sample to decode.
\return The linear value.
*/
static __inline int16_t ulaw_to_linear(uint8_t ulaw) {
int t;
/* Complement to obtain normal u-law value. */
ulaw = ~ulaw;
/*
* Extract and bias the quantization bits. Then
* shift up by the segment number and subtract out the bias.
*/
t = (((ulaw & 0x0F) << 3) + ULAW_BIAS) << (((int) ulaw & 0x70) >> 4);
return (int16_t)((ulaw & 0x80) ? (ULAW_BIAS - t) : (t - ULAW_BIAS));
}
相比較而言,ITU官方給出的代碼使用浮點計算的思路,代碼顯得臃腫一點.
ITU的ALaw解碼參考代碼:
void alaw_expand(lseg, logbuf, linbuf)
long lseg;
short *linbuf;
short *logbuf;
{
short ix, mant, iexp;
long n;
for (n = 0; n < lseg; n++)
{
ix = logbuf[n] ^ (0x0055); /* re-toggle toggled bits */
ix &= (0x007F); /* remove sign bit */
iexp = ix >> 4; /* extract exponent */
mant = ix & (0x000F); /* now get mantissa */
if (iexp > 0)
mant = mant + 16; /* add leading '1', if exponent > 0 */
mant = (mant << 4) + (0x0008); /* now mantissa left justified and */
/* 1/2 quantization step added */
if (iexp > 1) /* now left shift according exponent */
mant = mant << (iexp - 1);
linbuf[n] = logbuf[n] > 127 /* invert, if negative sample */
? mant
: -mant;
}
}
程序流程:
圖 軟件流程圖
F105播放ALaw/uLaw的圖片:
圖 F105播放G711音頻
關(guān)于GD32F105開發(fā)板:
此開發(fā)板是作者專門為嵌入式音頻處理學(xué)習(xí)所制作的,或許不久之后即可開開放領(lǐng)取,請大家期待!
G711的擴(kuò)展
截止本文寫作時,G711標(biāo)準(zhǔn)有兩個擴(kuò)展:G711.0與G711.1.G711.0也稱作G711 LLC,也就是無損壓縮擴(kuò)展.因為經(jīng)過了進(jìn)一步的壓縮,帶寬又可降低一半左右.G711.1則是對原G711的64Kbps的擴(kuò)展.可以選擇80,96Kbps的帶寬來提高傳輸?shù)馁|(zhì)量.因為目前帶寬資源的發(fā)展較快,可以預(yù)見G711.1的采用會有比較快的進(jìn)展.因為篇幅原因,本文不對這兩個擴(kuò)展作展開討論,感興趣的同學(xué)可以參考ITU官方文檔以了解更多細(xì)節(jié).
總結(jié)
G711是最簡單的音頻編解碼算法,但是應(yīng)用非常廣泛.從數(shù)字電話到網(wǎng)絡(luò)語音會議,都能見到他的影子.原因在于其標(biāo)準(zhǔn)化的歷史悠久,另外因為其算法簡單,能在幾乎所有處理器上輕易實現(xiàn).了解了G711,可以說對數(shù)字電話入了門,也算是懷了一把舊.美中不足的是,如果不算上還沒有廣泛應(yīng)用的G711.0的壓縮擴(kuò)展,G711的壓縮比還是比較寒酸的.壓縮比更加高的算法將在后面的章節(jié)陸續(xù)登場,敬請期待!
點擊鏈接加入群【嵌入式音頻信號處理】:https://jq.qq.com/?_wv=1027&k=45wk8Ks
嵌入式音頻專用資料代碼分享:https://pan.baidu.com/s/1dFh5pWd
本期活動地址:-pls wt
- 本文系21ic原創(chuàng),未經(jīng)許可禁止轉(zhuǎn)載!
網(wǎng)友評論
- 聯(lián)系人:巧克力娃娃
- 郵箱:board@21ic.com
- 我要投稿
-
歡迎入駐,開放投稿
-
人均百萬?英偉達(dá)中國員工收入曝光! 2024-08-29
-
《黑神話:悟空》玩家硬盤升級攻略:提升游戲體驗,暢享3A大作 2024-08-29
-
數(shù)睿數(shù)據(jù)參加《系統(tǒng)與軟件工程 低代碼開發(fā)平臺通用技術(shù)要求》國家標(biāo)準(zhǔn)編制 2024-08-29
- NRF52810藍(lán)牙數(shù)字耳機(jī)找人定制
預(yù)算:¥30005天前
- 125KW模塊式PCS軟硬件外包開發(fā)
預(yù)算:¥1100000015小時前
- 12V汽車啟動電源項目BMS設(shè)計
預(yù)算:¥50000023小時前
- 數(shù)據(jù)可視化軟件 開發(fā)
預(yù)算:¥5000023小時前
- PLC項目調(diào)試修改
預(yù)算:¥100001天前
- 起動電機(jī)控制器開發(fā)
預(yù)算:¥1100001天前