logo资料库

基于嵌入式Linux的MP3播放器设计.pdf

第1页 / 共4页
第2页 / 共4页
第3页 / 共4页
第4页 / 共4页
资料共4页,全文预览结束
Ξ 第 21 卷  第 3 期 Vol. 21  No. 3 【电子与自动化】 2 重 庆 工 学 院 学 报 (自然科学版) Journal of Chongqing Institute of Technology(Natural Science Edition) 2007 年 3 月 Mar. 2007 基于嵌入式 Linux 的 MP3 播放器设计 王森林 ,庄圣贤 (西南交通大学 电气工程学院 ,成都  610031) 摘要 :设计了一种应用于嵌入式系统的 MP3 播放器. 该播放器基于嵌入式 Linux 操作系统、应用 ARM平台. 介绍了 MP3 文件的编码原理 ,论述了解码过程及关键算法 ,并实现其在 ARM 平台的运 行. 该播放器除能够播放 MP3 音乐外 ,还具有多国语言支持、按键控制、以及歌词同步显示等功能. 关  键  词 :嵌入式 Linux ;MP3 ;编码原理 ;解码算法 中图分类号 :TP334. 3     文献标识码 :A 文章编号 :1671 - 0924(2007) 03 - 0065 - 04 MP3 Player Design Based on Embedded Linux WANG Sen lin , ZHUANG Sheng xian (School of Electrical Engineering , Southwest Jiaotong University , Chengdu 610031 ,China) Abstract : This paper designs a kind of MP3 player based on embedded systems. The player is based on em bedded Linux OS , and applied to ARM platform. First ,this paper introduces the coding principle of MP3 files. Secondly , it discusses the decoding process and crucial algorithm in detail. Finally ,it accomplishes the player’s running on ARM platform. Besides playing MP3 music , the player supports multi languages、 lyrics synchronization、and buttons control. Key words : embedded Linux ;MP3 ;coding principle ;decoding algorithm 0  引言 1  MP3 编码原理   由于具有后 PC 时代最显著的特点 ,嵌入式系统是目 前 IT 业研究最广泛的分支之一. 随着嵌入式系统被广泛应 用于手机 、PDA 等消费类电子设备 ,如何在这些个人设备 中加入各种多媒体功能已经成为研究的重点 1 . 鉴于以上情况 ,本文中针对嵌入式系统开发的特点 , 对 MP3 文件格式 、编码原理做了详细研究. 给出了 MP3 播 放器的解码流程 ,对关键的 Huffman , IMDCT(修正的离散余 弦变换逆变换) 解码算法进行了详细描述 ,并对播放器的 各个功能进行了验证.   MP3 为 MPEG- I/ Audio Layer3 的缩写 ,是由 MPEG(Mov ing Picture Experts Group ,运动图像专家组) 制定的运动影音 压缩标准 ,该标准属于 MPEG音频层. 在 MPEG音频层中 ,根 据压缩质量和编码复杂程度不同可将其划分为 3 层 ,即 Lay er1 ,Layer2 ,Layer3 ,且分别对应 MP1 ,MP2 ,MP3 这 3 种声音文 件 ,并根据不同的用途 ,使用不同层次的编码. MPEG 音频编 码的层次越高 ,编码器越复杂 ,压缩率也越高 ,MP1 和 MP2 的压缩率分别为4∶1和6∶1~8∶1 ,而 MP3 的压缩率则高达 10∶1~12∶1 ,不过 MP3 对音频信号采用的是有损压缩方式 ,    收稿日期 :2007 - 01 - 18 基金项目 :“十一五”国防预研项目 (51305050203) . 作者简介 :王森林 (1981 - ) ,男 ,黑龙江宝清人 ,硕士研究生 ,主要从事嵌入式系统应用研究.
Ο Ο 重 庆 工 学 院 学 报 Ο Ο Ο Ο 66 为了降低声音失真度 ,MP3 采取了“感官编码技术”,即编码 时先对音频文件进行频谱分析 ,然后用滤波器滤掉噪音电 平 ,接着通过量化的方式将剩下的每一位打散排列 ,最后形 成具有较高压缩比的 MP3 文件 ,并使压缩后的文件在回放 时能够达到比较接近原音源的声音效果 2 - 4 . 1. 1  MP3 文件结构 MP3 文件大体可分为 3 部分 : TAG- V2 ( ID3V2) ,Frame , TAG- V1 ( ID3V1) ,各部分功能如图 1 所示. ID3V2 Frame 包含了作者 、作曲 、专辑等信息 ,长度不固 定 ,扩展了 ID3V1 的信息量 一系列的帧 ,个数由文件大小和帧长决定 , 帧是 MP3 文件最小的组成单位 ;每个 Frame 的长度可能不固定 ,也可能固定 ,由位率 bi trate 决定 ;每个 Frame 又分为帧头和数据实 体 2 部分 ,帧头记录了 MP3 的位率 、采样率 、 版本等信息 ID3V1 包含了作者 、作曲 、专辑等信息 ,长度为 128 BYTE 图 1  MP3 文件结构及功能描述 1. 2  MP3 的 Freame 格式 每个 Frame 都有一个帧头 ,长度是 4 BYTE(32 bit) ,帧 头后面可能有 2 个字节的 CRC 校验 ,这 2 个字节是否存在 取决于 FRAMEHEADER 信息的第 16 bit :为 0 则帧头后面无 校验 , 为 1 则 有 校 验 , 校 验 值 长 度 为 2 个 字 节 , 紧 跟 在 FRAMEHEADER 后面 ,接着就是帧的主数据 ,帧格式如图 2 所示. FRAMEHEADER CRC(free) 4 BYTE 0 OR 2 BYTE MAIN - DATA 长度由帧头计算 得出 图 2  MP3 文件 Frame 格式 1. 3  MP3 编码流程 当 MP3 编码时 ,首先将原始输入的 PCM 信号通过子带 滤波组分析 (Filter Bank Analysis) ,转换成 32 个等频带的子 频带信号 ( Subband Signals) ,然后通过修正离散余弦变换 (MDCT ,Modified Discrete Cosine Transform) ,将每个子带信号 再细分为 18 个次频带. 然后依据 Psychoacoustic Mode II(第 二精神听觉模型) 所提供的音频信号信遮比 (SMR ,Signal to Mask Ratio) ,对每个子带频率信号做位元分配及量化编码. 最后将编码的数据依照 MPEG - 1 定义的位串形式输出即 可 2 - 8 . 编码方框图如图 3 所示. 图 3  MGEG 1/ layer3 编码方框图 2  MP3 解码流程及结构   MP3 解码其实就是其编码过程的逆过程 ,解码的好坏 决定了音质的好坏. 解码首先获得每帧的同步字和帧头信 息 ,从而获得相应参数 ,并根据对帧头信息的分析进而得 到实际一帧音频数据 ;然后读取主要数据并获得缩放因子 数据和霍夫曼码字 ,接着根据边信息中霍夫曼码表的选择 信息进行霍夫曼解码 ;其次进行反量化 ,并根据帧头的立 体声信息对反量化结果进行立体声处理 ;最后通过混迭处 理 、IMDCT 和合成带滤波器重建数字音频信号. 2. 1  关键算法 在解码过程中 Huffman 解码以及 IMDCT 变换最为关 键. 前者将音频编码数据进行还原 ;后者为 MDCT 的逆变 换. 2. 1. 1  Huffman 解码. 霍夫曼编码是一个穷举 、查表的过 程 ,该算法也是一个重要的耗时单元. MP3 标准提供了 34 个霍夫曼码表. 根据最大量化值及信号的局部统计特性不 同使用不同的霍夫曼码表 ,从而获得更好的容错性和编码 效率. 从 0 到 Nyuist 率范围被分为 3 个区域 ,每个区域用不 同的表进行划分是以最大量化值为依据的 ,量化值被分为 大值区 (Bigvalue Zone) 、小值区 ( Countvalue Zone) 、零值区 (Zero Zone) 3 个部分 ,零值区属于高频区 ,为一串连续的零 不需要编码 ,对于大值区和小值区采用不同的编码策略 , 大值区每 2 个绝对量化值依据霍夫曼表 0~31 被转换为一 个霍夫曼码字 ,而小值区的每个量化值的绝对值不超过 1 , 因此 ,可以 4 个绝对量化值依据霍夫曼表 32 ,33 转换为一 个码字. 因为一般大值区占用的比特数较多 ,为了提高大 值区霍夫曼编码效率 ,又将其分为 Region0 ,Regionl ,Region2 三个区域 ,允许每个区域选择不同的码表 ,而 3 个区域的边 界也不是固定的 ,在编码端根据数据块特性查表决定. 霍 夫曼表 0~15 的最大值不超过 15 ,所以只能用来对最大值 不超过 15 的子区间编码 ,而霍夫曼表 15~31 的最大值皆 为 15 ,如果要对值超过 15 的频线编码 ,就要使用 linbits 的 方法 ,如式 (1) 所示 : ESCAPE = 量化过后的值 - 15 可编码之最大值 = 15 + 2linbits (1) 在编码过程中 ,首先找到所要编码区域样值的最大 值 ,并依次查询各个霍夫曼码表 ,直到该码表能够对这一 最大值进行编码为 n ,然后计算用该码表进行编码所需的 比特数 ;再尝试相同编码值域范围的另一些码表 ,找到最 小比特数需求的码表 ,最后进行编码. 根据编码特点 ,Huffman 代码的解码分 2 部分完成 : 1) 解码 big values 数据. 首先使用边信息对 big values 数据进行解码 ,在区域 0、区域 1 和区域 2 的频率线成对进 value 数目的频率线对被 行解码 (Huffman 解码) ,直到有 big
王森林 ,等 :基于嵌入式 Linux 的 MP3 播放器设计 76 Wi = 0 sin 1 sin π 12 π 36 i - 6 + 1 2 i + 1 2 for i = 0 to 5 for i = 6 to 11 for i = 12 to 17 for i = 18 to 35 4) 短窗 (block - type = 2) Wi = sin π 12 i + 1 2 for i = 0 to 11 根据不同的窗口类型计算加窗结果 : 1) 长窗 (block - type = 0 ,1 ,3) Zi = XiWi 2) 短窗 (block - type = 2) 先分别计算 3 个 window 的 Yi 值 : Y( j) i = X ( j) i = sin π 12 i + 1 2 (5) (6) (7) (8) 其中 : i 为各 window 内 12 条频谱的 index ,而 j 为 3 个 window 的 index. 接下来用此 3 个 window 的 Yi 值计算 36 个 值 : Zi = 0 Y1 i - 6 Y1 i - 6 + Y2 i - 12 + Y3 Y2 Y3 i - 18 0 for i = 0 to 5 for i = 6 to 11 for i = 12 to 17 i - 12   i - 18 for i = 18 to 23 for i = 24 to 29 for i = 30 to 35 (9) 最后 ,把这 36 个值的前半部分与上一块的后半部分叠 加 ,而当前块的后半部分存储起来用于和下一块叠加. 整 个 IMDCT 模块结构图如图 4 所示. 解码后为止. 具体步骤为 : ①搜索码字 hcod ,得到 2 个值| x | 和| y| ; ②如果上一步求得的值任一个等于 15 ,则求扩展 域值 linbit x 和 linbit y ; ③ 求 x 和 y 的符号位 ; ④ x = sign x | x| + linbit x ; y = sign y| y| + linbit y ; ⑤输出 x 和 y 值. 2) 解码 countl 数据. 使用 countltable select 可导出变量 countl 的 值 , countl 的 值 为 解 码 值 四 元 组 的 数 目. 根 据 countltable - select 指定的表进行剩余的 Huffman 代码的解 码 ,直到所有的 Huffman 代码位被解码后或表示 576 个频率 线的量化值被解码后 ,解码工作才算完成. 处理方法为 : ① 搜索四元组码字 hcod ,得到对应的四元组值 value ; ②求 v , w , x 及 y 的符号位 ; ③ v = sign v| v| ; w = signw| w| ; x = sign x| x| ; y = sign y| y| ; ④输出 v , w , x 及 y 值. 2. 1. 2  IMDCT 解码. 层 III 编码时使用了改进离散余弦变 换 (MDCT) ,对滤波器组的不足做了一些补偿 ,从而提供了 更精确的频域分辨率. 当然 ,解码器在进行 IMDCT 变换前 就必须做相应地处理以恢复频域的混迭才能使 IMDCT 得 出正确的结果. MDCT 把子带的输出在频域里进一步地细 分 ,它指定了 2 种 MDCT 块长 :长块的长度为 18 个样本 ,短 块的长度为 6 个样本. 相邻变换窗之间有 50 %的重叠 ,所 以窗口的大小分别为 36 和 12. 编码中大多数情况用普通 窗函数做长 MDCT ,但当检测到瞬变信号时 ,则切换到短窗 函数 ,将长 MDCT 划分为 3 个短 MDCT ,以提供更好的时域 分辨率. 为保证长短 MDCT 之间的过渡 ,两者间必须经过一 个采用起始窗和终止窗 MDCT5 . 在解码时 ,将 N/ 2 点输入 Xk 经 IMDCT 变换到 N 点 xi 输出如式 (2) : Xkcos π 2 π 2 n 2 i + 1 + (2 k + 1) n 2 - 1 xi = ∑ k = 0  for i = 0 to n - 1 (2) Xk 表示 经 混 叠 处 理 后 输 出 的 频 谱 值 , xi 表 示 经 过 IMDCT 变换后的输出时域值 ,长窗时 n 等于 36 ,短窗为 12. xi 还 需 要 通 过 视 窗 变 换 处 理 , 根 据 不 同 的 窗 类 型 ( 由 block - type 指定) 进行加窗运算. 窗口类型如下 : 1) 正常窗 (block - type = 0) π 12 Wi = sin 2) 起始窗 (block - type = 1) i + 1 2 for i = 0 to 35 Wi = i + 1 2 i - 18 + 1 2 π 36 π 12 sin 1 sin 0 for i = 0 to 17 for i = 18 to 23 for i = 24 to 29 for i = 30 to 35 3) 终止窗 (block - type = 3) (3) (4) 图 4  IMDCT 模块结
Ο 图 5  MP3 播放器整体控制流程图 3  验证   本 设 计 针 对 的 硬 件 平 台 为 基 于 ARM920T 内 核 的 EP9315A 处理器. 该处理器内带 MMU ,16KB 的指令 cache 和 16KB 的数据 cache 以及 Maverick Crunch 数学协处理器 ;主 频 200 MHz ,系统总线 100 MHz ;操作系统为 Arm linux. 为验 证播放器各功能需要编译内核及对宿主机进行设置 9 3. 1  内核编译 . 将已经打好补丁的内核包解压到工作目录下 ,一般在 / usr/ src/ arm/ 下 ,执行 : 2. 4. 21 tar jxvf linux 解压完成后会在当前目录下生成一个 linux fft. tar. bz2 2. 4. 21 的 4  Pramod Chandraiah. Specification and Design of a MP3 Au 目录 ,进入此目录 ,执行 : make menuconfig 出现内核的配置菜单. 选中 NFS(网络文件系统) 服务 及其它必要选项. 接下来输入 make dep 建立内核文件依赖 关系. dio Decoder D . California :California University ,2005. 5  陆志洋. MPEG - 1/ Audio Layer3 解码器实现及应用 D . 大连 :大连海事大学 ,2006. 6  Steve Oualline. Practical C Programming 3rd Edition M . USA : O’Reilly Express ,1997. 结束后输入 make zImage 编译成功后会在 arch/ arm/ 7  Karim Yaghmour. Building Embedded Linux Systems M . boot 目录下得到一个压缩内核 zImage. 3. 2  宿主机设置 在 PC 宿主机上首先建立交叉编译环境 ,本次开发应 2. 95. 3. tar. bz2 交叉编译器 ;然后设置串口通讯 ,执 用 cross 行 : USA :O’Reilly Express ,2003. 8  Rassol Raissi. The Theory Behind Mp3 M . USA :O ’Reilly Express ,2002. 9  曾烨 ,沈轶 ,黄俊桥. 基于嵌入式 Linux 的 VoIP 网关设 计 M . 重庆工学院学报 ,2006 (5) :17 - 21. minicom - s (责任编辑  陈  松) 86 2. 2  MP3 播放器结构 该 MP3 播放器除具有播放音乐外还附有 ID3 显示 、多 国语言 、歌词同步按键控制等功能. 整个播放器整体控制 流程如图 5 所示. 重 庆 工 学 院 学 报 设置串口为 115200 ,8 ,无 ,1 ,无. 最后设置 NFS 服务器 , 在宿主机上设置/ tftpboot 为 NFS 共享目录 ,并关闭防火墙 , 然后执行 : ifconfig eth0 192. 168. 0. 222 设置主机的 ip 地址 : / etc/ rc. d/ init. d/ portmap start / etc/ rc. d/ init. d/ nfs restart 开启 NFS ,完成主机设置. 3. 3  验证 应用交叉编译器对播放器进行编译生成二进制可执 行程序 Myplayer ,将该可执行程序及 MP3 文件 、歌词文件拷 到/ tftpboot 目录下 ,连接开发板 ,当内核启动出现提示符后 输入 :mount cd / mnt . / myplayer 此时 ,MP3 播放器开始运行 ,耳机中出现音乐 ,经测试 o nolock 192. 168. 2. 32 :/ tftpboot / mnt . MP3 各功能运行正常. 4  结束语   近年来 ,嵌入式系统与 Linux 系统的有机结合 ,已广泛 被应用于网络通信 、工业控制 、机顶盒 、PDA 等诸多领域. 本文中提出了一种基于嵌入式 Linux 平台的 MP3 播放器的 设计方案 ,目前该设计方案已经实现. 实践证明 ,此播放器 拥有市面 MP3 所有的全部功能并能够很好地运行. 参考文献 : 1  李善平 ,施韦 ,林欣. Linux 教程 M . 北京 :清华大学 出版社 ,2005. 2  ISO/ IEC 11172 - 3 International Standard ,“Information Coding of moving pictures and associated audio Technology for digital storage media at up to about 1. 5 Mbit/ s”S . 3  Shlien S. Guide to MPEG - 1 Audio Standard J . IEEE Transactions on Broadcasting , 1994 ,40(4) :35 - 39.
分享到:
收藏