G.723.1语音编码算法的DSP实现
时间:05-25
来源:互联网
点击:
2.3 DSP/BIOS的配置
将成功实现的算法移植到TI公司提供的TMS320C5416上,采用DSP/BIOS技术编程实现。DSP/BIOS配置工具主要是设置DSP/BIOS各个模块的参数和创建API调用对象[4]。用DSP/BIOS配置工具,对象可以被预先创建和设置,使用这种方法创建静态对象,不仅可以合理利用内存空间、减小代码长度、优化数据结构,还有利于程序编译前通过验证对象的属性预先发现错误。
3 程序优化
实时实现语音信号的编解码最基本的要求是编解一帧语音信号的时间要少于采集一帧语音信号的时间,即要求G.723.1的一帧语音编解码时间要少于30ms。对G.723.1标准算法进行时间评估时发现,一帧的运算量大概需要49 M个时钟周期,约为300 ms,这显然无法在TMS320C5416DSP上实时运行。因此有必要从多方面进行优化。
3.1 循环优化
G.723.1实现中的很多运算是在循环内完成的,在循环内部特别是嵌套较深的循环内部,减少一条指令可以大大降低程序的操作次数。固定码本搜索中为了确定四个脉冲的位置和幅度,用到了四重嵌套循环,每重循环8次,在最内层循环减少一条指令,整个程序就减少84=4096条指令。因此在G.723.1的实现过程中,尽量将内层循环的指令搬移到外层,外层循环的指令搬移到整个循环体外,从而缩短程序执行时间,满足实时性的要求。
此外,适当选择循环指令,如RPT(重复下条指令),RPTZ(累加器清零并重复下条指令)和RPTB(块重复指令)等,也能缩短循环时间。如RPT允许重复执行紧随其后的一条指令,由于要重复的指令只需要取指一次,与利用跳转指令BANZ进行循环相比,效率要高得多。特别是对于乘累加和数据传送多周期指令(MAC、MVDK 和MVPD等),在执行一次之后就变成了单周期指令,大大提高了执行效率。
3.2 使用内联函数
CCS提供的内联函数集中有一些常用的基本运算函数,如加、饱和加、减、饱和减、长数乘等。这些函数可以很方便地被调用,就像调用C函数一样,只要在函数名前加一个“_”,例如_L_SUB(a,b)。这些内联函数是用汇编语句编写的,编译时C编译器将这些内联函数用对应的汇编语句代替,所以执行效率很高。在程序的开始部分头文件中,用#include“intrindefs.h”,代替#include“basic.h”,就是把文件“basic.c”从工程中去掉,从而实现对“basic.c”中许多基本运算函数的优化,提高了执行效率。
3.3 使用宏定义
在G.723.1标准的定点C程序中,所有基本运算都以调用子函数的形式执行。这样做对程序的规范化设计有好处,同时也在很大程度上降低了程序的运算效率。将基本运算由子函数调用改为宏定义可以去掉函数调用的开销,加快运算速度,程序的运算效率明显提高。这种优化方式会带来代码量的增大,但还是在芯片存储空间的容许范围内。
3.4 合理使用流水线操作
C54芯片具有6级深度的流水线,可以完成预取指、取指、译码、产生操作数地址、读取操作数和执行等6个操作,这就出现了指令的重叠。然而CPU总线、寄存器资源是有限的,当不同级别的流水线试图利用同一条总线或访问同一资源时,就可能发生时序上的冲突。如果流水线冲突,CPU自动通过指令延迟的方法解决,有些冲突指令延迟后可以避免,有些则不能避免,需要在指令中间加入NOP空指令才能解决。但这样消耗了额外的时钟周期。重新安排指令顺序有时可以避免冲突,提高程序执行效率,尤其是当NOP指令在循环内部时,可以节省不少的开销。分析程序编译后生成的汇编语言程序,观察分析是否可以进行优化。可以用创建相关图,重新分配运算单元和寄存器、创建排序表重新调整指令顺序等方法去掉NOP指令,同时避免流水线冲突。
3.5 优化效果
G.723.1语音编解码程序经过优化保证了该算法在DSP中的实时实现。G.723.1协议帧长30 ms,另外有7.5 ms的前瞻,故总帧长为37.5ms。在硬件仿真模式下对整个程序运行进行测试,结果表明,一帧语音信号的编解码在5.3 kb/s模式下需要3 402 338clocks,约20.3 ms;在6.3 kb/s模式下需要5 134 901 clocks,约22.83 ms,均低于算法要求的30ms,在TMS320VC5416上最终完成了G.723.1标准的实时实现。其中各主要模块和主要代码段在优化前后占用周期和空间的对比分别如表1和表2所示。
信噪比是衡量语音编解码质量的客观标准,计算时常用长时信噪比和短时(分段)信噪比两种准则。短时(分段)信噪比采用分段(通常是10ms~30ms)的方法来分别计算每一段语音信号的信噪比,因此很适合反映量化器对不同电平输入段的量化质量。本文采用短时(分段)信噪比作为衡量标准。
设每段有N个语音采样点,则第m段的分段信噪比定义为:
x(n)是原始信号,y(n)是输出信号,N是帧长,M是帧的总数。
本文对G.723.1标准进行测试,就图3所示语音信号计算其短时信噪比。图中总帧数150帧,帧长为240个采样点,按照上式计算SNR=13.56dB。因此可知G.723.1有较高的短时信噪比,语音编解码质量较好,得到的语音信号比较清晰。
将成功实现的算法移植到TI公司提供的TMS320C5416上,采用DSP/BIOS技术编程实现。DSP/BIOS配置工具主要是设置DSP/BIOS各个模块的参数和创建API调用对象[4]。用DSP/BIOS配置工具,对象可以被预先创建和设置,使用这种方法创建静态对象,不仅可以合理利用内存空间、减小代码长度、优化数据结构,还有利于程序编译前通过验证对象的属性预先发现错误。
3 程序优化
实时实现语音信号的编解码最基本的要求是编解一帧语音信号的时间要少于采集一帧语音信号的时间,即要求G.723.1的一帧语音编解码时间要少于30ms。对G.723.1标准算法进行时间评估时发现,一帧的运算量大概需要49 M个时钟周期,约为300 ms,这显然无法在TMS320C5416DSP上实时运行。因此有必要从多方面进行优化。
3.1 循环优化
G.723.1实现中的很多运算是在循环内完成的,在循环内部特别是嵌套较深的循环内部,减少一条指令可以大大降低程序的操作次数。固定码本搜索中为了确定四个脉冲的位置和幅度,用到了四重嵌套循环,每重循环8次,在最内层循环减少一条指令,整个程序就减少84=4096条指令。因此在G.723.1的实现过程中,尽量将内层循环的指令搬移到外层,外层循环的指令搬移到整个循环体外,从而缩短程序执行时间,满足实时性的要求。
此外,适当选择循环指令,如RPT(重复下条指令),RPTZ(累加器清零并重复下条指令)和RPTB(块重复指令)等,也能缩短循环时间。如RPT允许重复执行紧随其后的一条指令,由于要重复的指令只需要取指一次,与利用跳转指令BANZ进行循环相比,效率要高得多。特别是对于乘累加和数据传送多周期指令(MAC、MVDK 和MVPD等),在执行一次之后就变成了单周期指令,大大提高了执行效率。
3.2 使用内联函数
CCS提供的内联函数集中有一些常用的基本运算函数,如加、饱和加、减、饱和减、长数乘等。这些函数可以很方便地被调用,就像调用C函数一样,只要在函数名前加一个“_”,例如_L_SUB(a,b)。这些内联函数是用汇编语句编写的,编译时C编译器将这些内联函数用对应的汇编语句代替,所以执行效率很高。在程序的开始部分头文件中,用#include“intrindefs.h”,代替#include“basic.h”,就是把文件“basic.c”从工程中去掉,从而实现对“basic.c”中许多基本运算函数的优化,提高了执行效率。
3.3 使用宏定义
在G.723.1标准的定点C程序中,所有基本运算都以调用子函数的形式执行。这样做对程序的规范化设计有好处,同时也在很大程度上降低了程序的运算效率。将基本运算由子函数调用改为宏定义可以去掉函数调用的开销,加快运算速度,程序的运算效率明显提高。这种优化方式会带来代码量的增大,但还是在芯片存储空间的容许范围内。
3.4 合理使用流水线操作
C54芯片具有6级深度的流水线,可以完成预取指、取指、译码、产生操作数地址、读取操作数和执行等6个操作,这就出现了指令的重叠。然而CPU总线、寄存器资源是有限的,当不同级别的流水线试图利用同一条总线或访问同一资源时,就可能发生时序上的冲突。如果流水线冲突,CPU自动通过指令延迟的方法解决,有些冲突指令延迟后可以避免,有些则不能避免,需要在指令中间加入NOP空指令才能解决。但这样消耗了额外的时钟周期。重新安排指令顺序有时可以避免冲突,提高程序执行效率,尤其是当NOP指令在循环内部时,可以节省不少的开销。分析程序编译后生成的汇编语言程序,观察分析是否可以进行优化。可以用创建相关图,重新分配运算单元和寄存器、创建排序表重新调整指令顺序等方法去掉NOP指令,同时避免流水线冲突。
3.5 优化效果
G.723.1语音编解码程序经过优化保证了该算法在DSP中的实时实现。G.723.1协议帧长30 ms,另外有7.5 ms的前瞻,故总帧长为37.5ms。在硬件仿真模式下对整个程序运行进行测试,结果表明,一帧语音信号的编解码在5.3 kb/s模式下需要3 402 338clocks,约20.3 ms;在6.3 kb/s模式下需要5 134 901 clocks,约22.83 ms,均低于算法要求的30ms,在TMS320VC5416上最终完成了G.723.1标准的实时实现。其中各主要模块和主要代码段在优化前后占用周期和空间的对比分别如表1和表2所示。
信噪比是衡量语音编解码质量的客观标准,计算时常用长时信噪比和短时(分段)信噪比两种准则。短时(分段)信噪比采用分段(通常是10ms~30ms)的方法来分别计算每一段语音信号的信噪比,因此很适合反映量化器对不同电平输入段的量化质量。本文采用短时(分段)信噪比作为衡量标准。
设每段有N个语音采样点,则第m段的分段信噪比定义为:
x(n)是原始信号,y(n)是输出信号,N是帧长,M是帧的总数。
本文对G.723.1标准进行测试,就图3所示语音信号计算其短时信噪比。图中总帧数150帧,帧长为240个采样点,按照上式计算SNR=13.56dB。因此可知G.723.1有较高的短时信噪比,语音编解码质量较好,得到的语音信号比较清晰。
- H.264在动中通应急图像传输中的应用(10-27)
- 基于FPGA的并行可变长解码器的实现技术 (10-01)
- CDMA2000 1x增强型技术:将语音容量增至4倍(09-23)
- GPS软件接收机信号实时接收与传输技术(02-22)
- 利用FPGA实现HDB3编解码功能(03-16)
- 无线Mesh网视频监控系统的研究与开发(03-24)