分绍了G.723.1标准的DSP代码优化

g.723.1是删组织于 1996年推出的一种低码率的语音编码算法标准,也是目前该组织颁布的语音压缩标准中码率最低的一种标准。
g.723.1主要用于对语音及其它多媒体声音信号的压缩。
2 g.723.1算法的复杂度分析
将 g.723.1移植到tms320c64xx后,就可借助ti集成开发工具ccs(code composer studio)的profile功能来评估其各个子程序或函数的执行运算量,从而把程序的优化集中在对程序性能影响最大的代码上去。
通过分析可以看出,在g.723.1的编解码算法中,码本搜索所花费的运算量是比较大的,如 find_best(),find_fcbk(),find_acbk():另外,在lpc分析和lsp参数的计算上也有运算量比较大的,如 comp_lpc(),lsp_qnt(),lsp_svq()。
3 代码的优化
代码优化的工作有两大目的:一是执行速度提高,实现实时;二是尽量不扩大程序体积(code size),使之在内存允许的范围内。显然,两者存在一定的矛盾,当今超大规模集成电路的发展使ram资源不再是系统的瓶颈,因此该部分工作的主要任务是怎样提高执行速度。代码的优化工作主要在ccs环境中进行。优化的原则是要充分考虑c64xx处理器超长指令字、多个运算单元和深度流水线的结构特点,以及避免过多的读写内存指令和程序转移指令,充分发挥其强大的运算能力。具体方法包括(次序有先后):
3.1基本运算集的优化
g.723.1 算法程序是用定点运算完成浮点运算,为了防止定点运算时可能溢出,许多运算需要进行饱和判断,为此程序专门定义了基本运算集,实现诸如饱和加法、饱和乘法、除法和移位等操作。在程序中这些操作调用相当频繁,经ccs的profile工具测试,基本运算函数集的调用占用了95%以上的cpu时间。因此,我们要从基本运算集的优化开始。在熟悉掌握c64xx指令集的前提下,分析基本运算集中各个函数完成的悉掌握c64xx指令集的前提下,分析基本运算集中各个函数完成的功能和对全局变量产生的影响,用c64xx指令取而代之或加以改编。其中包括对跳转和流水线的优化讨论、对乘积的饱和调整和全局变量 overflow的相关操作。
由于基本运算集以函数形式存在,两次跳转f函数的调用与返回1必不可少,将引起流水线的两次打断,表现为 12个指令周期的占用。将这嵝基本运算函数集改成宏的形式,即将基本运算内嵌(inline)至lj调用程序中,由此町以消除跳转和流水线打断带来的指令周期占用,提高执行速度。虽然这样做增加了代码长度,多占用了一些内存,但由于基本运算函数体积均较小,再经过一定的代码优化,在程序体积上的牺牲几乎町以忽略。
基本运算的函数定义在basic.c文件里面,如果能够对这些简单甬数进行内联指令(intrinsic)的优化,就能达到事半功倍的效果。内联指令是汇编指令的直接映射,具有很高的效率。与此同时带来的一个问题是溢出保护位overflow的判断,这是基本函数里用来标识溢出的全局变量,它的作用等同于csr(control status register)寄存器的sat(saturation)位,当数据溢出时,sat位被系统自动设置为1,所以编解码函数里对overflow的判断可以转化成对sat位的判断。引用csr寄存器时需要在最开始的时候声明extem cregister volatile ansigned int csr。
c64xx指令提供了饱和乘法指令smpy,实现1616位的乘法与饱和结果调整,其执行操作如下:
if(cond){
if((src 1*src2<<1)!=0x80000000)
dst=((src 1*src2)isram //将变量初值表放入内存
. far >sdram
.const>isram //将常数段放入内存
.pinit>sdram
. tin >sdram
.text>sdram
.test >isram
}
一 levmdm642bsl.lib //连接库文件
一levmdm642_edma_aic23.164 //连接驱动程序的库文件
一lc6xlx_edma_mcasp.j64 //连接串口mcasp的库文件
其中.test是笔者在c程序内用#pragma code_section或data_section自定义的段。
(2)高速缓冲寄存器 cache的使用
cache即高速缓存,是位于cpu和片内存储器之间的规模小速度快的存储器。cache的工作原理是保存cpu中最常用的数据。当cache中保存着cpu要读写的数据时,cpu直接访问cache。由于cache的速度与cpu相当,cpu能在零等待状态下迅速地实现数据存取。只有在cache中不舍有cpu所需的数据时cpu才去访问片内存储器。因此cache的有效利用对整个程序速度的提高有着举足轻重的作用。在主函数中加入以下代码,使cache使能:
cache_clean (cache_l2all,0,0}; //清除cache内原有内容
cache_setl2mode (cache_64kcache); //设置cache的大小为64k
cache_enablecaching (cache_emifa_ce00); //cache使能
添加以上代玛后,测试速度由原来的20帧/s提高到了400帧/s。提高了将近20倍。
5 结束语
本文详缁分绍了g.723.1标准的dsp代码优化工作,重点描述了代码优化的方法和本课题的创新点.对于算法中的一些函数提出了独创性改写方法。基于线性汇编的优化以及cache的有效利用使本课题的工作取得了显著成果,在没有降低音质的情况下,实现了dsp的语音实时编解码。
本文作者创新点:在对g.723.1的优化中,针对tms320dm 642 dsp系列芯片提出了一些有价值的新方法。例如:编写连接命令文件.cmd和高速缓冲寄存器cache的使用。这些创新点在不同程度上提高了代码的优化速度和执行效率,在语音编解码的dsp实时实现中起到了关键性作用。

TUV莱茵为希沃学习机W3颁发节律友好等四项认证
通过降低复杂性最大限度地提高数据中心的运营连续性
随着自动驾驶市场不断发展,无人驾驶叉车的发展前景如何
最小化热插拔控制器中的短路电流脉冲
全新30V MOSFET 的N沟道器件OptiMOS-T2
分绍了G.723.1标准的DSP代码优化
HMC463LH250集成AGC的低噪声放大器
常用电子元器件识别方法盘点
基于单片机与模糊PID控制的热水器温度智能控制设计
海信电视携手侯明昊致敬追光者,尽显光影之美
DDR4/LPDDR4硬核控制器I/O plannin的设计和实现
RFID应用于医疗消毒 为患者和医院提供更大方便
工程师必须要懂得C语言 如果不懂C语言该感到危机
STG宣布推出Trellix新业务 韩国KT选择是德科技5G设备测试解决方案
日本TDK发布了一款高性能单轴闭环MEMS加速度传感器
便利老年人日常交通出行:改进 “健康码”查验服务
噪音扬尘监测系统的产品特点有那些
小米6真机曝光?别被骗了,其实是3年前就发布的这部国产机!
MCU健壮性设计之模拟输入的特殊特性
AI企业快速发展对智能计算机需求井喷