datasheet

基于TMS320C6201的G.723.1多通道语音编解码的实现

2008-06-02来源: EDNchina关键字:零输入  编解码  语音信号  多重循环  码率  定点DSP  FIR滤波器  高通滤波  

  当前,Voice overIP(VoIP)技术正在不断普及,通过Internet的语音通信量也日渐增加。目前VoIP中使用的低码率语音压缩标准主要有G.723.1和G.729两种。随着VoIP技术的不断发展,要求产品的集成度与性能进一步提高,利用新一代高性能DSP芯片,实现单片DSP处理多路语音信号,是今后的发展趋势。本文根据C6201芯片的特点,作了大量针对G.723.1标准本身的优化,降低了运算量,满足了多路信号的实时实现。

  1 G.723.1标准介绍

  G.723.1标准是ITU组织于1996年推出的一种低码率编码算法。主要用于对语音及其他多媒体声音信号的压缩,如可视电话系统、数字传输系统和高质语音压缩系统等。

  G.723.1标准可在6.3kbps和5.3kbps两种码率下工作。其中,高码率算法具有较高的重建语音质量,而低码率算法的计算复杂度则较低。与一般的低码率语音编码算法一样,G.723.1标准采用线性预测的合成分析法(Analysis-by-Synthesis)。对激励信号进行量化时,高码率算法采用多脉冲最大似然量化(MP-MLQ),而低码率算法则采用算术码本激励线性预测(ACELP)。目前,G.723.1已经能在多种DSP芯片上实现,如美国TI公司的TMS320C5x、TMS320C54x和朗讯科技公司的DSP16xx等。

  G.723.1编码器能对以8kHz采样的话带语音信号进行压缩,其结构框图见图1(a)。从图中可以看出,编码器是基于线性预测合成分析法原理,其目的是最小化感知加权误差信号。为了降低码率,G.723.1采用了较长的帧尺寸,每帧240个样值,即30毫秒帧长。每帧输入信号首先通过一阶高通滤波器滤除直流分量,然后将之分成四个60个样值的子帧,每个子帧独立进行LPC分析。为了提高LPC系数的连续性,采用了长度为180个样值的重叠窗,即同时包含前后两个子帧,这使算法引入60个样值的超前时延,因此算法的总时延为37.5毫秒。LPC系数用线性谱频率(LSF)表示,LSF参数采用预测分裂矢量量化,只对第四子帧进行。为了提高量化感知质量,高通滤波后的语音信号需通过共振峰感知加权滤波器和谐振峰噪声整形滤波器以生成初始目标信号。前者参数由各子帧的未量化LPC系数构成,后者通过对每两子帧进行开环基音周期估计得到,其中基音周期的范围为18到142个样值。LPC合成滤波器、共振峰感知加权滤波器和谐振峰噪声整形滤波器用于系统零输入响应计算和最佳激励估计。G.723.1编码器还包括一个五阶基音预测器,其参数根据开环基音估计值和脉冲响应进行闭环基音搜寻得到。在进行最佳激励估计时,需从初始目标信号中减去系统零输入响应和基音预测器贡献以得到最终目标信号,然后针对高低码率分别采用MP-MLQ和ACELP方法进行量化。其中LSF参数、基音值和激励参数需传送给解码器。

  解码器首先根据得到的LSF参数重建LPC合成滤波器,然后根据基音值和激励参数得到自适应码本激励信号和固定码本激励信号。为了提高重建语音的主观质量,解码器还包括一个后滤波器,后滤波器由共振峰和基音后滤波器组成。激励信号依次通过基音后滤波器、合成滤波器和共振峰后滤波器合成重建语音,其结构框图见图1(b)。

  

  2 TMS320C6201芯片结构简介

  TMS320C6201是一种32位的定点DSP,工作频率最高达200MHz。它有两组运算单元,每组4个,共8个。除M单元只能作乘法外,其他单元都可以灵活使用,如D单元可以做Load、Store和加减操作,S单元可以进行移位和加减。C6201有32个通用寄存器,分为A、B两侧。两侧的寄存器有交叉通路,同一指令可以同时访问双侧的寄存器。C6201采用了超长指令字结构,一次最多可以同时执行8条指令(每个单元一条)。它有11级流水,所有的指令都是精简指令。C6201允许使用缓存(Cache)模式,可以运行大型程序而不降低速度。图2是C6201的结构。

  

  3 标准的实现

  用C6201实现G.723.1标准的最大优势在于它极强的并行处理能力,用一块DSP可以实现多路语音的压缩,大大简化了硬件的设计。C6201是TI公司推出的第一种支持C编译器的DSP芯片。通常,C编译器能完成整个工作的70%,而30%的进一步优化必须通过手写汇编来实现,所以对整个程序的优化分为C语言级和汇编语言级两部分。

  3.1 C语言级的优化

  3.1.1 循环展开(loop-unrolling)

  使用具有并行能力的DSP开发软件时,一个重要的思想就是充分利用DSP的字长和数目众多的运算单元,尽量把循环体展开。通过增加每次循环中执行的指令数来减少总的循环次数,可使得在同样的时钟周期内能运行更多的指令,提高了循环的效率。

  DSP芯片内部的运算单元运行效率非常高,但如果寄存器和数据总线之间的数据交换频繁,将使DSP的执行效率大打折扣。因为DSP在进行内存操作时,往往需要若干周期的延迟,如Load指令要有4个周期的延迟,Store指令需要2个周期的延迟。为了减少耗时的内存操作,可以在程序进入循环体之前,将要频繁使用的数据预先放入寄存器,然后反复调用,实践证明这种方法可以提高一部分效率。

  3.1.3 使用内在函数(Intrinsic)

  内在函数是在某些C6201DSP的汇编指令前加上“_”构成它可以方便地实现某些需若干C语句才能实现的功能。它是一种非常简便高效的优化方法,它的调用格式和普通C函数一样,但在编译时编译器会自动将Intrinsic用对应的汇编指令替代。C6201指令集中绝大多数的运算逻辑指令都可以这样使用,比如饱和绝对值、饱和加、饱和减、饱和乘、两个字中的对应半字同时加或同时减、两个字中的对应半字同时乘或交叉乘、归一化及位操作等。经过此步优化后,大部分循环体都可以生成较为有效的流水内核(piplinedkernel)。用Intrinsic替代G.723.1原先的C代码,运算量下降为原来的1/10。

  3.1.4 对算法的冗余部分合理精简

  经过检查,发现ITU-T G.723.1的C代码存在冗余部分。象6.3k码率的MP-MLQ搜索模块中,只需要用到偶数位置的脉冲响应的自相关,所以对奇数位置的脉冲响应自相关计算可以省略。

  另外,在G.723.1标准中存在大量的10阶FIR和10阶IIR滤波器运算,如编码部分的感知加权、零输入响应、解码部分综合滤波器和后滤波等,FIR和IIR的通用形式可以表示为:

  每次循环,FIR滤波器内存要用新的输入值更新,IIR滤波器内存要用新的输出值更新,使用按标准提供的算法,要专门用一个10阶循环更新内存。如果用一个10单位大小的循环缓存区,每次用新值覆盖最老的样值,动态调整循环缓存区的头指针,可以节省原先用于内存更新的cycle。

  3.2 汇编级优化

  由于C编译器只能完成70%的工作且对于复杂的循环,C编译器无法生成高效率的代码,所以对运算量大的模块只能用手写汇编。

  3.2.1 字长优化

  C6201的字长为32位,它支持按字节、半字、字存取。对于16位的数组,当它在内存中连续排列时,用32位读写指令LDW或STW替代16位读写指令LDH或STH,循环次数可减少一半。另外,C6201的汇编指令支持两个32位寄存器的高16位和低16位之间互乘,结果分别放到不同的寄存器中,互不影响。具体指令为SMPY(L×L)、SMPYH(H×H)、SMPYHL(H×L)和SMPYLH(L×H)。通过字长优化,可以大大提高程序的运行效率。必须注意的是,在使用字长优化时,数组在内存中的位置必须对齐32位边界。

  3.2.2 对外循环的优化

  C6201的C编译器对多重循环的最内层一般能较好地优化到一句到两句,但对外循环的优化效率则差很多。手写汇编时,可以先将内循环展开,再把外循环的指令并入其中,可以减少所耗费的cycle数。

  C6201的循环一般分前导(Prolog)、内核(Kernel)及排空(Epilog)三部分。代码的并行程度从Prolog开始不断提高,Kernel内的并行程度最高,Epilog与Prolog相反,并行性逐渐降低。在多重循环中,如果尽量把内循环前导部分的指令与填入排空部分未用的单元,一起执行,可以在执行本次循环的排空语句的同时执行下次循环的前导语句。这样可不多花cycle而提高整个循环的效率。

  4 实现结果

  经过C语言级和汇编级的多种优化,最后实现了一路G.723.1的编解码需要花费10.6MCPS,整个代码的程序空间为208K byte(程序中包括了部分c6201的库函数),数据空间为8K byte,码本大小20k byte,多通道的上下文数据为1.48K byte。200MHz的C6201每秒可以实时编解码16路语音信号。所有代码全部通过了ITU-T测试矢量的测试。表1是各主要模块的运算量。

  表1 G.723.1各主要模块运算量

  

  本文提出的利用C6201 DSP进行ITU-T G.723.1全双工实时多通道语音编解码的实现。该实现可以在IP电话、视频会议中得到广泛应用。

关键字:零输入  编解码  语音信号  多重循环  码率  定点DSP  FIR滤波器  高通滤波  

编辑:孙树宾 引用地址:http://www.eeworld.com.cn/afdz/2008/0602/article_722.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:基于FPGA的数字式光端机的研究与设计
下一篇:步态加速度信号的无线采集系统设计

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STM32 嵌入式学习入门(3)——STM32F103 按键输入控制LED灯

按键是单片机上一个很重要的输入设备,也很容易掌握,只要明白了IO口最基本的使用,就可以操作按键了。我们的目的是控制开发板上板载的三个按键来操作开发板上板载的两个LED灯实现亮或灭(按键第一次按下时灯亮,再按下时灯灭,以此类推)。博主所用的开发板是正点原子的mini板(STM32F103RCT6)和战舰板(STM32F103ZET6),因此下面的内容的例子以这两款开发板为例,但是基本的原理对任何开发板来说都是一样的,只要自己的开发板上板载了按键和LED灯(这两个资源应该是所有开发板上都有的资源吧),然后查看自己开发板的数据手册和硬件电路图、原理图,找到按键和LED灯对应的IO口,就可以按照本文所介绍的流程使用按键控制
发表于 2019-04-10
STM32 嵌入式学习入门(3)——STM32F103 按键输入控制LED灯

实验三:MSP430输入输出接口实验(2学时)

;//P10~P13输入模式,外部电路已接上拉电阻  P6SEL = 0x00;                   //P6口普通IO功能  P6DIR = 0xFF;                   //P6口输出模式} //**********************************************************************// 键盘扫描子程序,采用逐键扫描的方式
发表于 2019-04-10

【STM32F103】按键检测(GPIO输入)

按键硬件电路:分析电路:按键K1按下,接通高电平3.3V,为了保护GPIO,加了限流电阻(R7),没按下的时候是接地的,上升沿输入。PA0具有自动唤醒的功能(必须上升沿才能唤醒),电容C6用以硬件消抖(电容不断充放电),这样软件就不用延时来消抖,K2电路同。GPIO输入:GPIO数据输入寄存器IDR,只要读取这个寄存器就可以。bsp_key.c 按键初始化:#include "bsp_key.h"  void KEY_GPIO_Config(void){ GPIO_InitTypeDef  GPIO_InitStruct; RCC_APB2PeriphClockCmd
发表于 2019-04-09
【STM32F103】按键检测(GPIO输入)

STM32八种输入输出模式详解

最近在看数据手册的时候,发现在Cortex-M3里,对于GPIO的配置种类有8种之多:(1)GPIO_Mode_AIN 模拟输入 (2)GPIO_Mode_IN_FLOATING 浮空输入(3)GPIO_Mode_IPD 下拉输入(4)GPIO_Mode_IPU 上拉输入(5)GPIO_Mode_Out_OD 开漏输出(6)GPIO_Mode_Out_PP 推挽输出(7)GPIO_Mode_AF_OD 复用开漏输出(8)GPIO_Mode_AF_PP 复用推挽输出    对于刚入门的新手,我想这几个概念是必须得搞清楚的,平时接触的最多的也就是推挽输出、开漏输出、上拉输入这三种
发表于 2019-04-09

基于STM32-按键输入与八种IO口模式

按键检测使用到 GPIO 外设的基本输入功能, 按键机械触点断开、闭合时,由于触点的弹性作用,按键开关不会马上稳定接通或一下子断开,使用按键时会产生图 中的带波纹信号,需要用软件消抖处理滤波,不方便输入检测。这里再讲下八种IO口模式:1.模拟输入 我认为模拟输入最重要的一点就是。他不经过输入数据寄存器,所以我们无法通过读取输入数据寄存器来获取模拟输入的值,我认为这一点也是非常好理解的,由于输入数据寄存器中存放的不是0就是1。而模拟输入信号不符合这一要求,所以自然不能放进输入数据寄存器。该输入模式,使我们能够获得外部的模拟信号。2.浮空输入 该输入状态。我的理解是。它的输入全然由外部决定,我认为在数据通信中应该能
发表于 2019-03-28
基于STM32-按键输入与八种IO口模式

STM32CubeMX学习教程之三:GPIO输入之利用SysTick中断给按键去抖

本文主要讨论软件去抖。实现方法是通过SysTick中断每1ms对按键进行扫描,当检测到连续的稳定无抖动电平信号(长度可设置)之后,才进行相应的逻辑操作。软件版本:STM32CubeMX V4.25.0  System Workbench V2.4硬件:OneNet 麒麟座V2.3在STM32CubeMX中新建项目,选择正确的MCU型号然后设置RCC和SYS,然后根据板子实际情况设置时钟(麒麟座外部晶振是12M,STM32F103x的最高主频是72M)然后设置GPIO_Output (连接到LED) 和GPIO_Input(连接到按键)。注意上一篇文章里面按键连接的引脚设置为外部中断模式,这里只需要设置为GPIO_
发表于 2019-03-25
STM32CubeMX学习教程之三:GPIO输入之利用SysTick中断给按键去抖

小广播

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 视频监控 智能卡 防盗报警 智能管理 处理器 传感器 其他技术 综合资讯 安防论坛

北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved