基于DM642 的G. 729. 1 实现

出处:jack.king 发布于:2011-06-01 15:34:47

     20 世纪90 年代, 无线通信系统的变速率语音编码得到了广泛的应用。特别是移动通信的飞速发展,把变速率语音编码推上了前台。随着技术的发展, 它的应用领域越来越广, 不再限于移动通信系统, 在IP电话、互联网上也有很好的应用前景。ITUT 于2006 年批准了G. 729. 1 嵌入式变速率可分级宽带语音编码标准。

  1  G. 729. 1 编解码原理

  G. 729. 1 编码器是一个基于G. 729 的带宽扩展( 50~ 7 000 Hz) 的8~ 32 kbit / s 可分级编码器。由编码产生的比特流有可分级性, 包含了12 个嵌入式层。第1 层称为层, 编码速率为8 kbit / s。与G.

  729 的码流形式相同, 与G. 729 具有互操作性。第2层是一个窄带增强层, 编码速率为12 kbit / s, 第3~12 层是宽带增强层, 每层均在前一层的基础上增加2kbit/ s 的编码速率。本研究所涉及的语音处理均是在默认模式下进行的, 不讨论其他模式下的情况。

  G. 729. 1 基本算法是基于3 阶段编码结构: 低频带(50~ 4 000 Hz) 嵌入式激励线性估计( CELP) 编码器, 高频带( 4 000~ 7 000 Hz) 时域带宽扩展( TDBWE)参量编解码, 以及通过被称为时域混叠消除( TDAC)的估计变换编解码技术实现的全频带增强功能。图1 为G. 729. 1 编解码算法的软件流程图。

图1 G. 729. 1 算法编码流程图

  2  系统硬件

  DM642 是德州仪器公司推出的一款专门为数字多媒体应用而设计开发的32 位定点DSP 芯片 。在SEEDVPM642 开发平台中, 同时有4 路音频输入和输出接入McASP, 用的协议为BurstFrameSyncMode 。T LV320AIC23B 的输入方式为立体声, 其采样率为16 kHz, 提供16 bit 的采样值, ADC 和DAC 的信噪比分别可以达到90 dB 和100 dB。AIC23B 使用IIC 总线对其进行配置, SDIN 作为串行数据输入,SCLK 作为串行时钟。IIC 总线采用的是七位地址的寻址方式, 并且AIC23B 的寄存器只能写而不能读, 因此, 每个WORD 的前7bit 为寄存器地址, 后9bit 为寄存器内容。系统实现原理图如图2 所示。

图2 系统实现原理图

  3  G. 729. 1 的实现

  3. 1  基于VC 6. 0 的实现

  在将代码进行移植之前, 采用便于进行软件调试的环境 微软VC 6. 0, 对源代码进行实现, 为随后将代码移植到目标DSP 上做准备。在VC 下建立相应的工程, 对其进行编译连接生成编码和解码器。对结果进行分析验证。

  3. 2  基于DM642 的实现

  源代码在PC 机上测试正确后再移植到DSP上。T I 公司提供了一个DSP 开发平台CCS ( CodeCom po ser Studio) , CCS 的语法规则与VC 有许多不同, 进行代码移植之前要使其符合CCS 的语法规则。因此, C 语言仿真程序搬到DSP 上运行时需要注意数据类型、大/ 小端存放模式的转换、存储器分配及CCS 编译选项等方面。

  DM642 是T I 公司的高端产品, 主频高、处理速度快、存储容量大等优点。在CCS 开发环境中建立起和VC 6. 0 平台对应的G. 729. 1 编码器工程, 在对目标文件进行链接之前, 确定目标文件在存储器中的位置, 实现代码在DSP 存储器中的地址映射, 需要编写cmd 文件, 添加所有有关的源文件, 然后编译、链接。在链接完成后, 全速执行程序。在初步实现编码时发现, 未加任何改动的原始源码在CCS 平台下运行速度非常慢, 因此, 需对代码进行进一步的优化。

  4  代码的优化

  采用的优化方法主要为比较简单的算法优化和C 语言级别上的优化, 不涉及汇编级别的优化。

  4. 1  优化思路

  从代码性能的角度上讲, 每段代码的重要性是不同的: 在程序的运行过程中, 有的代码调用频繁, 如果这段代码的执行效率非常低下, 则可能成为整个程序的瓶颈。因此, 代码优化的重点首先应该是对这些代码进行优化。在优化代码的过程中, 应该结合DSP硬件结构来编写或者优化代码。

  优化一般从以下3 方面考虑: 速度、程序空间和数据空间大小。然而, 速度和程序空间、数据空间的优化是相互抵触的, 需要结合实际情况综合考虑在做定夺。

  4. 2  算法优化

  在码本搜索过程中, 所有码矢量( 输入矢量和码本中码矢量) 按照误差准则进行匹配。该输入矢量的量化矢量为均方误差值对应的码矢量, 因此, 在每次搜索都需保存上的均方误差值。

  下一码矢量, 如果其值大于保存的均方误差值,则剩下的计算可以忽略, 显然, 下一码矢量并不是搜寻的量化矢量, 鉴于此, 该算法的改进可以在Lsp_pre_select( ) 中增加相应的判断代码, 从而节省代码执行时间 。

  4. 3  C 语言优化

  C 语言优化有多种方法, 本研究只使用了以下几种方法。

  4. 3. 1  C 编译器优化

  CCS 提供了多种编译器选项, 通过这些选项对编译器的操作进行控制, 可以对代码进行多种优化,减少代码长度和提高代码的执行效率。其优化选项包括( - o ( - o1、- o2、- o3) 、- mt、- pm、- ms0、-mh[ n] 、- k、- s、- mw 、- g、- mg) 。为了起到更好的优化作用, 达到更好的效果, 经过实验后使用组合- 03、- pm。

  4. 3. 2  使用内联函数进行优化

  内联函数是C6x 编译器提供的专门函数, 与C6x 的汇编指令一一对应。对函数优化的步是在函数中的基本数学运算使用内联函数代替, 内联函数可以直接映射为C6000 内部指令、快速优化C 代码。在以后所有用到该运算的函数中, 这个运算在一个周期就可以完成。有些函数可以直接或稍作修改就能使用内联函数替换 , 如表1 所示。

表1 直接使用内联函数优化表

  从表1 可以看出, 使用内联函数可以大大提高代码的执行效率, 其中一些函数需做大量修改才能使用内联函数。

  4. 3. 3  软件流水

  软件流水是编排循环指令, 从而使循环的多次迭代能并行执行的一种技术。软件流水仅限于对嵌套循环中内层循环的优化, 因此, 应尽可能的创造大的内部循环。要实现上述要求就要在程序中把执行周期少的内循环展开, 增加并行指令数, 改进软件流水的编排。使用该方法时, 有诸多的注意事项, 应特别注意以下几个方面: A 不能包含函数调用; B 不可以使用指令有条件的终止循环; C 循环必须采用递减计数, 且当其减为0 时终止循环。D 由于寄存器数量有限, 循环体代码不能太大, 必要时大循环应先进行拆分。

  经过以上方法的优化, 优化后效果比较明显。运行速度明显加快, 比优化前快了1 倍多, 特别是对G.729. 1_TDBWE _encoder ( ) 、G. 729. 1_TDAC_mdct( ) 、G. 729. 1_MAIN_QMF_ana( ) 这3 个函数的优化更加明显, 所需运算周期数减少为原来的1/ 3 左右。

  5  结束语

  G. 729. 1 语音编码算法经过简单的算法优化和C 语言级别的优化, DSP/ BIOS 配置, 成功移植到SEEDVPM642 平台, 实现了语音的变速率压缩和解压处理。优化后的算法, 其运行效率有明显的提高,语音质量能满足通信的要求。

参考文献:

[1]. PC  datasheet https://www.dzsc.com/datasheet/PC+_2043275.html.

版权与免责声明

凡本网注明“出处:维库电子市场网”的所有作品,版权均属于维库电子市场网,转载请必须注明维库电子市场网,https://www.dzsc.com,违反者本网将追究相关法律责任。

本网转载并注明自其它出处的作品,目的在于传递更多信息,并不代表本网赞同其观点或证实其内容的真实性,不承担此类作品侵权行为的直接责任及连带责任。其他媒体、网站或个人从本网转载时,必须保留本网注明的作品出处,并自负版权等法律责任。

如涉及作品内容、版权等问题,请在作品发表之日起一周内与本网联系,否则视为放弃相关权利。

上传BOM文件: BOM文件
*公司名:
*联系人:
*手机号码:
QQ:
应用领域:

有效期:
OEM清单文件: OEM清单文件
*公司名:
*联系人:
*手机号码:
QQ:
有效期:

扫码下载APP,
一键连接广大的电子世界。

在线人工客服

买家服务:
卖家服务:

0571-85317607

客服在线时间周一至周五
9:00-17:30

关注官方微信号,
第一时间获取资讯。

建议反馈

联系人:

联系方式:

按住滑块,拖拽到最右边
>>
感谢您向阿库提出的宝贵意见,您的参与是维库提升服务的动力!意见一经采纳,将有感恩红包奉上哦!