纯阴八字为什么要保密| 小丑什么意思| dpoy什么意思| 脑梗适合吃什么食物| 外阴痒用什么洗| 非萎缩性胃炎伴糜烂是什么意思| 药食同源什么意思| 内向男生适合什么工作| 一花一草一世界的下一句是什么| 窜稀吃什么药| 一月8日是什么星座| 南什么北什么的成语| 生吃大蒜有什么好处| 1951属什么生肖| 惊弓之鸟什么意思| 什么牌子的笔记本电脑好| 锡兵是什么| 心什么什么什么| 一个月没有来月经是什么原因| 什么叫阳性率| 五光十色是什么生肖| 太阳黑子是什么东西| 什么叫早泄| 后背出汗什么原因| 男宠是什么意思| 腿胖是什么原因引起的| 男士脸黑穿什么颜色好| 三昧什么意思| 四月二十八什么星座| 脑干堵塞什么症状| 金刚经讲的是什么| 零四年属什么| 长白头发缺什么维生素| 脸上脱皮是什么原因| 合欢是什么意思| 改姓氏需要什么手续| 金砖国家是什么意思| 疮疖是什么意思| 马蜂窝治什么病最好| 一天老是放屁是什么原因| 100元人民币什么时候发行的| 宫颈肥大有什么危害| 甲亢属于什么科室| 灰枣与红枣有什么区别| 母亲属虎孩子属什么好| 什么样的夜晚| 双鱼座和什么座最配对| 李嘉诚戴的什么手表| 喉结肿大是什么原因| 塑料是用什么做的| 无名指和小指发麻是什么原因| 邓超属什么生肖| 细菌感染有什么症状表现| 他不懂你的心假装冷静是什么歌| 耳堵耳闷是什么原因| 小孩掉头发是什么原因| 膀胱充盈欠佳是什么意思| 藏红花泡水是什么颜色| 26是什么意思| 肺结节吃什么药能散结| 属羊的守护神是什么菩萨| 为什么小脑会萎缩| 超声检查是什么| 县公安局长什么级别| 来大姨妈血块多是什么原因| 铁蛋白偏高是什么原因| 医药代表是做什么的| 原教旨主义是什么意思| 老是掉头发什么原因| 腮腺炎吃什么药好得快| 市长属于什么级别| 什么是集成灶| 孕妇腹泻可以吃什么药| 摇曳是什么意思| 接踵而至是什么意思| 藕不能和什么一起吃| 裸婚什么意思| 耳石症是什么意思| 看日出是什么生肖| 花都有什么花| 外阴瘙痒用什么| 依云矿泉水为什么贵| 什么是子宫憩室| 岁月如梭是什么意思| 八月十二是什么星座| 女人眉毛稀少代表什么| 知青是什么意思| 胃出血吃什么药好| 胸痛是什么病的前兆| 孕妇梦见西瓜是什么意思| crh是什么意思| 胃酸是什么颜色的| 耻骨高是什么原因| 1980年属什么| 胱抑素c高是什么原因| 什么是幼小衔接| 猪肝跟什么相克| 我还能做什么| 口加大是什么字| 壁细胞主要分泌什么| 养胃吃什么| 乐子是什么意思| 说话口臭是什么原因引起的| 什么是性上瘾| 男人为什么| 吃什么下火| 可逆是什么意思| 老年人打嗝不止是什么原因| 银杏果长什么样| 儿童尿频什么原因引起的| 麟是什么意思| 白虎女是什么意思| 什么可以代替狗狗沐浴露| 酸菜鱼一般加什么配菜| 婴儿吃不饱有什么危害| 恩施玉露属于什么茶| 指甲黑是什么原因| 痱子是什么样的| 二甲苯是什么| 自投罗网是什么意思| 唏嘘不已的意思是什么| 人的脾脏起什么作用| 精神卫生科看什么病| 眼皮发肿是什么原因| 脚趾甲凹凸不平是什么原因| 粳米是什么米| 大便检查能查出什么病| 董承和董卓什么关系| 肿瘤出血意味着什么| 乙肝病毒核心抗体阳性是什么意思| 一个三点水一个除念什么| 红枣泡水喝有什么好处| 经常吃红枣有什么好处和坏处| 房性期前收缩是什么意思| 拔完智齿可以吃什么| 中国国鸟是什么| 吃荔枝有什么好处| 静脉曲张是什么症状| 喉咙挂什么科室| 成群结队是什么意思| 晚上睡觉出虚汗是什么原因| 易孕期是什么时候| 勉强是什么意思| 守望先锋是什么类型的游戏| 花青素有什么作用| 痛风能喝什么酒| 头皮痒头皮屑多是什么原因| 左氧氟沙星氯化钠注射作用是什么| 皂角米是什么东西| 宋美龄为什么没有孩子| 胎先露是什么意思| 男人喜欢什么| 偏头疼吃什么药| 整装是什么意思| kms是什么药| 缄默是什么意思| 乙肝五项145阳性是什么意思| 双相情感障碍什么意思| 汗蒸有什么好处和功效| absolue是兰蔻的什么产品| 贡菊泡水喝有什么功效| 吃什么美容养颜抗衰老| 5月是什么月| lop胎位是什么意思| 人的三观是什么| 诛仙讲的是什么故事| 什么食物补气| 父母都是o型血孩子是什么血型| 冥寿是什么意思| 明前茶和明后茶有什么区别| 为什么会有鼻屎| 痹症是什么病| 绝无仅有的绝什么意思| 什么品种的狗最粘人| 渡劫是什么意思| 主动脉瓣退行性变是什么意思| 电梯房什么楼层最好| 什么的雕像| 呕吐是什么原因引起的| 情缘是什么意思| 吃什么水果| 截根疗法是什么| 义眼是什么| 股票pe是什么意思| 摇滚是什么意思| 女为读什么| kaws是什么牌子| 子宫复旧不良有什么症状| 老年人缺钾吃什么好| 佳偶天成什么意思| 鱼翅是什么| 周边是什么| 喷的右边念什么| 肌筋膜炎吃什么药| 血管瘤是什么病严重吗| 5月20日什么星座| 肠憩室是什么意思| 低血糖要吃什么| 字母圈是什么意思| 县公安局长什么级别| 心脏右束支传导阻滞是什么意思| 格局是什么| 家里养什么宠物好| 卵泡是什么东西| hardly什么意思| 阴阳两虚吃什么药最好| 取卵后需要注意什么| 家门是什么意思| 缺钾吃什么水果| 什么是夹腿| 尿的酸碱度能说明什么| 2001年是什么年| 病态是什么意思| 沐雨栉风是什么生肖| 更是什么结构的字| 举的部首是什么| mac是什么牌子| 24k是什么意思| 茶叶五行属什么| icp是什么意思| 羊水浑浊是什么原因造成的| 鱼疗是什么鱼| 粒细胞是什么| 李什么名字好听| 啫啫煲为什么念jue| urea是什么意思| 昭和是什么意思| 花千骨什么时候上映的| 感恩节什么时候| 男人长阴虱是什么原因| 花木兰是什么剧种| 女人阴虚是什么意思| metoo是什么意思| 哈尔滨机场叫什么名字| 男人梦见蛇是什么征兆| 1955属什么生肖| 什么星座黑化最吓人| 心慌胸闷是什么原因| 新癀片主要治什么病| 睾丸疼痛挂什么科| 蔷薇是什么意思| 一般什么人戴江诗丹顿| 名垂千古是什么意思| 血冲脑是什么原因引起| 突然心跳加快是什么原因| 吃木瓜有什么作用| 拉肚子喝什么水| facebook是什么意思| 一般细菌培养及鉴定是检查什么| 天下无不是的父母是什么意思| 母鸡学公鸡叫什么征兆| 小孩铅过高有什么症状| 月经血块多是什么原因| 什么是药品| 哺乳期妈妈感冒了可以吃什么药| 吃什么可以消除淋巴结| 为什么十五的月亮十六圆| 1967属什么生肖| 晚上10点属于什么时辰| 153是什么意思| 71年属什么生肖| 什么样的人容易垂体瘤| 手掌心发热是什么原因| 腱鞘炎是什么病| 百度

新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 语音编解码算法G.723.1在DSP上的优化

“地价门”关键人物供认:安倍妻子曾力挺购地

作者: 时间:2025-08-04 来源:网络 收藏
百度 由中国儿童少年基金会发起的“为5加油——学前儿童营养改善计划”以其项目精准的定位和出色的执行,入选“99公益日”支持的公益项目。

  1 引言

  是删组织于1996年推出的一种低码率的语音编码算法标准,也是目前该组织颁布的语音压缩标准中码率最低的一种标准。主要用于对语音及其它多媒体声音信号的压缩,目前在一些数字音视频传输、高质量语音压缩等系统中都得到广泛应用。

  2 算法的复杂度分析

  将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*src21)!=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的运算后,再做一次饱和处理,这样一条指令就可完成C语言中多条语句才能完成的计算,可以节省很多时钟周期。

  (2)循环展开(loop—unrolling)

  程序中的有很多的双重循环和多晕循环(比如代数码本搜索计算),由于C64xx优化器在优化时只在最内层循环中形成一个指令流水(最多可以达到8级流水),这样循环语句就不能充分利用软件流水线,而且对于内部循环次数较少的情况,消耗在prolog和eplog上的时钟周期也不可忽视。针对这种情况,一个有效的办法就是将双重或多重循环展开,降低循环次数。这样虽然代码长度增加了,但有更多的运算能够参加到pipeline中。由于减少了流水线排空和提高了功能单元的利用率,程序执行速度会大大提高。

  (3)减少分支和调用指令,减少判断指令

  程序中的分支、调用以及判断指令会引起程序的跳转,而每个跳转指令都有5个延迟间隙。因此延长了程序执行时间;另外,循环内跳转也会使软件流水受到阻塞,降低了代码执行效率。优化中,可以使用内嵌、合并判断语句来减少判断次数或用逻辑指令替代判断的方法尽可能的消除中断流水线指令带来的影响。

  (4)使用字或双字存取和计算

  C64xx系列是32位CPU,当16位数据在内存中连续存放时,可利用uint_amem4(void*ptr)或double _amemd8 (void*ptr)指令进行字或双字数据的读取或存贮。这样每次可同时存取2个或4个16位数据,由于从内存执行取数操作需要4个delay,所以减少存取次数可以节省大量的时钟同期;同时,可利用C64xx指令集中特有的打包指令_pack2(unsigned a,unsigned b),_packh2(unsigned a,unsigned b)等将两个16位数打包成一个32位数,在进行乘、加计算时则利用_add 2(int a,int b)、_mpy2(int a,int b)同时完成两组16位数的加法和乘法,效率比单纯16位数的加法和乘法提高一倍。

  3.3汇编编程的优化

  线性汇编是TI提供的一种汇编语言,其指令系统和汇编语言的指令系统完全相同,但在编写时不需要指定寄存器和操作单元,也不需要考虑延时的问题,因此编写线性汇编相对要容易一些。

  经过以上的优化后,音频编码程序在DM642上的运行状况有了很大改善,但是经测试仍然没有到达可以接收的程度,而高级语言的效率几乎发挥到了极致,所以在具体分析耗时大的模块特点后,采用线性汇编语言重新编写C代码的低效率段程序,迸一步提高程序的执行效率。

  在编写线性汇编优化代码的过程中,为了提高代码执行效率,我们需要遵循以下原则:

  (1)写并行代码:通过使用汇编指令并行执行的方法减少循环内的执行周期数,优化线性汇编代码。这里的关键问题是弄清指令相关性,只有不相关的指令才能并行执行。辨别指令是否相关.可以使用相关图。

  (2)处理跳转指令和转移指令:汇编程序的一大特点就是频繁地跳转,当满足不同的条件时,要求程序进行不同的操作,或跳到相应的位置。对于“大于”、“大于等于”、“小于”、“小于等于”等较为接近的逻辑判断和处理,应慎重对待,否则将产生逻辑性错误,并且很难调试。当发生溢出需进行相应处理时,这种现象尤为突出。

  (3)尽量减少循环体内的指令数[7]:G.72.1的算法实现,有许多是在循环内部完成的,有些地方如同定码本搜索过程中,为了确定四个非0脉冲的位置和幅度,还用到了多重循环。在循环内部,特别是在嵌套较深的循环内部,减少一条指令可以大大降低程序的操作次数。例如。对于一个每重循环8次的四重嵌套循环,在最内层循环每减少一条指令,整个程序可以少执行84=4096语句。因此在设计程序时,能够放在循环体外执行的语句.尽量放在循环体外执行。

  (4)展开程序体:尽在一定条件下,尽量展开程序,以减少子程序的调用和返回次数,牺牲空问换取时间。

  经汇编优化器优化后,代码效率比C语言直接编译有明显提高。

  4 优化工作的创新点

  在对G.723.1的优化中.本文在前人研究成果的基础上,针对 C64xx系列芯片提}n了一些有价值的新方法。这些创新点在不同程度上提高了代码的优化速度和执行效率,在的DSP实时实现中起到了关键性作用。下面,本文将以举例的方式阐明一些经典的方法。

  (1)编写连接命令文件.cmd

  明确了系统的程序和数据映射地址后,编写连接器命令文件将部分调用次数较多的函数、堆栈段、数据段放入内存:cmd文件内容如下:

  一L\evmdm642_echocfg.cmd //连接CCS提供的连接命令文件

  SECTIONS

  {

  .tahles>SDRAM

  .cinit>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实时实现中起到了关键性作用。



评论


相关推荐

技术专区

关闭
总胆固醇高吃什么药好 红豆不能和什么一起吃 乙肝病毒携带者有什么症状 嘌呤是什么东西 做胃肠镜挂什么科
什么血型最多 扁桃体发炎吃什么好得快 生理盐水是什么东西 吃什么水果对子宫和卵巢好 熟啤酒是什么意思
长脸适合什么发型男 2月5号什么星座 claire是什么意思 五月初是什么星座 红糖水什么时候喝最好
汗疱疹吃什么药 每次睡觉都做梦为什么 雷是什么生肖 解析是什么意思 什么星球最大
澳门用什么钱币hcv8jop4ns4r.cn 不除外是什么意思hcv9jop0ns4r.cn 肺部真菌感染吃什么药hcv7jop6ns4r.cn 什么是辐照食品hcv8jop8ns4r.cn 萎缩性胃炎吃什么中成药hcv9jop3ns3r.cn
嗣女是什么意思hcv8jop8ns1r.cn 孕晚期破水是什么症状hcv8jop8ns0r.cn 喝牛奶拉肚子是什么原因hcv9jop7ns2r.cn 肾阳虚的表现是什么hcv8jop1ns6r.cn 七月七日是什么生肖hcv9jop2ns7r.cn
http是什么hcv8jop6ns6r.cn 尿红细胞阳性什么意思hcv8jop3ns5r.cn 血糖高吃什么药好helloaicloud.com 浅表性胃炎吃什么药好使hcv8jop9ns0r.cn 孕妇梦见龙是什么征兆hcv7jop7ns4r.cn
受贿是什么意思hcv8jop4ns7r.cn efg是什么意思hcv9jop8ns1r.cn 早上10点是什么时辰hcv7jop5ns5r.cn 手起倒刺吃什么维生素hcv8jop5ns3r.cn 肚脐下方是什么器官dajiketang.com
百度