多制式语音编解码算法的DSP设计实现
近二十年来,全球半导体产业的飞速发展带动相关的软件、硬件设计水平迅速提高,这些发展使得一大批性能优良的复杂的数字信号处理算法可以实时实现并在日常通信系统中得到广泛应用,极大地提高了现有通信系统的可靠性和效率。因此,研究语音处理技术并将其用基于DSP芯片硬件系统实现有着非常重要的现实意义和广阔的市场前景。本文介绍了语音编解码硬件平台的设计思路和编解码算法在硬件平台上的实现和优化过程,同时给出了硬件平台结构和低功耗设计思路。
1 平台中语音编解码算法简述 本文在TI C55x系列DSP上实现了0.3kbps至16kbps的多种不同速率的语音编解码算法。其中16kps速率采用连续可变增量调制(CVSD)的波形编码算法,8kps速率采用了ITU-T公布的G.729a标准算法。而低速率编解码采用了正弦激励线性预测(SELP)算法。SELP算法是建立在传统的线性预测模型的基础上,其中清音成分用白噪声拟合,浊音成分在每个谐波处用一个频率变化的正弦信号合成,整个激励的浊音部分由一组不同幅度的正弦叠加而成,这也是SELP模型不同于传统的线性预测的一个非常的重要方面,即激励信号采用分带混合正弦激励。
2 语音编解码算法在DSP数字处理芯片上的实现和优化 由于在DSP上运行的声码器必须要达到实时化的要求,而直接编译的C程序远无法达到。因此需要编写和优化C55x的汇编代码来提高声码器的运行效率。下面介绍几点在算法硬件实现过程中的关键技术:
2.1 C程序和汇编程序的混编,函数的调用和参数传递 把一个模块改写为汇编函数,然后在C程序或者汇编程序中调用它。在C55x的开发中,函数的调用机制是这样的:首先记录下函数传递来的参数,和返回地址SP向低位移。然后再在堆栈中开出本地变量常量所需要的空间,SP再次向低位移。 (1)汇编函数的声明:在汇编函数中定义的函数如果要想在C代码中被调用,必须用.global语句加以声明,这样,对象或函数被定义为外部的(external)。比如: .global _Rem_Dc _Rem_Dc: …… (2)参数传递:在函数调用的过程中,C代码传来的参数按照以下规则存放在特定的寄存器中:即16或23位的数据指针,先后存放在(X)AR0-(X)AR4中。16位的数据,先后存放在T0,T1,AR0-AR4中,32位的数据,先后存放在AC0,AC1和AC2中。如果参数个数超过寄存器个数,则存放在堆栈中。同时,函数的返回值如果是短整型(short)则存放在T0中,如果是长整型(long)则存放在AC0中,如果是指针则存放在(X)AR0中。 例如: ①int fn(int i1, long l2, int *p3); 则fn->T0; il->T0, l2->AC0, p3->AR0 ②long fn(int *p1, int i2, int i3, int i4); 则fn->AC0, p1->AR0, i2->T0, i3->T1, i4->AR1 ③void fn(long l1, long l2, long l3, long l4, int i5); 则l1->AC0, l2->AC1, l3->AC2, l4->堆栈, i5->T0 ④void fn(long l1, long l2, long l3, int *p4, int *p5, int *p6, int *p7, int *p8, int i9, int i10); 则l1->AC0,l2->AC1,l3->AC2,p4->AR0,p5->AR1, p6->AR2, p7->AR3, p8->AR4, i9->T0,i10->T1 2.2 标志位的设置 标志位是DSP芯片在计算时设置一些位置。它们存放在ST0_55~ST3_55中,在运算中主要用到的几个有: FRCT,当其值等于1时,乘法运算的结果将左移一位。等于零时,运算结果不变。 SATD,当其值等于1时,运算发生溢出时作饱和处理 SXMD,当其值等于1时,输入操作数有符号扩展 SMUL,当其值等于1时,饱和模式开 他们分别存储在ST1_55和ST3_55寄存器的位置如图1所示:
图1 C55x DSP关键标志位在寄存器中的位置 这几个操作位的设置不对的话,会出现运算结果的错误。所以要根据程序的需要正确设置操作位,同时要在程序的前后保护和还原其初值。 psh *(ST1_55) psh *(ST3_55) …… pop *(ST3_55) pop *(ST1_55)
3 语音编解码硬件平台简述 本文设计的多模式语音编解码系统基于C55x系列DSP和MCU的双处理器设计,主芯片采用了TI公司的TMS320VC5510A数字信号处理器。其时钟周期最高为200MHz。拥有160KWord片上RAM(其中包括8块4KWord的DARAM和32块4KWord的SARAM)、16KWord片上ROM、8MWord的最大扩展寻址能力。微控制器(MCU)选用TI公司的MSP430F149,主要完成系统启动,电源管理,状态监控,DSP程序加载,声码器二进制码流位置重排等功能,并和DSP配合实现系统级加密机制。另外,硬件平台的音频编解码芯片选用TLV320AIC10,而程序存储部分采用的是SST39VF160 Flash,容量为1MWord,用来储存程序和数据。本硬件平台的框架结构图如图2所示。
图2 多速率语音编解码系统硬件平台框架结构图
4 低功耗设计 在数字集成电路设计中,CMOS电路的静态功耗很低,与其动态功耗相比基本可以忽略不计,故暂不考虑。
4.1 选用有可变电压和多电压的器件 首先在文中的系统中,选用的单片机芯片TI公司的MSP430系列MCU是一款功耗相当低的器件,供电电压1.8V~3.6V,运行模式下功耗280μA/MHz,待机模式下功耗1.6μA/MHz,禁用模式下功耗0.1μA/MHz。其次选用的DSP芯片TI的C5510 DSP采用两种驱动电压,内核电压1.6V,I/O电压3.3V,根据(1)式,IC器件的功耗和供电电压的平方成正比,1.6V供电的器件比3.3V供电器件能降低一半以上的功耗。IC设计中通常都将降低电压作为控制功耗的最直接的手段,通过采用低电压供电的DSP,既能有效地降低内核动态功耗,还能兼顾I/O的电平兼容性。
4.2动态功耗管理 PCM编解码芯片TLV320AIC11可以单独将A/D或D/A部分禁用。当话筒PTT没有按下时,表示没有话音输入,此时可以将A/D部分置为IDLE状态。同样的,当MODEM的CD信号为高时,表示没有有效的数字码流输入声码器,故在此时可以将D/A部分设为IDLE状态。通过将该芯片配置成低功耗模式,降低了系统的功耗。另外,C5510 DSP芯片内部划出了五个独立的IDLE域,分别负责CPU、DMA、CACHE、外设、时钟生成器、EMIF接口的配置。每个域可以独立地将该域管辖的多个部件设置成活动模式或IDLE模式以此降低DSP的功耗。针对本文设计,由于没有使用到DMA、CACHE、时钟生成器三个域中的外设,故将这三个域设置成了IDLE模式。EMIF域在DSP和MSP交换数据(为了调整发送和接收的比特流)时才被置为活动,其他时候被置为IDLE。通过这样的设置,更加有效地控制了整个系统的运算功耗。
4.3动态频率控制 根据(1)式,IC器件的功耗和频率成正比,因此,将IC器件的频率控制在刚刚好满足运算处理要求的情况,可以大大减小系统功耗。这种方法的关键是算法运算量的大小,动态的调整芯片的运行频率,从而达到节省功耗的目的。在本文设计的平台上运行的六种速率的低速率语音编解码算法中,600bps、1200bps、2400bps、8000bps、16kbps的峰值运算量分别为37.4MIPS、59.2MIPS、44.8MIPS、18.6MIPS、<1MIPS,因此将DSP的工作频率分别设置在40.096MHz、65.536MHz、49.152MHz、24.576MHz。这样处理能够很有效地降低DSP的内核功耗,最大限度地有效利用运算资源。
通过以上几个方面的优化设计,我们达到了应用场合对功耗的要求。表1是本系统在不同运行模式下的功耗统计。
表1 不同模式下DSP功耗
工作方式 | 功耗 | 全速运行(80MHz) | 521.4mW | 低速运行(2MHz) | 264mW | 低速运行/DSP外设休眠 | 214.5mW | 低速运行/DSP外设休眠/外围芯片休眠 | 155.1mW |
5 小结 本文中介绍了针对语音编解码算法在TI C55x系列DSP上的实现方法。结合作者在实际开发过程中的经验与体会总结了编写汇编程序中的主要技巧。目前C55x的高性能低功耗特点能大幅度提高便携式设备的处理能力和电池的使用寿命,将会广泛应用于语音处理的各个领域。
|