本文介紹了符合ISO/IEC 11172-3(MPEG 1 Audio codec Layer I, Layer II and Layer III audio specifications) 或 ISO/IEC 13818-3(BC Audio Codec)的音頻編碼原理。通過(guò)madlib解碼庫(kù)進(jìn)行實(shí)現(xiàn)。1、程序系統(tǒng)結(jié)構(gòu)![]() mp3解碼流程圖 其中同步及差錯(cuò)檢查包括了頭解碼模塊 2、主控模塊主控模塊的主要任務(wù)是操作輸入輸出緩沖區(qū),調(diào)用其它各模塊協(xié)同工作。 3、同步及差錯(cuò)檢測(cè)同步及差錯(cuò)檢測(cè)模塊主要用于找出數(shù)據(jù)幀在比特流中的位置,并對(duì)以此位置開(kāi)始的幀頭、CRC校驗(yàn)碼及幀邊信息進(jìn)行解碼,這些解碼的結(jié)果用于后繼的尺度因子解碼模塊和哈夫曼解碼模塊。Mpeg1 layer 3的流的主數(shù)據(jù)格式見(jiàn)下圖: ![]() 主數(shù)據(jù)的組織結(jié)構(gòu)圖
3.1 幀同步幀同步目的在于找出幀頭在比特流中的位置,ISO 1172-3規(guī)定,MPEG1 的幀頭為12比特的“1111 1111 1111”,且相鄰的兩個(gè)幀頭隔有等間距的字節(jié)數(shù),這個(gè)字節(jié)數(shù)可由下式算出: 3.2 頭信息解碼頭信息解碼目的是找出這一幀的特征信息,如采樣率,是否受保護(hù),是否有填充位等。頭信息見(jiàn)下圖: ![]() 幀頭信息結(jié)構(gòu)圖 其長(zhǎng)度為4 字節(jié),數(shù)據(jù)結(jié)構(gòu)如下: 3.3 幀邊信息解碼幀邊信息解碼的主要目的在于找出解這幀的各個(gè)參數(shù),包括主數(shù)據(jù)開(kāi)始位置,尺度因子長(zhǎng)度等。幀邊信息如下圖所示: ![]() 幀邊信息(side_infomation)表 3.4 main_data_beginmain_data_begin(主數(shù)據(jù)開(kāi)始)是一個(gè)偏移值,指出主數(shù)據(jù)是在同步字之前多少個(gè)字節(jié)開(kāi)始。需要注意的是,1.幀頭不一定是一幀的開(kāi)始,幀頭CRC校驗(yàn)字和幀邊信息在幀數(shù)據(jù)中是滑動(dòng)的。2.這個(gè)數(shù)值忽略幀頭和幀邊信息的存在,如果main_data_begin = 0, 則主數(shù)據(jù)從幀邊信息的下一個(gè)字節(jié)開(kāi)始。 參見(jiàn)下圖: ![]() 同步示意圖 3.5 block_typeblock_type指出如下三種塊類型: 3.6 big_values, count1每一個(gè)粒度組的頻譜都是用不同的哈夫曼表來(lái)進(jìn)行編碼的。編碼時(shí),把整個(gè)從0 到奈奎斯特頻率的頻率范圍(共576個(gè)頻率線)分成幾個(gè)區(qū)域,然后再用不同的表編碼。劃分過(guò)程是根據(jù)最大的量化值來(lái)完成的,它假設(shè)較高頻率的值有較低的幅度或者根本不需要編碼。從高頻開(kāi)始,一對(duì)一對(duì)的計(jì)算量化值等于“0”的數(shù)目,此數(shù)目記為“rzero”。然后4個(gè)一組地計(jì)算絕對(duì)值不超過(guò)“1”的量化值(也就是說(shuō),其中只可能有-1,0 和+1共3 個(gè)可能的量化級(jí)別)的數(shù)目,記為“count1”,在此區(qū)域只應(yīng)用了4 個(gè)哈夫曼編碼表。最后,剩下的偶數(shù)個(gè)值的對(duì)數(shù)記為“big values”, 在此區(qū)域只應(yīng)用了32 個(gè)哈夫曼編碼表。在此范圍里的最大絕對(duì)值限制為8191。此后,為增強(qiáng)哈夫曼編碼性能,進(jìn)一步劃分了頻譜。也就是說(shuō),對(duì)big values的區(qū)域(姑且稱為大值區(qū))再細(xì)化,目的是為了得到更好的錯(cuò)誤頑健性和更好的編碼效率。在不同的區(qū)域內(nèi)應(yīng)用了不同的哈夫曼編碼表。具體使用哪一個(gè)表由table_select給出。從幀邊信息表中可以看到:當(dāng)window_switch_flag == 0時(shí),只將大值區(qū)在細(xì)分為2個(gè)區(qū),此時(shí)region1_count無(wú)意義,此時(shí)的region0_count的值是標(biāo)準(zhǔn)默認(rèn)的;但當(dāng)window_switch_flag == 1時(shí)再將大值區(qū)細(xì)分為3 個(gè)區(qū)。但是由于region0_count 和region1_count是根據(jù)從576個(gè)頻率線劃分的, 因此有可能超出了big_values *2的范圍,此時(shí)以big_values *2 為準(zhǔn). region0_count 和region1_count表示的只是一個(gè)索引值,具體頻帶要根據(jù)標(biāo)準(zhǔn)中的縮放因子頻帶表來(lái)查得. ![]() 縮放因子、大值區(qū)、1值區(qū)和零值區(qū)分布圖 3.7 處理流程![]() 4、縮放因子(scale factor)解碼縮放因子用于對(duì)哈夫曼解碼數(shù)據(jù)進(jìn)行逆量化的樣點(diǎn)重構(gòu)。根據(jù)幀邊信息中的scalefactor_compress 和標(biāo)準(zhǔn)中的對(duì)應(yīng)表格來(lái)確定的slen1和slen2 對(duì)縮放因子進(jìn)行解碼,即直接從主數(shù)據(jù)塊中讀取縮放因子信息并存入表scalefac_l[gr][ch][sfb]和scalefac_s[gr][ch][sfb]中。對(duì)第2 粒度組解碼時(shí),若為長(zhǎng)塊,則必須考慮尺度因子選擇信息。 4.1 尺度因子帶(scalefactor-band)在mpeg layer 3中576條頻率線根據(jù)人耳的聽(tīng)覺(jué)特性被分成多個(gè)組,每個(gè)組對(duì)應(yīng)若干個(gè)尺度因子,這些組就叫做尺度因子帶,每個(gè)長(zhǎng)窗有21個(gè)尺度因子帶而每個(gè)短窗有12個(gè)尺度因子帶。 4.2 scfsiscfsi(尺度因子選擇信息)用于指出是否將粒度組1的尺度因子用于粒度組2。如果為0表示不用,則在比特流中需讀取粒度組2的尺度因子。 4.3 處理流程
![]() 縮放因子解碼流程圖 5、哈夫曼解碼哈夫曼編碼是一種變長(zhǎng)編碼,在mp3哈夫曼編碼中,高頻的一串零值不編碼,不超過(guò)1的下一個(gè)區(qū)域使用四維哈夫曼編碼,其余的大值區(qū)域采用二維哈夫曼編碼,而且可選擇地分為三個(gè)亞區(qū),每個(gè)有獨(dú)立選擇的哈夫曼碼表。通過(guò)每個(gè)亞區(qū)單獨(dú)的自適應(yīng)碼表,增強(qiáng)編碼效率,而且同時(shí)降低了對(duì)傳輸誤碼的敏感度。 5.1 處理流程![]() 6、逆量化6.1 逆量化公式逆量化由下面公式算出: ![]() 長(zhǎng)窗模式: ![]() is[i] :由huffman編碼構(gòu)造的頻率線 sbg :subblock_gain scalefac_multiplier := (scalefac_scale + 1) / 2 其它值均可在幀邊信息中找到。 7、聯(lián)合立體聲轉(zhuǎn)換7.1 強(qiáng)度立體聲轉(zhuǎn)換在強(qiáng)度立體聲模式中,左聲道傳的是幅值,右聲道的scalefactor傳的是立體聲的位置is_pos。需要轉(zhuǎn)換的頻率線有一個(gè)低邊界,這個(gè)低邊界是由右聲道的zero_part決定的,并且使用右聲道的尺度因子來(lái)作為is_pos。 ![]() 左聲道: ![]() ![]() 7.2 M_S立體聲轉(zhuǎn)換在M_S立體聲模式中,傳送的是規(guī)格化的中間/旁邊聲道的信息 ![]() ![]() 其中Mi是channel[0]的值,Si是channel[1]的值 7.3 處理流程強(qiáng)度立體聲模式: ![]() MS_STEREO因公式單一,較易理解,故流程圖略去。 8、重排序重排序的目的在于把哈夫曼解碼之后的短塊的每個(gè)尺度因子帶3個(gè)窗,每個(gè)窗sfbwidth(尺度因子帶寬度)個(gè)采樣的順序整理成為每個(gè)子帶三個(gè)窗,每個(gè)窗六個(gè)采樣xr[sb][window][freq_line]的順序。 8.1 處理流程
![]() 重排序處理流程圖 混淆縮減對(duì)于長(zhǎng)塊,在進(jìn)入IMDCT之前應(yīng)當(dāng)先進(jìn)行混淆縮減。其算法思想是用蝶形算法進(jìn)行相鄰塊相鄰頻率線的調(diào)整。如圖: ![]() 混淆縮減算法圖
![]() 其中ci可由ISO 1172.3 table B.9查得 計(jì)算流程如下(pascal 描述): For sb = 1 to 32 do For i = 0 to 7 do Xar[18sb- i -1] = xr[18sb – i - 1]cs[i] – xr[18sb + i]ca[i] Xar[18sb+i] = xr[18sb +i]cs[i] + xr[18sb -i- 1]ca[i] End for End for 10、IMDCT覆蓋疊加MDCT的目的在于進(jìn)行時(shí)域到頻域的轉(zhuǎn)換,減少信號(hào)的相關(guān)性,使得信號(hào)的壓縮可以更加高效地完成,而它的反變換IMDCT的目的在于將信號(hào)還原為沒(méi)有變換之前的數(shù)值,使頻域值向時(shí)域值過(guò)渡。 ![]() 在進(jìn)行了IMDCT變換之后,需對(duì)頻率信號(hào)進(jìn)行加窗、覆蓋、疊加。 10.1 加窗:長(zhǎng)塊: ![]() 開(kāi)始?jí)K: ![]() 結(jié)束塊: ![]() 短塊的每個(gè)窗口分別計(jì)算: ![]() ![]() 10.2 疊加:將每一塊變換出來(lái)的值的前半部分與前一塊的后半部分相加,并把后半部分保留來(lái)和下一塊的前半部分相加。如下公式: 10.3 Szu-Wei Lee的快速算法Szu-Wei Lee的IMDCT快速算法是針對(duì)非2的n次冪個(gè)點(diǎn)的IMDCT快速算法。他的主要步驟如下:
在本程序中,因?yàn)閷?duì)短塊使用這個(gè)快速算法并沒(méi)有帶來(lái)較大的速度改善,故只對(duì)長(zhǎng)塊使用此快速算法,相較于直接運(yùn)算的648次乘和612次加來(lái),它只用43次乘和115次加。 11、頻率反轉(zhuǎn)在IMDCT之后,進(jìn)入合成多相濾波之前必須進(jìn)行頻率反轉(zhuǎn)補(bǔ)償以校正多相濾波器組的頻率反轉(zhuǎn)。方法是將奇數(shù)號(hào)子帶的奇數(shù)個(gè)采樣值乘以-1. 12、合成多相濾波合成多相濾波的目的是將頻域信號(hào)轉(zhuǎn)化為時(shí)域信號(hào)。其原理流程如下: ![]() 合成多相濾波算法圖
Byeong Gi Lee的dct快速算法Byeong Gi Lee的DCT快速算法是用于2的n次冪個(gè)點(diǎn)的dct快速算法。它用于N點(diǎn)的DCT時(shí)僅需(N/2) * log2N次乘法和小于3·*(N/2)*log2 N ) 次加法。 其基本思想是,將N個(gè)點(diǎn)的DCT轉(zhuǎn)化為兩個(gè)N/2個(gè)點(diǎn)的DCT的和。進(jìn)一步分解,即重復(fù)這個(gè)過(guò)程,減少乘法數(shù)量。 術(shù)語(yǔ)說(shuō)明MPEG:Motion Picture Expert Group 參考文獻(xiàn)
|
聯(lián)系客服