收藏 分享(赏)

Mp3解码算法流程.docx

上传人:j35w19 文档编号:4039364 上传时间:2018-12-05 格式:DOCX 页数:62 大小:100.11KB
下载 相关 举报
Mp3解码算法流程.docx_第1页
第1页 / 共62页
Mp3解码算法流程.docx_第2页
第2页 / 共62页
Mp3解码算法流程.docx_第3页
第3页 / 共62页
Mp3解码算法流程.docx_第4页
第4页 / 共62页
Mp3解码算法流程.docx_第5页
第5页 / 共62页
点击查看更多>>
资源描述

1、Mp3 解码算法流程 第 1 章 声明本文档版权归属于西安交通大学人工智能与机器人研究所作者:李国辉 第 2 章 Mp3 解码算法流程MP3 的全称为 MPEG1 Layer-3 音频文件, MPEG 音频文件是 MPEG1 标准中的声音部分,也叫 MPEG 音频层,它根据压缩质量和编码复杂程度划分为三层,即Layer1、Layer2、Layer3,且分别对应 MP1、MP2、MP3 这三种声音文件,并根据不同的用途,使用不同层次的编码。MPEG 音频编码的层次越高,编码器越复杂,压缩率也越高,MP1 和 MP2 的压缩率分别为 4:1 和 6:1-8 :1,而 MP3 的压缩率则高达 10:

2、1-12:1 。一分钟 CD 音质的音乐,未经压缩需要 10MB 的存储空间,而经过 MP3 压缩编码后只有 1MB 左右。不过 MP3 对音频信号采用的是有损压缩方式,为了降低声音失真度,MP3 采取了“心理声学模型 ”,即编码时先对音频文件进行频谱分析,然后再根据心理声学模型把谱线分成若干个阈值分区,并计算每个阈值分区的阈值,接着通过量化和熵编码对每个谱线进行编码,最后形成具有较高压缩比的 MP3 文件,并使压缩后的文件在回放时能够达到比较接近原音源的声音效果。2.1. Mp3 文件格式MP3 文件以一帧为一个编码单元,各帧编码数据是独立的。为了清晰而准确地描述mp3 文件格式,下面采用位

3、流语法描述,这种语法格式与 c 语言近似,易于理解,且描述清晰。其中粗体表示码流中的数据项,bslbf 代表位串,即 “Bit string, left bit first ”,uimsbf代表无符号整数,即”unsinged integer, mostsignificant bit first”,数字表示该数据项所占的比特数。2.1.1. Audio Sequenceaudio sequence()while (true)frame()2.1.2. Audio Frameframe()header()error_check()audio_data()ancillary_data()2.1.3

4、. Headerheader()syncword 12 bslbfID 1 bslbflayer 2 bslbfprotection_bit 1 bslbfbitrate_index 4 bslbfsampling_frequency 2 bslbfpadding_bit 1 bslbfprivate_bit 1 bslbfmode 2 bslbfmode_extension 2 bslbfcopyright 1 bslbforiginal/home 1 bslbfemphasis 2 bslbf2.1.4. Error Checkerror_check()if (protection_bit

5、=0)crc_check 16 rpchof2.1.5. Audio data , Layer IIIaudio_data()main_data_begin 9 uimsbfif(mode=single_channel)private_bits 5 bslbfelse private_bits 3 bslbffor(ch=0;ch0) linbitsx 113 uimsbfif(x!=0)signx 1 bslbfif(|y|=15lleft = CHAR_BIT)142 bitptr-cache = *bitptr-byte;143144 if (len left) 145 value =

6、(bitptr-cache 147 bitptr-left -= len;148149 return value;150 151152 /* remaining bits in current byte */153154 value = bitptr-cache 155 len -= bitptr-left;156157 bitptr-byte+;158 bitptr-left = CHAR_BIT;159160 /* more bytes */161162 while (len = CHAR_BIT) 163 value = (value byte+;164 len -= CHAR_BIT;

7、165 166167 if (len 0) 168 bitptr-cache = *bitptr-byte;169170 value = (value cache (CHAR_BIT -len);171 bitptr-left -= len;172 173174 return value;175以上涉及到一个数据结构 structmad_bitptr:struct mad_bitptr unsigned char const *byte;unsigned short cache;unsigned short left;结构体 mad_bitptr 指向码流中的要一个要读取的比特,该比特所在的字

8、节由 byte 确定,该比特在字节中的位置由 left 确定,如果 left 为 8,则该比特为(*byte) 的最高为(MSB)。另外,成员 cache 为字节数据缓冲,也就是(*byte)。我们看函数 mad_bit_read()的第 144 行,(1left)-1)表示一个蒙板,一个 8位的数与它相与可表示低 left 位的值, 将这个值右移(bitptr-left len)位,即为要读取的若干比特位的值。函数的第 170 行也是同样的原理,只是要读取的比特位较长,涉及到多个,读者可自行揣摩。另外,在 bit.c 中,还有若干码流处理函数:mad_bit_bitsleft()、mad_b

9、it_nextbyte()、mad_bit_length()、mad_bit_skip()。3.2. 桢的同步每一桢的开头有同步字,即 syncword,为 12 个比特位( 0xFFF),用以标明一桢的开始,但通过在码流中查找同步字来定位桢是很费事的,因此 mp3 解码采用了另一种快速的定位手段。在 mp3 码流中,相邻两个同步字之间的距离(也就是一桢的长度)是 slot 的整数倍,其中 slot 就是一个字节。一桢的长度要么是 N 个字节,要么是 N+1 字节。其中 N这样计算:上式计算出来的 N 如果不是整数,应该被截短( truncated)。当桢头中的Padding_bit 为 1

10、时,桢长为 N+1;当 Padding_bit 为 0 时,桢长为 N。桢的同步通过函数 mad_header_decode()完成,定义于 frame.c:mad_frame_decode()mad_header_decode()300 int mad_header_decode(struct mad_header*header, struct mad_stream *stream)301 302 register unsigned char const *ptr, *end;303 unsigned int pad_slot, N;304305 ptr = stream-next_fram

11、e;306 end = stream-bufend;307364 /* begin processing */365 stream-this_frame = ptr;366 stream-next_frame = ptr + 1; /* possibly bogus sync word */367 368 mad_bit_init(369 370 if (decode_header(header, stream) = -1)371 goto fail;377 /* calculate free bit rate */378 if (header-bitrate = 0) 379 if (str

12、eam-freerate = 0 |!stream-sync |380 (header-layer = MAD_LAYER_III 383384 header-bitrate = stream-freerate;385 header-flags |= MAD_FLAG_FREEFORMAT;386 387 388 /* calculate beginning of next frame */389 pad_slot = (header-flags 390 391 if (header-layer = MAD_LAYER_I)392 N = (12 * header-bitrate /heade

13、r-samplerate) + pad_slot) * 4;393 else 394 unsigned int slots_per_frame;395 396 slots_per_frame = (header-layer =MAD_LAYER_III 398 399 N = (slots_per_frame * header-bitrate /header-samplerate) + pad_slot;400 410 stream-next_frame = stream-this_frame+ N;426 return 0;第 305 行从 stream 结构体中获取下一个需要解码的桢的首地

14、址,然后在 365 行传递给 stream-this_frame,于是从前一桢过渡到它的下一桢。在得到桢长 N 之后,更新stream-next_frame(410 行),为下一桢的解码做好准备。另外,结构体 stream 定义如下:struct mad_stream unsigned char const *buffer; /*input bitstream buffer */unsigned char const *bufend; /*end of buffer */unsigned long skiplen; /*bytes to skip before next frame */int

15、sync; /* streamsync found */unsigned long freerate; /*free bitrate (fixed) */unsigned char const *this_frame; /*start of current frame */unsigned char const *next_frame; /*start of next frame */struct mad_bitptr ptr; /*current processing bit pointer */struct mad_bitptr anc_ptr; /*ancillary bits poin

16、ter */unsigned int anc_bitlen; /*number of ancillary bits */unsigned char (*main_data)MAD_BUFFER_MDLEN;/*Layer III main_data() */unsigned int md_len; /*bytes in main_data */intoptions; /* decodingoptions (see below) */enum mad_error error; /*error code (see above) */;关于 stream 结构体中一些成员的含义在 3.5 节(main_data 的读取 )中解释。3.3. 桢头解码桢头解码有函数 decode_header()完成,定义于 frame.c:mad_header_decode()decode_header()static

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 企业文档

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报