资料介绍
1 引言
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,实现16“16位的乘法与饱和结果调整,其执行操作如下:
if(cond){
if((src 1*src2《《1)!=0x80000000)
dst=((src 1*src2)《《1);
else
dst=0x7ffffff;
}
else
nop;
将原指令中的乘法指令改为SMPY.就可以完成乘法和饱和调整两种计算,这样可以省去饱和调整3条指令。与此类似,其它的饱和运算,C64xx都提供了相应的指令实现,将普通运算指令替换为饱和运算指令,饱和结果调整部分的运算均可以省去。
3.2主程序的优化
主程序的优化手段主要采用了以下几种方法:
(1)使用内联函数(intrinsics)
内联函数是可直接映射为C64xx指令的特殊函数,它在指令前加上”_”表示。例如:
#define L_add(L_var1,L_var2) _sadd(L_var1,L_var2)
#define L_mult(var1,vat2) _smpy(var1,var2)
等,基本函数的内联优化需要对原函数的定义和内联指令都比较熟悉。
使用内联函数代替相应的C语句是一种非常简便高效的优化方法。如上面提到的饱和乘法,在C语句中。我们通常要使用两个嵌套的条件判断语句来检查结果是否溢出,而指令int_smpy(int a.int b) 则在完成乘b的运算后,再做一次饱和处理,这样一条DSP指令就可完成C语言中多条语句才能完成的计算,可以节省很多时钟周期。
(2)循环展开(loop—unrolling)
程序中的有很多的双重循环和多晕循环(比如代数码本搜索计算),由于C64xx优化器在优化时只在最内层循环中形成一个指令流水(最多可以达到8级流水),这样循环语句就不能充分利用软件流水线,而且对于内部循环次数较少的情况,消耗在prolog和eplog上的时钟周期也不可忽视。针对这种情况,一个有效的办法就是将双重或多重循环展开,降低循环次数。这样虽然代码长度增加了,但有更多的运算能够参加到pipeline中。由于减少了流水线排空和提高了功能单元的利用率,程序执行速度会大大提高。
(3)减少分支和调用指令,减少判断指令
程序中的分支、调用以及判断指令会引起程序的跳转,而每个跳转指令都有5个延迟间隙。因此延长了程序执行时间;另外,循环内跳转也会使软件流水受到阻塞,降低了代码执行效率。优化中,可以使用内嵌、合并判断语句来减少判断次数或用逻辑指令替代判断的方法尽可能的消除中断流水线指令带来的影响。
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,实现16“16位的乘法与饱和结果调整,其执行操作如下:
if(cond){
if((src 1*src2《《1)!=0x80000000)
dst=((src 1*src2)《《1);
else
dst=0x7ffffff;
}
else
nop;
将原指令中的乘法指令改为SMPY.就可以完成乘法和饱和调整两种计算,这样可以省去饱和调整3条指令。与此类似,其它的饱和运算,C64xx都提供了相应的指令实现,将普通运算指令替换为饱和运算指令,饱和结果调整部分的运算均可以省去。
3.2主程序的优化
主程序的优化手段主要采用了以下几种方法:
(1)使用内联函数(intrinsics)
内联函数是可直接映射为C64xx指令的特殊函数,它在指令前加上”_”表示。例如:
#define L_add(L_var1,L_var2) _sadd(L_var1,L_var2)
#define L_mult(var1,vat2) _smpy(var1,var2)
等,基本函数的内联优化需要对原函数的定义和内联指令都比较熟悉。
使用内联函数代替相应的C语句是一种非常简便高效的优化方法。如上面提到的饱和乘法,在C语句中。我们通常要使用两个嵌套的条件判断语句来检查结果是否溢出,而指令int_smpy(int a.int b) 则在完成乘b的运算后,再做一次饱和处理,这样一条DSP指令就可完成C语言中多条语句才能完成的计算,可以节省很多时钟周期。
(2)循环展开(loop—unrolling)
程序中的有很多的双重循环和多晕循环(比如代数码本搜索计算),由于C64xx优化器在优化时只在最内层循环中形成一个指令流水(最多可以达到8级流水),这样循环语句就不能充分利用软件流水线,而且对于内部循环次数较少的情况,消耗在prolog和eplog上的时钟周期也不可忽视。针对这种情况,一个有效的办法就是将双重或多重循环展开,降低循环次数。这样虽然代码长度增加了,但有更多的运算能够参加到pipeline中。由于减少了流水线排空和提高了功能单元的利用率,程序执行速度会大大提高。
(3)减少分支和调用指令,减少判断指令
程序中的分支、调用以及判断指令会引起程序的跳转,而每个跳转指令都有5个延迟间隙。因此延长了程序执行时间;另外,循环内跳转也会使软件流水受到阻塞,降低了代码执行效率。优化中,可以使用内嵌、合并判断语句来减少判断次数或用逻辑指令替代判断的方法尽可能的消除中断流水线指令带来的影响。
下载该资料的人也在下载
下载该资料的人还在阅读
更多 >
- PCM语音编解码及原理图下载 13次下载
- DSP芯片实现语音编解码技术的设计方案 18次下载
- 基于TMS320C6201的G.723.1多通道语音编解码分析 1次下载
- 多制式语音编解码算法的DSP设计 3次下载
- 详解G.723.1算法在DSP上的优化 0次下载
- 基于DSP的语音编解码算法G.723.1优化分析 0次下载
- 基于DSP的G.723.1语音编码算法实现方案分析 1次下载
- G.7xx语音编解码模块及在AD218X上的实现 0次下载
- 在DSP上G.729A算法的优化
- G.726语音编解码器在SoPC中的实现
- 三代移动通信变速率语音编解码AMR-WB+算法优化
- G7231算法在DSP上的优化
- G.726语音编解码器在SoPC中的实现
- 基于TMS320C6713的G.723.1语音编解码的实时实
- G.723.1 语音压缩算法的分析及DSP实现
- MAXQ3120在编解码应用中的应用 674次阅读
- 基于TMS320C6203 DSP芯片实现G.729ab声码器的应用方案 2874次阅读
- 新唐科技语音频段编解码器简介 2171次阅读
- SinoV-100AI单网口单FXS IAD语音网关详细参数介绍 2399次阅读
- 浅谈SinoV-200I 2FXS IAD语音网关 2138次阅读
- 浅析基于嵌入式DSP的流媒体解决方案 1160次阅读
- 详解DSP和FPGA在汽车电子中的广泛应用 1919次阅读
- 基于TI Soc OMAP4430异构多核处理器的H264编解码 1640次阅读
- 关于音频编解码器EVS及用好要做的准备工作详解 5880次阅读
- 音频的编解码简述及其优化方法 4242次阅读
- FFMPEG视频编解码流程 H.264硬件编解码实现 1.8w次阅读
- 分析了各主流编解码器的优势与不足,并对编解码器的选择给出建议 1.4w次阅读
- 数字视频编解码技术回顾及展望 1047次阅读
- 音频编解码器技术 4925次阅读
- 基于DSP的双通道数字语音监录器设计 1231次阅读
下载排行
本周
- 1电子电路原理第七版PDF电子教材免费下载
- 0.00 MB | 1489次下载 | 免费
- 2单片机典型实例介绍
- 18.19 MB | 91次下载 | 1 积分
- 3S7-200PLC编程实例详细资料
- 1.17 MB | 27次下载 | 1 积分
- 4笔记本电脑主板的元件识别和讲解说明
- 4.28 MB | 18次下载 | 4 积分
- 5开关电源原理及各功能电路详解
- 0.38 MB | 9次下载 | 免费
- 6基于AT89C2051/4051单片机编程器的实验
- 0.11 MB | 4次下载 | 免费
- 7基于单片机和 SG3525的程控开关电源设计
- 0.23 MB | 3次下载 | 免费
- 8基于单片机的红外风扇遥控
- 0.23 MB | 3次下载 | 免费
本月
- 1OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234313次下载 | 免费
- 2PADS 9.0 2009最新版 -下载
- 0.00 MB | 66304次下载 | 免费
- 3protel99下载protel99软件下载(中文版)
- 0.00 MB | 51209次下载 | 免费
- 4LabView 8.0 专业版下载 (3CD完整版)
- 0.00 MB | 51043次下载 | 免费
- 5555集成电路应用800例(新编版)
- 0.00 MB | 33562次下载 | 免费
- 6接口电路图大全
- 未知 | 30319次下载 | 免费
- 7Multisim 10下载Multisim 10 中文版
- 0.00 MB | 28588次下载 | 免费
- 8开关电源设计实例指南
- 未知 | 21539次下载 | 免费
总榜
- 1matlab软件下载入口
- 未知 | 935053次下载 | 免费
- 2protel99se软件下载(可英文版转中文版)
- 78.1 MB | 537791次下载 | 免费
- 3MATLAB 7.1 下载 (含软件介绍)
- 未知 | 420026次下载 | 免费
- 4OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234313次下载 | 免费
- 5Altium DXP2002下载入口
- 未知 | 233045次下载 | 免费
- 6电路仿真软件multisim 10.0免费下载
- 340992 | 191183次下载 | 免费
- 7十天学会AVR单片机与C语言视频教程 下载
- 158M | 183277次下载 | 免费
- 8proe5.0野火版下载(中文版免费下载)
- 未知 | 138039次下载 | 免费
评论
查看更多