打印

MPEG音频实时解码系统的DSP实现

[复制链接]
1601|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gaochy1126|  楼主 | 2012-7-4 18:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
为了使用单片DSP实现MPEG音频实时解码,本文对MPEG音频解码算法的运算量和存储量要求进行了分析,并根据编码质量和处理器速度的要求结合计算机仿真结果,介绍了充分利用ADSP2181为音频处理优化的硬件结构,对MPEG解码算法及DSP设计优化的方法。     MPEG音频解码过程是通过I/O口获得MPEG音频码流数据,依照MPEG标准进行解码,并以PCM码流格式存放在数据空间的缓冲单元中,供直接存储器存取(DMA)方式使用。MPEG音频解码的主程序流程如下:开始-->输入比特流查找标题-->侧信息解码-->比例因子解码-->哈夫曼数据解码-->反量化采样-->频谱重排序-->减小混叠-->通过IMDCT综合并重叠-- >通过多相滤波器组综合-->输出PCM样点-->结束。
    可以看出对输入码流进行解码先要经过帧同步,读入同步头的信息,得到该MPEG音频码流的采样频率、码流速率等参数,并且记录所解码的 MPEG码流的帧数,接着获取侧信息。从侧信息中根据同步头中所得的MPEG码流的压缩类型来读取信息,获得对应于各自颗粒中各自通道的相关参数。然后,对一帧中的两个颗粒进行解码,首先从码流中获取每个颗粒所对应的比例因子,并对每个颗粒下的数据进行霍夫曼解码,这个霍夫曼解码过程需要34个霍夫曼码表之一进行解码,可以从侧信息中含有的每个颗粒选择码表的信息来进行选择。
    经过霍夫曼解码的数据接下来要经过反量化采样。在这一步中,各个子带的数据根据所使用窗的类型,利用在侧信息中获得参数反量化。然后是立体声处理模块,这个模块根据MP3码流所采用的压缩类型进行相应的处理。如果MPEG音频码流是立体声或双声道压缩的,那么就要对每一个通道的音频数据进行如下处理:
重新排序处理:根据窗变换标记和所使用窗的类型所决定长窗、短窗和混和窗三种方式进行数据的重新排列;
抗锯齿处理:这一步中使用抗锯齿蝶型对每个子带中的数据进行处理;
IMDCT:对每通道中的32个子带的数据根据所使用窗的不同进行变换,在这一步中需要两组144点的表用以存储窗类型数据和正弦数据;
多相频率倒置:对于经过IMDCT的子带数据按照在偶数号子带中偶数号数据符号取反的原则进行处理,然后将所得数据输入到子带合成滤波器的输入缓冲中;
子带合成:这一步需要4.5KB的缓冲用来存储同步滤波器参数和同步窗数据。
     这样,当处理完一个颗粒中所有通道的数据后,就可以将这一颗粒已解码好的数据输出到输出缓冲区中。当将下一颗粒的数据解码并输出后,这样一帧数据解码完成,这帧数据就可以输入到D/A部分进行播放,并将输出缓冲清空,等待下一帧的解码数据输入。解码程序直到码流中再也找不到一帧的同步头时,就完成这一音频流的解码。
MPEG音频解码系统设计
     MPEG音频解码器的解码算法完全由DSP芯片实现,其控制部分用 CPLD实现。电路的整体设计与开发需要综合考虑前面两部分程序算法接口内容,可以在进行详细程序设计的基础上进行。这样,可以把MPEG音频解码器的开发工作分为两大模块:MPEG音频解码程序DSP实现,即软件设计,以及CPLD控制程序开发和电路板设计部分,即硬件设计。各个模块的开发工作针对该开发模块的特点进行。MPEG音频解码系统开发从模块上可以划分为硬件开发和软件开发两个部分。软件主要实现MPEG音频解码算法,硬件实现存储器访问控制、MPEG音频文件播放控制以及电源供给等功能。系统总体的功能结构如图1所示。
    软件系统设计方案是用DSP软件实现MPEG音频解码算**能,并完成相应的接口访问功能,软件功能见图2所示。

     通过分析,我们可以看出使用DSP作为MPEG音频解码系统的核心芯片,并辅助相应的扩展功能模块,就能够方便地实现一个独立的解码系统。这样的系统还能够方便地通过修改DSP中的程序进行系统升级。
     系统实现的框图见图3,该框图为MPEG音频解码系统的基本组成部分,在图中与计算机的接口芯片采用USB接口芯片,通过USB接口将 MPEG等格式的音频流下载到FLASH存储器中。除了用于存储音乐的FLASH之外,还应有存储MPEG音频解码程序及其所用码表的FLASH存储器,这种FLASH的速度要求比较快,容量不必很大,一般256K就可以。如果使用ADSP2181,因为其内部RAM只有16k,那么片外扩展RAM是必要的。
    在一般情况下,该系统可以通过其USB接口借助计算机从因特网上下载音频文件,并将这些文件存储到FLASH**棒中。当听音乐的时候,启动该系统的解码部分,将存于FLASH中的DSP解码程序加载到DSP中的内部RAM中,DSP开始运行解码程序,从存储音乐的FLASH中读取要解码音频流,在这种情况下,ADSP2181具有的6通道DMA控制器为系统的设计带来了很大的便利。ADSP2181在处理器全速运行的情况下可以自动完成 DMA口的接收和发送数据,而不需要处理器的干预。利用这个特点,可以通过DMA口来实现ADDSP2181读入和读出数据。将解码后的音频流经过D/A 后输出到耳机,就可以听到MPEG音频解码后的音乐了。这个系统的优点在于可以根据音频技术的发展,加入新的DSP解码程序就可以满足升级的需要。
MPEG音频解码算法的DSP设计和优化
1. 程序空间和数据空间的安排和优化
     MP3 解码程序所需的程序区空间约为24KB,所需存储变量的空间约为10KB,而其在解码中所需要的各种码表和参数所需要的存储空间约为10KB,因为在 MP3解码中生成和变换的数据量比较大,所以需要比较大的堆栈段,经过多次测试和比较,其所需空间的大小至少为10KB。另外,在程序运行时还要考虑其所需要的动态空间的大小。所以根据以上的要求就可以编写该程序的CMD文件。
     在ADSP2181的软件仿真器下运行该程序,在该仿真器下给出可以利用的资源如下:
a. 可以映射到程序区地址范围和存储器类型
(0x80到0x2000):/双口RAM/
(0x2000到0x8000):/单口RAM,SARAMl/
(0x8000:到0x10000):/外部扩展RAM和ROM/
(0x18000到0x20000):/单口RAM,SARAM2/
b. 可以映射到数据区地址范围和存储器类型
(0x0到0x60):/内存寄存器/
(0x60到0x2000):/双口RAM/
(0x2000到0x8000):/单口RAM,SARAMl/
(0x8000到0x10000):/外部扩展RAM和ROM/

    将DSP设置于微处理器模式,并使OVLY为1,编写CMD文件。如下所示:
                  MEMORY
                  {
                  PAGE 0: DRAM (RWI) :0=0x0080, 1=0x0500
                  PROG (RWXI) :0=0x18000, l=0x8000
                  PAGE 1: DATAl (RW) :0=0x580, l=0x500
                  RAMl (RW) :0=0xa80, l=0x580
                  RAM2 (RW) :0=0xl000, l=0x 1000
                  DATA2 (RW) :0=0x2000, 1=0x6000
                  DA'I'A (RW) : 0=0x 8000, 1=0x8000
                  }
                  SECTIONS
                  {
                  .text :>PROG PAGE 0
                  .cinit :>DRAM PAGE 0
                  .cio :>DRAM PAGE 0
                  .switch :>DRAM PAGE 0
                  .bss :>DATA PAGE 1
                  .const : >DATA1 PAGE 1
                  .sysmem :>DATA PAGE 1
                  .stack :>DATA2 PAGE 1
                  .input : fill=0x00,>RAMl PACE 1,align(256)
                  }

2.解码程序各个模块计算量的优化
     在进行MPEG音频解码之前,有必要做一些准备工作:
a. 在数据空间划分大约4.5KB的空间,将在霍夫曼解码中所用的34个码表写入,这部分数据地址可以映射到片外扩展的FLASH ROM中去;
b. 可以将在IMDCT模块中的正弦表和窗函数表写入到片外扩展的FLASH ROM中,因为这些数据都是浮点的,用DSP实时生成比较费时;
c. 片外扩展FLASH ROM中还应该有一个4KB的码表用以存储用于子带合成滤波器组的参数,这些数据都是正弦浮点表示,用查表的方式来得到其值是比较快的一种方法。
    做完这些工作后就可以进行解码。在解码的各个模块中计算量主要集中在反量化采样、 IMDCT和子带合成滤波模块,并且以后两者的计算量为最大。以下将说明在这三个模块中如何简化计算量:
反量化采样模块
     在这个模块中涉及较多的是幂指数运算,并且幂指数一般不是整数。如果直接使用 C语言所带的POWER函数,那么汇编的代码太长。对其优化的办法是观察其计算公式,因为公式中所取的各个变量的取值个数是有限的,所以其计算结果也就是可数的,因此可以预先计算出这些结果,编成一个表格,根据实际的变量的选取来作为查表的索引。
IMDCT模块
     在这个模块中主要涉及到两个问题,一是找到一种快速方法来实现求余算法,二是如何快速实现大量的乘累加计算。对于前者,可以使用如下语句来代替求余函数:
                  n1=2*p+19;
                  n2=2*m+l;
                  n=_smpy(nl,n2);
                  j=n/144;
                  n=n-144*j
     这样做可以较大幅度地提高计算速度。对于后者,因为在DSP中有专用的汇编指令来实现乘法累加功能,理论上对定点的乘法累加计算速度比较快。但是在本程序中参加乘法累加运算的都至少是单精度的浮点数,其运算速度比较慢。因此,有必要将浮点转定点运算,因为在MPEG音频流中的数据都是16位定点数据,可以确定其值的取值范围,可以将用于乘法累加运算的数据乘以一个比较大的系数,通过舍入运算使其值变为整型,利用一个字16位比特可以用32,768到 32,767之间的整数来表示这些数据。这样一来就可以利用在CCS中所提供的INTRISIC函数库中的快速运算指令。
    但是,在以上所说的过程中需要注意防止乘以较大系数后溢出问题,因为加法器是40 位,乘法器是17位乘17位,所以乘法累加的中间结果是不会出现溢出和误差,因此经过放大后的乘累加结果最后再除以放大系数仍然可以用一个字来表示。这样的处理使程序结构变复杂,并且带来一定的舍入噪声。由于是采用的16位量化,引入的舍入噪声影响不大。而使用INTRISIC函数库中的快速运算指令,需要注意DSP的流水线指令操作,以免引起流水线冲突。
     子带合成模块 该模块主要涉及到乘法累加运算的简化。

相关帖子

沙发
捡漏王子| | 2012-7-4 21:28 | 只看该作者
学习了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1061

主题

11320

帖子

26

粉丝