MPEG1Layer3 (MP3)解码算法原理详解
本文介绍了符合ISO/IEC11172-3(MPEG 1 Audio codec Layer I, Layer II and Layer III audiospecifications) 或ISO/IEC13818-3(BC Audio Codec)音频编码原理。经过madlib解码库进行实现。
1、程序系统结构
mp3解码步骤图
其中同时及差错检验包含了头解码模块
在主控模块开始运行后,主控模块将比特流数据缓冲区交给同时及差错检验模块,此模块包含两个功效,即头信息解码及帧边信息解码,依据它们信息进行尺度因子解码及哈夫曼解码,得出结果经过逆量化,立体声解码,混淆缩减,IMDCT, 频率反转,合成多相滤波这多个模块以后,得出左右声道PCM码流,再由主控模块将其放入输出缓冲区输出到声音播放设备。
2、主控模块
主控模块关键任务是操作输入输出缓冲区,调用其它各模块协同工作。其中,输入输出缓冲区均由DSP控制模块提供接口。
输入缓冲区中放数据为原始mp3压缩数据流,DSP 控制模块每次给出大于最大可能帧长度一块缓冲区,这块缓冲区和上次解帧完后数据(肯定小于一帧)连接在一起,组成新缓冲区。
输出缓冲区中将存放数据为解码出来PCM数据,代表了声音振幅。它由一块固定长度缓冲区组成,经过调用DSP控制模块接口函数,得到头指针,在完成输出缓冲区填充后,调用中止处理输出至I2S接口所连接音频ADC芯片(立体声音频DAC和DirectDrive耳机放大器)输出模拟声音。
3、同时及差错检测
同时及差错检测模块关键用于找出数据帧在比特流中位置,并对以此位置开始帧头、CRC校验码及帧边信息进行解码,这些解码结果用于后继尺度因子解码 模块和哈夫曼解码模块。Mpeg1layer 3 流主数据格式见下图:
主数据组织结构图
其中granule0和granule1表示在一帧里面粒度组1和粒度组2,channel0 和
channel1表示在一个粒度组里面两个通道,scalefactor 为尺度因子quantizedvalue 为量化后哈夫曼编码值,它分为bigvalues 大值区和count11 值区CRC校验:表示式为X16+X15+X2+1
3.1帧同时
帧同时目标在于找出帧头在比特流中位置,ISO 1172-3 要求,MPEG1 帧头为12比特“11111111 1111”, 且相邻两个帧头隔有等间距字节数,这个字节数可由下式算出:
N=144 * 比特率/采样率
假如这个式子结果不是整数,那么就需要用到一个叫填充位参数,表示间距为N+1。
3.2头信息解码
头信息解码目标是找出这一帧特征信息,如采样率,是否受保护,是否有填充位 等。头信息见下图:
帧头信息结构图
其长度为4字节,数据结构以下:
typedefstruct tagHeader {
unsignedint sync : 11 ; / / 同时信息
unsignedint version : 2 ; / / 版本
unsignedint layer : 2 ; / / 层
unsignedint error2protection : 1 ; / / CRC 校正unsignedint bit2rate2index : 4 ; / / 位率索引unsignedint sample2rate2index : 2 ; / / 采样率索引unsignedint padding : 1 ; / / 空白字
unsignedint extension : 1 ; / / 私有标志
unsignedint channel2mode : 2 ; / / 立体声模式unsignedint mode extension : 2 ; / / 保留
unsignedint copyright : 1 ; / / 版权标志
unsignedint original : 1 ; / / 原始媒体
unsignedint emphasis : 2 ; / / 强调方法
}HEADER
3.3帧边信息解码
帧边信息解码关键目标在于找出解这帧各个参数,包含主数据开始位置,尺度因 子长度等。帧边信息以下图所表示:
帧边信息(side_infomation)表
3.4main_data_begin
main_data_begin(主数据开始)是一个偏移值,指出主数据是在同时字之前多少个字节开始。需要注意是,1.帧头不一定是一帧开始,帧头CRC校验字和帧边信息在帧数据中是滑动。2.这个数值忽略帧头和帧边信息存在,假如
main_data_begin= 0, 则主数据从帧边信息下一个字节开始。 参见下图:
同时示意图
3.5block_type
block_type指出以下三种块类型:
block_type= 0 长块
block_type= 1 开始块
block_type= 3 结束块
block_type= 2 短块
在编码过程中进行IMDCT变换时,针对不一样信号为同时得到很好时域和频域分辨率定义了两种不一样块长:长块块长为18个样本,短块块长为6个样本。
这使得长块对于平稳声音信号能够得到更高频率分辨率,而短块对跳变信号能够得到更高时域分辨率。因为在短块模式下,3 个短块替换1个长块,而短块大小恰好是一个长块1/3,所以IMDCT样本数不受块长影响。对于给定一帧声音信号,IMDCT 能够全部使用长块或全部使用短块,也能够长短块混合使用。因为低频区频域分辨率对音质有重大影响,所以在混合块模式下,IMDCT 对最低频2个子带使用长块,而对其它30个子带使用短块。这么,既能确保低频区频域分辨率,又不会牺牲高频区时域分辨率。长块和短块之间切换有一个过程,通常见一个带特殊长转短(即,起始块block_type= 1)或短转长(即终止块,
block_type= 3)数据窗口长块来完成这个长短块之间切换。所以长块也就是包含正常窗,起始块和终止块数据窗口数据块;短块也包含18个数据,不过是由6个数据独立加窗后在经过连接计算得到。
3.6big_values, count1
每一个粒度组频谱全部是用不一样哈夫曼表来进行编码。编码时,把整个从0到奈奎斯特频率频率范围(共576个频率线)分成多个区域,然后再用不一样表编码。划分过程是依据最大量化值来完成,它假设较高频率值有较低幅度或根本不需要编码。从高频开始,一对一正确计算量化值等于“0”数目,此数目记为“rzero”。然后4个一组地计算绝对值不超出“1”量化值(也就是说,其中只可能有-1,0 和+1共3个可能量化等级)数目,记为“count1”,在此区域只应用了4个哈夫曼编码表。最终,剩下偶数个值对数记为“big
values”, 在此区域只应用了32个哈夫曼编码表。在此范围里最大绝对值限制为8191。以后,为增强哈夫曼编码性能,深入划分了频谱。也就是说,对bigvalues 区域(姑且称为大值区)再细化,目标是为了得到愈加好错误顽健 在不一样区域内应用了不一样哈夫曼编码表。具体使用性和愈加好编码效率。
哪一个表由table_select给出。从帧边信息表中能够看到:当
window_switch_flag== 0 时,只将大值区在细分为2个区,此时
region1_count无意义,此时region0_count值是标准默认;但当
window_switch_flag== 1 时再将大值区细分为3个区。不过因为
region0_count和region1_count是依据从576个频率线划分, 所以有可能超出了big_values*2 范围,此时以big_values*2 为准.region0_count 和region1_count表示只是一个索引值,具体频带要依据标准中缩放因子频带表来查得.
参见下图:
缩放因子、大值区、 1值区和零值区分布图
3.7处理步骤
4、缩放因子(scalefactor)解码
缩放因子用于对哈夫曼解码数据进行逆量化样点重构。依据帧边信息中scalefactor_compress和标准中对应表格来确定slen1和slen2对缩放因子进行解码,即直接从主数据块中读取缩放因子信息并存入表
scalefac_l[gr][ch][sfb]和scalefac_s[gr][ch][sfb]中。对第2粒度组解码时,若为长块,则必需考虑尺度因子选择信息。
4.1尺度因子带(scalefactor-band)
在mpeglayer 3 中576条频率线依据人耳听觉特征被分成多个组,每个组对应若干个尺度因子,这些组就叫做尺度因子带,每个长窗有21个尺度因子带而每个短窗有12个尺度因子带。
4.2scfsi
scfsi(尺度因子选择信息)用于指出是否将粒度组1尺度因子用于粒度组2。假如为0表示不用,则在比特流中需读取粒度组2尺度因子。
4.3处理步骤
缩放因子解码步骤图
5、哈夫曼解码
哈夫曼编码是一个变长编码,在mp3哈夫曼编码中,高频一串零值不编码,不超出1下一个区域使用四维哈夫曼编码,其它大值区域采取二维哈夫曼编码,而且可选择地分为三个亚区,每个有独立选择哈夫曼码表。经过每个亚区单独自适应码表,增强编码效率,而且同时降低了对传输误码敏感度。
物理存放上使用数组结构。在程序实现上,哈夫曼表逻辑存放采取了广义表结构,
查表时,先读入4bit数据,以这4bit数据作为索引,其指向元素有两种类型,
一个是值结构,另一个是链表指针式结构,在链表指针式结构中给出了还需要读
取bit数,及一个偏移值。假如索引指向是一个值结构,则这个值结构就包含了
要查找数据。假如索引指向是一个链表指针式结构,则还需再读取其中指定比
特数,再把读取出比特数同偏移值相加,递归找下去,直到找到值结构为止。
5.1处理步骤
6、逆量化
6.1逆量化公式
逆量化由下面公式算出:
短窗模式:
长窗模式:
其中:
is[i] : 由huffman编码结构频率线sbg : subblock_gain
scalefac_multiplier : = (scalefac_scale + 1) / 2其它值均可在帧边信息中找到。
7、联合立体声转换
7.1强度立体声转换
在强度立体声模式中,左声道传是幅值,右声道scalefactor传是立体声位置is_pos。需要转换频率线有一个低边界,这个低边界是由右声道zero_part决定,而且使用右声道尺度因子来作为is_pos。
强度立体声比
左声道:右声道:
7.2M_S 立体声转换
在M_S立体声模式中,传送是规格化中间/旁边声道信息
左声道 右声道
其中Mi是channel[0]值,Si 是channel[1]值
7.3处理步骤
强度立体声模式:
MS_STEREO因公式单一,较易了解,故步骤图略去。
8、重排序
重排序目标在于把哈夫曼解码以后短块每个尺度因子带3个窗,每个窗sfbwidth(尺度因子带宽度)个采样次序整理成为每个子带三个窗,每个窗六个采样xr[sb][window][freq_line]次序。
8.1处理步骤
重排序处理步骤图
混淆缩减
对于长块,在进入IMDCT之前应该优异行混淆缩减。其算法思想是用蝶形算法
进行相邻块相邻频率线调整。图:
混淆缩减算法图
其计算公式以下:
其中ci可由ISO1172.3 table B.9 查得
计算步骤以下(pascal描述):
Forsb = 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
Endfor
10、IMDCT覆盖叠加
MDCT目标在于进行时域到频域转换,降低信号相关性,使得信号压缩能够愈加高效地完成,而它反变换IMDCT目标在于将信号还原为没有变换之前数值,使频域值向时域值过渡。
其公式以下:
在进行了IMDCT变换以后,需对频率信号进行加窗、覆盖、 叠加。
10.1加窗:
长块:
开始块:
结束块:
短块每个窗口分别计算:
10.2叠加:
将每一块变换出来值前半部分和前一块后半部分相加,并把后半部分保留来和下一块前半部分相加。以下公式:
resulti= zi + si for i = 0 to 17
si= zi+18 for i = 0 to 17
10.3Szu-Wei Lee 快速算法
Szu-WeiLeeIMDCT 快速算法是针对非2n次幂个点IMDCT快速算法。她关键步骤以下:
1.将N点MDCT化为N/2点DCT-IV
2.将N/2点DCT-IV化为N/2点SDCT-II
3.将N/2点SDCT-II化为2个相同N/4点SDCT-II4. 计算SDCT-II(9点)
在本程序中,因为对短块使用这个快速算法并没有带来较大速度改善,故只对长块使用此快速算法,相较于直接运算648次乘和612次加来,它只用43次乘和115次加。
11、频率反转
在IMDCT以后,进入合成多相滤波之前必需进行频率反转赔偿以校正多相滤波器组频率反转。方法是将奇数号子带奇数个采样值乘以-1.
12、合成多相滤波
合成多相滤波目标是将频域信号转化为时域信号。其原理步骤以下:
合成多相滤波算法图
上图步骤可简述以下:
1.将从32个子带抽来32个sample值经过一个矩阵运算算出 64个中间值
2.将这64个中间值放入一个长度为1024FIFO缓冲区(这个缓 冲区初始化为0)。
3.从这个缓冲区中每连续128个值中取头尾各32个值,合为 64个值。完成后组成512值向量U
4.加窗,立即Ui和窗口系数Di相乘,得到另一512值向量W5. 最终将这512值向量W每连续32个值中顺次取一个值,一 次共取得512/32= 16 个值相加。完成后一共取得32个最 终时域信号值。
ByeongGi Leedct 快速算法
ByeongGi LeeDCT 快速算法是用于2n次幂个点dct快速算法。它用于N点DCT时仅需(N/2)* log2N 次乘法和小于3·*(N/2)*log2N ) 次加法。 其基础思想是,将N个点DCT转化为两个N/2个点DCT和。深入分解,即反复这个过程,降低乘法数量。
因为向量Vi运算是一个类似于DCT变换,故使用了此快速算法。32点运算共使用了80次乘法和80次加法119次减法。
术语说明
MPEG:Motion Picture Expert Group
IMDCT:反离散余弦变换
gr:granule 粒度组
ch:channel 通道
参考文件
1.ISO/IEC 11172_3
2.赖鸿志:MPEG-1 LAYER 3 音訊解碼器於DSP晶片之即時軟體實現
3.An Introduction to Digital Audio John Watkinson
4.Madlib 源程序
5.Szu-Wei Lee : Improved Algorithm for Efficient Computation fo the
Forwardand Backward MDCT in MPEG Audio Coder
6.BYEONG GI LEE : A New Algorithm to Compute the Discrete Cosine
Transform