Ξ
第 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.