定点DSP在数字语音通信中的应用

发布时间:2005-03-20 作者:沈漫源Shen Manyuan 徐佩霞Xu Peixia 阅读量:

自从1982年TMS32010 DSP芯片问世以来,德州仪器公司已相继推出了C1X、C2X、C5X、C54X等定点DSP和C3X、C4X等浮点DSP以及TMS320C8X多处理器DSP。DSP独特的系统体系结构、硬件密集型方案和灵活的处理指令,使其具备强大的数字处理功能,在数字语音通信和多媒体通信中得到了广泛应用。其中,C54X系列是定点DSP中的最新一代芯片,性能尤为突出。

 

 

1 C54X定点DSP系列的体系结构和特点

 

    C54X DSP系列包括C541、C542、C543和C548等几种芯片,它们有共同的CPU结构,但片内存储器和外设接口不同。同前几代芯片相比,它们不但增强了处理能力(达50MIPS或66MIPS的运算能力),而且降低了功耗(可提供3种掉电低功耗工作方式)。以下简要介绍其体系结构,它包括:

(1)总线结构

    C54X的主要总线分为数据总线、地址总线两种,每种有4组,共8组总线:程序总线(PB),3组数据总线:CB、DB和EB,以及它们的地址总线:PAB、CAB、DAB、EAB。C54X能够在一个周期内同时生成两个数据地址,从而能够同时读取两个操作数。

(2)片内存储器

    C54X存储器包括3部分地址空间:程序存储器、数据存储器,以及I/O地址空间。存储器包括RAM和ROM。RAM有两类:在一个周期内能访问两次的DRAM和一个周期内访问一次的SRAM。以C548为例,其片内包含2kbyte的程序ROM、8kbyte的DRAM和24kbyte的SRAM。大量的片内存储器使复杂的语音压缩编码算法能全部载入片内运行。这既提高了系统的性能,也简化了硬件设计和接口。

(3)CPU

    C54X系列的CPU包含一个40位的算术逻辑部件(ALU)、两个40位的累加器、一个桶状移位器、一个17×17位的乘法器和一个40位专用的非流水线累加器,以及比较、选择、存储单元(用于Viterbi译码)和数据地址、程序地址产生单元。C54X能够在一个时钟周期内完成两个32位操作数的算术运算。

(4)片上I/O接口

    C54X DSP在片上集成了以下外围接口:串行通信口(同步串口、带缓冲串口、时分复用串口)、可编程定时器、标志输入/输出管脚、主从处理器接口(HPI)、可编程等待状态产生器。

    C54X系列芯片的体系结构有高度的并行性,能够在一个指令周期中,产生下一条指令地址,取指后修改两个地址指针,执行一个计算,并通过串口接收或发送数据。而为了充分利用程序的并行性,该系列指令集中有专门指令,特别适于滤波、卷积、相关等数字信号处理方面的应用。

 

 

 

2 应用C54X芯片实时实现语音编解码系统

 

    G.729协议是ITU-T制定的8kbit/s语音压缩编码协议,由于G.729在中低比特率提供了令人满意的语音质量,再加上其优良的抗噪声性能,这就使G.729协议在数字移动通信、数字卫星通信和多媒体通信等方面有着广泛的应用前景。

    我们已在单片C548 DSP上实现了G.729的编解码功能,为全双工低比特率语音通信提供了实用模块。C548是系统中唯一的CPU,它负责启动时程序的装载、语音数据的输入输出以及G.729的压缩编解码等等,该系统的原理。

    仅需3片芯片:EPROM、CODEC和C548就能够实现全双工的G.729语音压缩编解码。C548提供的强大的系统接口能力,使硬件设计十分简洁。C548在启动时将EPROM中的程序装入C548内部的程序和数据存储器中,并从第一条指令开始执行。C548通过串口与CODEC接口,负责数模转换。

    系统软件主要包括两大部分:G.729编解码模块以及调度和接口模块。下面就这两部分进一步给予说明:

(1)编解码模块

    该模块充分利用C54X的优良性能,是实现ITU-T G.729全部功能的DSP核心模块,已单独形成一个C54X系列库,可与其它C54X系列模块相连。

(2)调度和接口模块

    在该模块中,我们采用了双缓冲结构,以满足实时编解码的需要。程序中设置了input_buf,out-put_buf,code_buf和decode_buf 4个缓冲区。其中input_buf为语音数据存放的缓冲区,每采集满80个样点(10ms)数据时,把它复制到编码缓冲区(code_buf)中,并调用编码程序。decode_buf为解码缓冲区,当解码器利用编码器的输出得到重建语音时,解码结果存放在该缓冲区内。output_buf为D/A转换的缓冲区,把缓冲区内数据按照8kHz的频率传送至D/A转换输出。当output_buf中的所有数据用尽时,把当前的decode_buf中的重建语音复制到output_buf中去。由于D/A转换也是按照8kHz频率进行的,为了避免对D/A转换作额外的定时,考虑到语音信号的A/D转换也是按照8kHz的频率进行的,因而可以把D/A转换安排在A/D转换的中断服务程序中进行,利用A/D转换中断来对D/A转换定时。这一方面可以使定时更加精确,另一方面也可以减小为D/A转换单独设计一个定时器所带来的复杂度。

    在程序运行时,首先初始化C54X的寄存器、指针和一些变量、数组的值,并且建立A/D中断服务程序。我们在程序中设置了两个标志:input_ready和out-put_ready。其中input_ready指示当前采样数据缓冲区(input_buf)是否可用,output_ready表示当前解码缓冲区(decode_buf)是否可用。C54X串口设置为Auto Buffer方式,由C54X自动负责接收和发送数据,串口缓冲长度设置为帧长。每接收到一帧数据,串口就产生中断。在中断服务程序中,设置input_ready为1,并把采集的数据从A/D缓冲区(input_buf)复制到编码缓冲区(code_buf),每发送完一帧数据时,串口也产生中断。在中断服务程序中,判断若out-put_ready为1,把解码缓冲区(decode_buf)中的数据复制到D/A缓冲区(output_buf),同时清除output_ready标志。在主程序中,循环判断input_ready是否为1,如果为1,清除标志,然后调用编码过程,再调用解码过程,解码结束之后设置output_ready为1,表示解码缓冲区数据可用。

 

 

 

3 定点实现的关键技术

 

在应用定点DSP的实时实现中,应注意如下问题:

    (1)程序指令的精简

    语音压缩编解码系统通常都是实时工作的,程序的复杂度不能超过系统硬件能提供的上限,否则将无法正常地编解码。以G.729协议为例,语音采样频率为8kHz,编解码时帧长为80个样点,也即10ms。而C54X的运算速度为50MIPS(MIPS为每秒百万条指令)。如果完成一帧的编解码所需的指令数超过50万条,系统将无法及时处理完一帧的数据,这会导致系统崩溃。而且,语音数据经常是多路处理,程序的复杂度越低,每一芯片能处理的语音路数越多,就更利于降低系统复杂度,可见精简指令是十分重要的。

由于语音处理程序本身的特点,相乘后累加这一运算形式出现的频率很高,因此通常出现在循环体内部。C54X提供了许多双操作数间接寻址指令,如果能够巧妙运用,在一个指令周期内,同时取两个操作数,并且相乘累加,将能大大减少指令数。如在计算卷积的程序片段中,应用指令MAC*AR2+,*AR3+,A,就在循环体内减少了1条指令,总共可减少N(N-1)/2条指令。当N较大时,是非常可观的。运用双操作数指令时必须注意数据的存放,为了能同时取两个操作数,如果它们都在SRAM中,则它们不能在一个内存块中。如果有一个操作数在DRAM中,就容易满足。这就要求程序设计时尽量将数据放在DRAM中。

    程序设计时要求尽量减少循环内部的指令数,能够在循环外部进行的操作,尽量在循环外部进行。其中尤其值得注意的是,应充分利用C54X提供的自动修改地址指针的功能,在进入循环之前就计算好地址指针的初值,然后由处理器自动对地址指针作修改,而不应该在循环内部再通过计算得到地址指针的值,否则会大大增加指令条数。

    (2)数据在DSP中的安排

    在DSP中,没有通常C语言中的全局变量、局部变量存储的区别。在DSP编程中只要定义了的变量,连接程序就会分配数据空间。如果像C语言编程那样定义局部变量,就会浪费大量存储空间。想要节省存储空间,就要求我们自己安排好这些数据的存放,这在存储空间紧张的定点DSP中更显得重要。

    为此,可以开辟一片公用的数据存储空间,每个模块的局部变量都在这个存储空间存放,而不是新分配存储单元。这可以通过变量的替换实现:将模块内的局部变量用.asg伪指令替换为公用的数据存储单元。这样不但可以节省存储空间,而且可以使数据都分配在DRAM中,有利于并行执行。另外,这样也可以使数据尽量都集中在一个页中,避免频繁地改变数据页指针(DP),也有利于程序精简指令。这种方法与通过堆栈管理数据相比,其优点是程序可读性强,并且不须增加管理堆栈之类的额外开支。采用该方法需要注意的是,当模块相互调用时,子模块一定不能破坏父模块的局部变量。

    (3)数据精度的处理

    语音处理程序通常都需要进行浮点运算,为了能在定点DSP上实现,必须用定点数表示浮点数。对于浮点数,可以根据精度的不同酌情处理。在精度要求比较高的地方,可以将计算的中间变量采用32位来表示,一部分表示整数部分,另一部分表示小数部分。在精度要求较低的地方,用16位表示就足够了。这样既可以保证程序的精度,又不致于增加太大的运算量。在DSP定点实现之前,最好先将浮点算法用定点的高级语言实现,以检验定点实现的精度是否满足要求,直接用DSP实现不但难度较高,而且不易于调试。

    (4)C54X DSP的一些特殊考虑

    第一是关于流水线访问冲突的问题。C54X使用6级流水线,可以在6级流水线上完成预取指、取指、译码、产生操作数地址、读取操作数、执行等6个操作,这就实现了指令的重叠。但CPU的资源是有限的,当流水线的不同阶段都试图访问某一资源时,就有可能发生冲突。一部分流水线冲突是CPU通过延迟指令的执行自动解决的,另一部分冲突必须由使用者避免。因此必须合理使用指令,否则会导致错误的执行结果。尤其值得注意的是辅助寄存器的更新指令,在紧接的两个指令内不应连续使用该辅助寄存器。另外,通过使用延迟跳转指令,可以减少执行跳转指令所需的实际周期数,有利于提高程序的效率。

    第二是辅助寄存器的合理使用问题。C54X有8个辅助寄存器(AR0~AR7)。对C54X来说,辅助寄存器的间接寻址是一个非常有效而常用的寻址方式。另外,循环指令RPTB也不允许嵌套,当有循环嵌套时,最方便的方法就是用指令BANZ,这也需要用到辅助寄存器。因此,对辅助寄存器作统筹安排是十分必要的。

 

 

4 结束语

 

    根据我们目前所做的工作,一片C548至少可以完成两路G.729

算法的全双工编解码。进一步优化程序和精简指令,还可望实现更多路的通信。由此可见,DSP芯片运算性能强、接口方便、利于集成,在数字语音保密通信、低比特率多媒体通信和数字移动通信等方面有广泛的应用前景。□

 

(收稿日期:1997-12-29)

 

[摘要] 本文介绍了新一代定点DSP芯片——TMS320C54x的体系结构和特点,及应用单片C548实现高质量、低延时的G.729协议的语音编码算法,并分析了定点DSP在实时实现数字语音通信中的一些关键技术。

[关键词] DSP芯片 G.729算法 语音编解码

[Abstract] The architecture and charac-teristics of TMS320C54x that is the new generation of fixed point DSP chips are introduced in this paper.It is shown that the speech coding algorithm G.729 charac-terized by high quality and low delay can be realized by using a single chip C548.Some key tech-nologies which should be con-cerned in using the fixed point DSP to realize relevant speech coding algorithms in real time are also analyzed.

[Keywords] DSP chip Algorithm G.729 Speech coding and decoding