国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
mp3解碼原理_摘抄2
2009-02-01 14:51

本文介紹了符合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ò)檢查包括了頭解碼模塊
在主控模塊開(kāi)始運(yùn)行后,主控模塊將比特流的數(shù)據(jù)緩沖區(qū)交給同步及差錯(cuò)檢查模塊,此模塊包含兩個(gè)功能,即頭信息解碼及幀邊信息解碼,根據(jù)它們的信息進(jìn)行尺度因子解碼及哈夫曼解碼,得出的結(jié)果經(jīng)過(guò)逆量化,立體聲解碼,混淆縮減,IMDCT,頻率反轉(zhuǎn),合成多相濾波這幾個(gè)模塊之后,得出左右聲道的PCM碼流,再由主控模塊將其放入輸出緩沖區(qū)輸出到聲音播放設(shè)備。

2、主控模塊

主控模塊的主要任務(wù)是操作輸入輸出緩沖區(qū),調(diào)用其它各模塊協(xié)同工作。
其中,輸入輸出緩沖區(qū)均由DSP控制模塊提供接口。
輸入緩沖區(qū)中放的數(shù)據(jù)為原始mp3壓縮數(shù)據(jù)流,DSP控制模塊每次給出大于最大可能幀長(zhǎng)度的一塊緩沖區(qū),這塊緩沖區(qū)與上次解幀完后的數(shù)據(jù)(必然小于一幀)連接在一起,構(gòu)成新的緩沖區(qū)。
輸出緩沖區(qū)中將存放的數(shù)據(jù)為解碼出來(lái)的PCM數(shù)據(jù),代表了聲音的振幅。它由一塊固定長(zhǎng)度的緩沖區(qū)構(gòu)成,通過(guò)調(diào)用DSP控制模塊的接口函數(shù),得到頭指針,在完成輸出緩沖區(qū)的填充后,調(diào)用中斷處理輸出至I2S接口所連接的音頻ADC芯片(立體聲音頻DAC和DirectDrive耳機(jī)放大器)輸出模擬聲音。

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)圖


其中g(shù)ranule0和granule1表示在一幀里面的粒度組1和粒度組2,channel0和channel1表示在一個(gè)粒度組里面的兩個(gè)通道,scalefactor為尺度因子quantized value為量化后的哈夫曼編碼值,它分為big values大值區(qū)和count1 1值區(qū)
CRC校驗(yàn):表達(dá)式為X16+X15+X2+1

3.1 幀同步

幀同步目的在于找出幀頭在比特流中的位置,ISO 1172-3規(guī)定,MPEG1 的幀頭為12比特的“1111 1111 1111”,且相鄰的兩個(gè)幀頭隔有等間距的字節(jié)數(shù),這個(gè)字節(jié)數(shù)可由下式算出:
N= 144 * 比特率 / 采樣率
如果這個(gè)式子的結(jié)果不是整數(shù),那么就需要用到一個(gè)叫填充位的參數(shù),表示間距為N +1。

3.2 頭信息解碼

頭信息解碼目的是找出這一幀的特征信息,如采樣率,是否受保護(hù),是否有填充位等。頭信息見(jiàn)下圖:


幀頭信息結(jié)構(gòu)圖

其長(zhǎng)度為4 字節(jié),數(shù)據(jù)結(jié)構(gòu)如下:
typedef struct tagHeader {
unsigned int sync : 11 ; / / 同步信息
unsigned int version : 2 ; / / 版本
unsigned int layer : 2 ; / / 層
unsigned int error2protection : 1 ; / / CRC校正
unsigned int bit2rate2index : 4 ; / / 位率索引
unsigned int sample2rate2index : 2 ; / / 采樣率索引
unsigned int padding : 1 ; / / 空白字
unsigned int extension : 1 ; / / 私有標(biāo)志
unsigned int channel2mode : 2 ; / / 立體聲模式
unsigned int mode extension : 2 ; / / 保留
unsigned int copyright : 1 ; / / 版權(quán)標(biāo)志
unsigned int original : 1 ; / / 原始媒體
unsigned int emphasis : 2 ; / / 強(qiáng)調(diào)方式
} HEADER

3.3 幀邊信息解碼

幀邊信息解碼的主要目的在于找出解這幀的各個(gè)參數(shù),包括主數(shù)據(jù)開(kāi)始位置,尺度因子長(zhǎng)度等。幀邊信息如下圖所示:


幀邊信息(side_infomation)表

3.4 main_data_begin

main_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_type

block_type指出如下三種塊類型:
block_type = 0 長(zhǎng)塊
block_type = 1 開(kāi)始?jí)K
block_type = 3 結(jié)束塊
block_type = 2 短塊
在編碼過(guò)程中進(jìn)行IMDCT 變換時(shí),針對(duì)不同信號(hào)為同時(shí)得到較好的時(shí)域和頻域分辨率定義了兩種不同的塊長(zhǎng):長(zhǎng)塊的塊長(zhǎng)為18個(gè)樣本,短塊的塊長(zhǎng)為6個(gè)樣本。這使得長(zhǎng)塊對(duì)于平穩(wěn)的聲音信號(hào)可以得到更高的頻率分辨率,而短塊對(duì)跳變信號(hào)可以得到更高的時(shí)域分辨率。由于在短塊模式下,3 個(gè)短塊代替1個(gè)長(zhǎng)塊,而短塊的大小恰好是一個(gè)長(zhǎng)塊的1/3,所以IMDCT的樣本數(shù)不受塊長(zhǎng)的影響。對(duì)于給定的一幀聲音信號(hào),IMDCT 可以全部使用長(zhǎng)塊或全部使用短塊,也可以長(zhǎng)短塊混合使用。因?yàn)榈皖l區(qū)的頻域分辨率對(duì)音質(zhì)有重大影響,所以在混合塊模式下,IMDCT對(duì)最低頻的2個(gè)子帶使用長(zhǎng)塊,而對(duì)其余的30個(gè)子帶使用短塊。這樣,既能保證低頻區(qū)的頻域分辨率,又不會(huì)犧牲高頻區(qū)的時(shí)域分辨率。長(zhǎng)塊和短塊之間的切換有一個(gè)過(guò)程,一般用一個(gè)帶特殊長(zhǎng)轉(zhuǎn)短(即,起始?jí)Kblock_type = 1)或短轉(zhuǎn)長(zhǎng)(即終止塊,block_type = 3)數(shù)據(jù)窗口的長(zhǎng)塊來(lái)完成這個(gè)長(zhǎng)短塊之間的切換。因此長(zhǎng)塊也就是包括正常窗,起始?jí)K和終止塊數(shù)據(jù)窗口的數(shù)據(jù)塊;短塊也包含18個(gè)數(shù)據(jù),但是是由6個(gè)數(shù)據(jù)獨(dú)立加窗后在經(jīng)過(guò)連接計(jì)算得到的。

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)查得.
參見(jiàn)下圖:


縮放因子、大值區(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 scfsi

scfsi(尺度因子選擇信息)用于指出是否將粒度組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ì)傳輸誤碼的敏感度。
在程序?qū)崿F(xiàn)上,哈夫曼表邏輯存儲(chǔ)采用了廣義表結(jié)構(gòu),物理存儲(chǔ)上使用數(shù)組結(jié)構(gòu)。查表時(shí),先讀入4bit數(shù)據(jù),以這4bit數(shù)據(jù)作為索引,其指向的元素有兩種類型,一種是值結(jié)構(gòu),另一種是鏈表指針式結(jié)構(gòu),在鏈表指針式結(jié)構(gòu)中給出了還需要讀取的bit數(shù),及一個(gè)偏移值。如果索引指向的是一個(gè)值結(jié)構(gòu),則這個(gè)值結(jié)構(gòu)就包含了要查找的數(shù)據(jù)。如果索引指向的是一個(gè)鏈表指針式結(jié)構(gòu),則還需再讀取其中指定的比特?cái)?shù),再把讀取出的比特?cái)?shù)同偏移值相加,遞歸的找下去,直到找到值結(jié)構(gòu)為止。

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。
強(qiáng)度立體聲比


左聲道:
 右聲道:

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)整。如圖:


混淆縮減算法圖



其計(jì)算公式如下:


其中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)和下一塊的前半部分相加。如下公式:
resulti = zi + si    for i = 0 to 17
si = zi+18        for i = 0 to 17

10.3 Szu-Wei Lee的快速算法

Szu-Wei Lee的IMDCT快速算法是針對(duì)非2的n次冪個(gè)點(diǎn)的IMDCT快速算法。他的主要步驟如下:

    1. 將N點(diǎn)MDCT化為N/2點(diǎn)DCT-IV
    2. 將N/2點(diǎn)DCT-IV化為N/2點(diǎn)SDCT-II
    3. 將N/2點(diǎn)SDCT-II化為2個(gè)相同的N/4點(diǎn)SDCT-II
    4. 計(jì)算SDCT-II(9點(diǎn))

在本程序中,因?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)。其原理流程如下:


合成多相濾波算法圖


上圖流程可簡(jiǎn)述如下:

      1. 將從32個(gè)子帶抽來(lái)的32個(gè)sample值通過(guò)一個(gè)矩陣運(yùn)算算出64個(gè)中間值
      2. 將這64個(gè)中間值放入一個(gè)長(zhǎng)度為1024的FIFO緩沖區(qū)(這個(gè)緩沖區(qū)初始化為0)。
      3. 從這個(gè)緩沖區(qū)中每連續(xù)的128個(gè)值中取頭尾各32個(gè)值,合為64個(gè)值。完成后組成512值的向量U
      4. 加窗,即將Ui與窗口系數(shù)Di相乘,得到另一512值向量W
      5. 最后將這512值向量W每連續(xù)的32個(gè)值中順次取一個(gè)值,一次共取得512/32 = 16個(gè)值相加。完成后一共取得32個(gè)最終的時(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ù)量。
由于向量Vi的運(yùn)算是一個(gè)類似于DCT的變換,故使用了此快速算法。32點(diǎn)運(yùn)算共使用了80次乘法和80次加法119次減法。

術(shù)語(yǔ)說(shuō)明

MPEG:Motion Picture Expert Group
IMDCT:反離散余弦變換
gr:granule粒度組
ch:channel 通道

參考文獻(xiàn)

  1. ISO/IEC 11172_3
  2. 賴?guó)欀荆篗PEG-1 LAYER 3 音訊解碼器於DSP晶片之即時(shí)軟體實(shí)現(xiàn)  
  3. An Introduction to Digital Audio   John Watkinson
  4. Madlib源程序
  5. Szu-Wei Lee : Improved Algorithm for Efficient Computation fo the Forward and Backward MDCT in MPEG Audio Coder
  6. BYEONG GI LEE :A New Algorithm to Compute the Discrete Cosine Transform
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
淺談網(wǎng)絡(luò)語(yǔ)音技術(shù)
數(shù)據(jù)壓縮算法:LZ77 算法的分析與實(shí)現(xiàn)
范式哈夫曼算法的分析與實(shí)現(xiàn)
亂碼算法大全
基于矩陣乘法器的MP3解碼優(yōu)化設(shè)計(jì)
【流媒體|從入門到出家】:流媒體系統(tǒng)(上)
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服