基于数字信号处理器的语音编解码高效优化方法

文档序号:6447495阅读:1098来源:国知局
专利名称:基于数字信号处理器的语音编解码高效优化方法
技术领域
本发明涉及数字信号处理器中的语音编解码器,特别是涉及一种AMR语音编解码算法的高效优化方法。
背景技术
通常,语音编解码算法在数字信号处理器(Digital Signal Processor,简称DSP)中是以软件实现的,对于不同的DSP,由于其内部的运算资源不同,实现算法所用的时间也不同。但是基本原理是一样的,都是同时并行处理多条运算指令,以提高效率。
目前,对于特定厂家生产的DSP来说,为了充分发挥DSP的并行处理能力和充分利用DSP中的运算单元,需要有相应的专用编译器对其中运行的代码进行优化编译,达到提高算法效率的目的。但即便是专用的编译器,针对DSP的资源特性来优化C代码,其结果也不是令人满意的,毕竟,编译器只是针对大多数通用代码进行优化,对于复杂的算法,其优化效果并不理想。
例如,在Motorola的关于DSP的编程手册《Code Warrior MetrowerksEnterprise C Compiler User’s Manual》Revised2001/04/05-CIB中,提到了C编译器的优化原理和采用的一些对C代码优化处理的方法,其中包括,1)用更有效的代码来取代原来的指令。
2)去除多余的代码和指令3)简化操作而去除指令4)提升和减少指令来去除不必要的操作虽然这些方法的确可以优化代码,但是由于编译复杂性的限制,编译器只能针对相对小的代码块使用,这使得整个代码段优化远没有到达最优程度,从而浪费了DSP本身的资源,其结果导致了产品成本提高。
而语音编解码算法优化是在提高通讯系统的性能指标的关键技术部分。在一个通讯系统中,实现语音编解码部分的硬件成本占整个系统成本比重很大,系统同时接入的用户路数越多,所需的语音编解码算法部分的硬件成本越高。因此,在降低通讯系统的成本上,如何提高算法的效率成了关键问题。

发明内容
本发明的目的在于能够提供一种对代码段制定优化策略的方法,实现DSP中呃语音编解码算法优化的目的。
本发明提出的基于数字信号处理器的语音编解码高效优化方法,本发明包括以下步骤确定具体代码段;确定具体的优化策略;分析该具体代码段,将其中的每一行代码分解为若干子语句;将修改后的新代码分成若干个代码分支;为变量分配数据寄存器和地址寄存器;将各个分支中语句替换成相应汇编语句;找出最长的分支;以及将其他分支语句合并到最长的分支中,构成组。
本发明提供的方法能够大幅度提高语音编解码算法在DSP中执行的效率,可以降低实现算法的硬件成本,进而降低整个通讯产品的成本,提升产品的商业竞争力。
下面将结合实施例参照附图进行详细说明,以便对本发明的目的、特征及优点有更深入的理解。


图1示出了本发明的总流程图。
图2示出了DSP软件编译环境下的一个纯C语言的编解码工程;图3示出了MR795_gain_quant函数流程框图;图4示出了循环叠代的方法示意图;图5示出了优化后的gain_quant函数运行时间的统计结果。
具体实施例方式
如图1所示,首先,需要确定具体代码段及使用的优化策略,步骤101,在该步骤中需要对用到的程序常量和变量进行统一规划,具体来说,本步骤需要完成的内容包括把算法程序做成完整的工程,在DSP的软件模拟器或者仿真板上运行,运行界面如图2所示,然后根据得到的各个程序执行时间的统计结果,把模块中开销比较大的、且相对代码独立的程序标记为A类程序,而调用次数多的小程序标记为B类程序,进一步分析A类程序的特征,程序中循环体的循环次数,循环体中代码的运算类型,分析B类程序中的代码运算类型,上下文特点;
然后,根据上述的数据,确定具体的优化策略,步骤102,具体的优化策略如,对需要的代码段重新整合,修改程序结构;对B类程序改成直接将代码嵌入到上层调用函数中;分析该具体代码段,将其中的每一行代码分解为若干子语句,步骤103,确定具体的优化代码段后,逐条语句的分析具体的代码,并将每一行代码分解为几条子语句(子语句指DSP可以用他用 编指令就可以完成);将修改后的新代码分成若干个代码分支,步骤104,即按照相关性和语句的执行顺序分成几个纵向的代码分支;为变量分配数据寄存器和地址寄存器,步骤105,此处的变量是指C代码中的变量,由于DSP中寄存器的数量有限,所以,在把C语言转换成汇编时,就要优先考虑寄存器分配的问题,根据变量的顺序,来逐一分配。尽可能的利用变量的生存期的先后顺序,重复利用寄存器,对于复杂的代码,这一步对优化效率起到重要的作用;将各个分支中语句替换成相应汇编语句,步骤106,具体的处理是把各个分支中的C语言语句替换成相应的DSP专用的汇编语句,这样一来就构成了DSP可以高效并行的程序,其中需要注意的是由于C语言的16位和DSP汇编语言高精度的32位的运算之间的转换;找出最长的分支,步骤107,将该最长的分支定为主分支a,其他分支标为b,c,d等等,将其他分支语句合并到最长的分支中,构成组,步骤108,以主分支a为基础,根据DSP中每个循环体(cycle)可以使用的运算单元数,把b,c,d等分支的语句逐条的合并到a分支中去,合并在一起的语句构成了一个group(组);如果是n次的循环体,把每一次循环的运算定为一个分支,标记为L1,L2,L3,L4....,上一次循环运算产生的结果和本次循环运算相关,那么,L1,L2,L3,L4.....不能象步骤107一样合并。如果本次循环和上一次循环的运算结果不相关,那么,L1,L2,L3,L4....等可以象步骤107一样合并在一起。并把合并后最优化的代码段放入循环体中执行,把合并中的L1前缀和Ln后缀放在循环体外。
以语音编解码模块为例,把AMR协议的代码略经修改以后,在MOTOROLA的SC8101的DSP编译环境IDE1.0下做成编码工程和解码工程,这是一个在DSP软件编译环境下的一个纯C语言的编解码工程,然后使用语音文件作为信号源,经过编码工程模拟运行,输出编码后的语音帧。同时软件的Profiler(统计器)统计出工程中各个程序运行的cycle(时钟周期)数。也可以用软件的计数器来统计每个函数的运行时间;
经过Profiler统计后,得到的处理一帧的语音后,工程中各个函数执行时间的统计,根据统计结果可以对函数进行分类;分析各个程序,找出具体需要优化的代码段,是否需要修改代码。以其中的一个MR795_gain_quant程序为例,使用统计器得出的统计结果显示,使用MOTOROLA的编译器的2级优化,cycle数是46436,如图3所示,是MR795_gain_quant函数程序的源代码简要的流程图,首先,为数组的计算赋值,步骤301;将32位的数组转换成两个16位的数组,步骤302;进入函数内的两重循环体,步骤303;外层循环初始化,步骤305;进行参数的乘加运算,步骤306;进而将内层循环初始化,步骤307;进行参数的乘加运算,步骤308;判断当前的参数是否小于0,步骤309,如果是,则给参数赋值,步骤310;否则,内层循环结束,步骤311;外层循环结束,步骤312;进行函数中的参数计算,步骤304,从该流程中可以看出,包含一个两重循环体,循环次数为3(外层)×32(内层)=96次。循环体中有大量的乘法和乘加运算,精度是16位的。还有一个if语句。
根据上述的分析,嵌套在内层循环体循环次数多,要首先考虑它的优化,由于循环次数很多,故不考虑把内层的循环体展开。又由于内部运算中包含了条件语句(汇编语言中实现条件语句比较复杂),且本身循环体内运算量比较大,故不考虑同时进行几次循环叠代运算优化方法,而是采用尽量提高循环体内的并行度的策略,使得循环体中主干最短,所以前后两次循环叠代组合的方法。这样,组合的代码部分中,并行度最高的作为循环体的主干,主干是指在所优化的代码段中,有关联的代码组成的最长的分支。第一次循环叠代的开始部分和最后一次循环叠代的后面的部分并行度不高,放在循环体外。
进行具体优化逐条的分析代码,并将每一行代码分解为几条子语句(子语句指DSP可以在一个机器周期内就可以完成)。这是为了下一步方便,和以后调试汇编的时候查错方便。也为以后的维护提供保证。
改成子语句后,按照相关性来重新排列代码顺序。在本例中,涉及到32位到16位转换的过程,C程序中是转换为16位进行计算的,而在优化中,要尽量采用DSP汇编语言的32位运算,可以节省转换的操作,简化计算过程。下面的重新改写的代码,都是使用DSP汇编语言的32位的操作,去掉了32位到16位的转换。
代码的顺序发生了一些小的改变,比如说,原来的一个与其他的变量并不相关的加法运算,排在循环体的后面执行,可以把它移到循环体的前部来执行,由于DSP具有同时执行多条指令的能力,这样就可以有效提高代码并行度,循环中cycle数最少。
为循环的变量分配数据寄存器和地址寄存器,在本例中由于程序比较复杂,用到的变量多,寄存器的数量相对不足,所以要仔细分析变量的生命期,根据变量生命期的不同,做到多个变量共用一个寄存器,这是以后优化的重要基础。
再转换C代码到汇编语言,继续保持现在的顺序。下面是改成汇编后第一次循环叠代的排列。
注“[”和“]”之间的代码组成了一个“组”,DSP可以在一个机器周期中完成“组”中的指令。
第二次和第三次叠代的汇编程序也是相同的。由于在StarCore140处理器在一个指令周期中可以完成4次乘加运算,和2次内存存取。以此为依据,按照图4所示的方法,第一次叠代的尾部,第二次叠代的中部,和第三次叠代的头部三部分充分的并行,也就是图中红色方框部分标示的部分。
充分并行的代码部分重新构成循环体的主干,第一次叠代的头部和最后一次叠代的尾部并行不够充分,放在循环体外,以达到优化的循环体的目的。
在本例中,循环中含有条件判断语句,由于汇编实现判断语句至少需要两个周期,所以采用一般的方法改成汇编语言,效率也不会很高,而采用本例中的方法,可以把条件语句和其他的语句合并执行,大大的提高了效率,且类似的情况也可同样处理。
这样优化的结果是循环里面只用5个循环体(cycle)就完成了,前缀部分可以和外层循环的代码继续合并。
调试程序,检查漏洞,同时微调汇编代码,达到最优化。
整个程序的优化结果,在profiler下统计的结果下显示,如图5cycle数为7138。优化效果显著。
对于整个编解码工程来说,每一个需要优化的程序,都按照这个步骤优化,经过调试后,如果达到要求,则整个优化流程结束,如果算法指标仍没有达到,则可按本发明的步骤再进行一遍,直到达到要求为止。
对于本方法来说,对于不同的例子,有不同的优化策略,但是方法步骤是不变的。对于其他的语音压缩算法,也可以使用相同的步骤完成,达到高效优化目的。
本发明所举的实施例,只用于进一步说明本发明的技术方案,而不是限定本发明的保护范围。任何在此方案上的变化都应落入本发明。
权利要求
1.一种基于数字信号处理器的语音编解码高效优化方法,该方法包括以下步骤确定具体代码段;确定具体的优化策略;分析该具体代码段,将其中的每一行代码分解为若干子语句;将修改后的新代码分成若干个代码分支;为变量分配数据寄存器和地址寄存器;将各个分支中语句替换成相应汇编语句;找出最长的分支;以及将其他分支语句合并到最长的分支中,构成组。
2.如权利要求1所述的基于数字信号处理器的语音编解码高效优化方法,其中所述确定具体代码段的步骤,还包括把算法程序做成完整的工程,仿真运行,根据各个程序执行时间的统计结果,将不同的程序标记为A、B两种类型。
3.如权利要求2所述的基于数字信号处理器的语音编解码高效优化方法,其中所述标记为A类型程序是模块中开销比较大的、且相对代码独立的程序。
4.如权利要求2所述的基于数字信号处理器的语音编解码高效优化方法,其中所述标记为B类型程序是调用次数多的小程序,
5.如权利要求3所述的基于数字信号处理器的语音编解码高效优化方法,还包括进一步分析A类程序中循环体的循环次数,循环体中代码的运算类型。
6.如权利要求4所述的基于数字信号处理器的语音编解码高效优化方法,还包括进分析B类程序中的代码运算类型,上下文特点。
7.如权利要求1所述的基于数字信号处理器的语音编解码高效优化方法,其中所述具体优化策略,包括对代码段进行重新整合,修改程序结构。
8.如权利要求1所述的基于数字信号处理器的语音编解码高效优化方法,其中所述具体优化策略包括对B类程序改成直接将代码嵌入到上层调用函数中。
9.如权利要求1所述的基于数字信号处理器的语音编解码高效优化方法,其中为变量分配数据寄存器和地址寄存器的步骤,需要利用变量的生存期的先后顺序,重复利用寄存器。
10.如权利要求9所述的基于数字信号处理器的语音编解码高效优化方法,其中所述变量是C语言中的变量。
11.如权利要求1所述的基于数字信号处理器的语音编解码高效优化方法,其中找出最长的分支的步骤,还包括根据DSP中每个循环体可以使用的运算单元数,把各分支的语句逐条的合并到主分支中去。
12.如权利要求11所述的基于数字信号处理器的语音编解码高效优化方法,所述循环体中如果本次循环和上一次循环的运算结果不相关,则可以合并,并把合并后最优化的代码段放入循环体中执行,把合并中的第一个循环前缀和最后一个循环的后缀放在循环体外。
全文摘要
本发明涉及一种基于数字信号处理器的语音编解码高效优化方法,该方法包括以下步骤确定具体代码段;确定具体的优化策略;分析该具体代码段,将其中的每一行代码分解为若干子语句;将修改后的新代码分成若干个代码分支;为变量分配数据寄存器和地址寄存器;将各个分支中语句替换成相应汇编语句;找出最长的分支;以及将其他分支语句合并到最长的分支中,构成组。采用本发明提供的语音编解码高效优化方法能够大幅度提高语音编解码算法在DSP中执行的效率,可以降低实现算法的硬件成本,进而降低整个通讯产品的成本,提升产品的商业竞争力,并具有操作方便,查错方便的优点。
文档编号G06F9/45GK1516009SQ0311484
公开日2004年7月28日 申请日期2003年1月8日 优先权日2003年1月8日
发明者丁剑锋, 陈翔, 李火林, 高闻, 龚旭晖, 段斌 申请人:深圳市中兴通讯股份有限公司上海第二研究所, 深圳市中兴通讯股份有限公司上海第二
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1