G.726语音编解码器在SoPC中的实现
g.726是itu前身ccitt于1990年在g.721和g.723标准的基础上提出的关于把64kbps非线性pcm信号转换为40kbps、32kbps、24kbps、16kbps的adpcm信号的标准。g.726标准算法简单,语音质量高,多次转换后语音质量有保证,能够在低比特率上达到网络等级的话音质量,从而在语音存储和语音传输领域得到广泛应用[2]。
本文引用地址:https://www.eepw.com.cn/article/20678.htmg.726语音压缩算法已经能够在以dsp处理器为核心器件的dsp应用系统上实现。但开发以dsp处理器为核心的dsp应用系统所采用的开发方法是自底向上的设计流程,严重影响开发的效率和成功率。面对现代通信技术的发展,dsp处理器已暴露出硬件结构的不可变性、处理速度比较慢等不足[1]。现代大容量、高速度的fpga及其相关的开发技术,在可重配置的dsp应用领域、dsp数据大吞吐量和数据的纯硬件处理方面,有独特的优势[1]。新的基于fpga的dsp系统级开发工具以及完整的软件开发平台,使得设计者能采用自顶向下的开发方法进行fpga的dsp设计,设计效率大为提高。
本文分析了g.726标准,给出了基于fpga的dsp设计开发流程,利用matlab/simulink、altera公司的dsp
builder和sopc builder工具设计了语音记录sopc系统中的g.726语音编解码器,并实现了编解码器在该系统中的综合。采用基于fpga的g.726语音编解码器的语音记录嵌入式系统具有运行速度快、体积小巧、开发周期短等优点。

图1 adpcm编码器框图

图2 基于fpga的dsp设计系统级开发流程
1 g.726语音编解码标准
g.726编码器框图如图1所示。g.726语音编码器首先将输入的a律或μ律的log-pcm信号s(k)转换成线性的pcm码sl(k),然后与预测信号se(k)相减产生差分信号d(k),再对差值信号进行自适应量化,产生2~5比特adpcm码i(k)。一方面将i(k)送至解码器;另一方面逆自适应量化器利用i(k)产生量化差分信号dq(k)。预测信号se(k)和量化差分信号dq(k)相加产生本地重构信号sr(k)。自适应预测器是由二阶极点和六阶零点组成的滤波器,根据重构信号sr(k)和量化差分信号dq(k)产生输入信号的预测信号se(k)。量化器比例因子自适应单元根据输入信号的特性计算量化器比例因子y(k),用来控制量化器和逆量化器,以获得自适应功能。量化器比例因子由快速因子和慢速因子两部分,以及速度控制因子al(k)对这两部分的加权组成。速度比例因子al(k)的计算由自适应速度控制单元与音调和传送检测器单元完成。
g.726语音解码器的解码过程实际上已经包含在编码器中,只是多了输出pcm格式转换单元和同步串行编码调整单元。输出pcm格式转换是将线性pcm码转换为a律或μ律pcm码;同步串行编码调整是为了防止多级传输、转换过程中的误差。
2 基于fpga的dsp设计开发流程
利用传统的开发工具,基于fpga的dsp开发者在算法确定后只能直接使用vhdl或veriloghdl语言进行fpga的dsp系统设计,开发需要较长的周期,且难度比较大。目前出现的基于fpga的dsp开发工具,如dsp builder、sopc builder、system generator等,使得设计者能遵循一条类似于软件设计流程的开发方法进行fpga的dsp设计,设计效率大为提高。本文给出利用matlab/simulink和altear公司的开发工具进行基于fpga的dsp设计的开发流程。dsp builder是altera公司推出的面向dsp开发的系统级工具。它作为matlab的一个simulink工具箱(toolbox)出现。mathworks的matlab和simulink系统级的设计工具具备了算法开发、仿真、验证能力,dsp builder将这些工具与altera的开发工具组合在一起,为用户提供了一个完整的dsp开发平台。
基于fpga的dsp设计系统级开发流程如图2所示。其步骤:(1)在matlab/simulink中对dsp系统进行建模,用图形方式调用altera dsp builder和其他simulink库中的图形模块(block),构成系统级和算法级设计框图,同时利用simulink完成模型仿真。(2)利用dsp builder将simulink的模型文件(.mdl)转化成通用的硬件描述语言vhdl文件(.vhd),转换获得的hdl文件是基于rtl级的vhdl描述。(3)对转换过程中产生的vhdl的rtl代码和仿真文件进行综合、编译适配以及仿真。所用工具可以是altera的quartus ii软件,也可以是第三方软件工具。(4)在dsp builder中直接下载到fpga用户开发板上,也可通过quartus ii完成硬件的下载、测试。整个开发流程几乎可以在同一环境中完成,真正实现了自顶向下的设计流程,极大地缩短了dsp设计周期。
3 g.726语音编解码器在sopc中的实现
3.1 g.726标准算法的简化
本文设计的编解码器是在语音记录系统中实现g.726建议的速率为32kbps的adpcm算法,根据实际情况对算法进行了一些简化和改进。
具体简化如下:(1)由于此系统中编解码器的输入信号是线性pcm码,因此pcm码转换模块可以省略。(2)这个算法是用在单纯的语音存储中,可不进行单音/过渡音检测。(3)对量化器比例因子y(k)的更新进行简化。y(k)的更新计算为:
y(k)=al(k)yu(k-1)+[1-al(k)]yl(k-1) (1)
一般情况下,只有语音信号时,al(k)是趋于1的;当输入为平稳信号时,al(k)的值则在0至1之间。对语音存储系统,在输入只有语音的情况下可以粗略地认为al(k)的值近似为1,从而将计算得到的快速比例因子yu(k)直接作为新的比例因子y(k),即y(k)=yu(k-1),降低了算法的复杂度。
3.2 g.726算法在simulink中的建模
在simulink中利用altera dsp builder库模块建立用于fpga定点实现的模型。这里给出g.726编码器模型的设计。整个设计采用多层次结构,在顶层设计模型下包括多个子系统模块模型,如自适应量化器子系统模型、逆自适应量化器子系统模型、量化器比例因子自适应子系统模型等。下面重点分析编码器系统中的顶层设计模型及自适应量化器子系统模型。
3.2.1 编码器的顶层设计模型
顶层模型提供了对外的pcm语音接口,同时也提供了对avalon总线的接口,使得所设计的编码器模块可通过sopc builder集成为nios ii系统的一个外围设备。模型中的自适应量化器模块、逆自适应量化器模块、量化器比例因子自适应模块和自适应预测器模块均为hdl subsystem。编码器的顶层设计模型如图3所示。

图3 adpcm编码器模型

图4 自适应量化器模型 其中signalcompiler模块是dsp builder的心脏。其主要完成的功能包括:(1)将simulink设计转变成可综合的rtl级vhdl代码;(2)产生vhdl testbenches;(3)为leonardospectrum、synplify和modelsim第三方eda工具产生tcl脚本文件;(4)为quartus ii的仿真产生仿真矢量文件(.vec);(5)产生ptf配置文件,用于将设计自动地输给sopc builder工具。signalcompiler控制着设计系统的综合、编译和仿真的流程。
根据g.726语音算法的需求,系统需要两个时钟,分别为8khz和120khz,其中120khz用于自适应预测器子系统。因此需要在模型中利用锁相环模块pll实现多时钟设计,产生所需的两个时钟,dsp builder根据pll输出时钟的上升沿工作。在simulink设计图上不会显示时序模块的时钟引脚,而是当signalcompiler将系统转化为vhdl文件时才自动地把时序模块的时钟引脚与相应时钟相连。
3.2.2 编码器的自适应量化器子系统模型
自适应量化器模型如图4所示。自适应量化在对数域内进行,在用量化比例因子对差分信号进行规格化处理后,通过查找量化器规格化输入/输出特性表,即得到adpcm码。对数运算在simulink中的实现是借助于查找表的方式,使用dsp builder子库中的lut模块;规格化输入/输出特性表的实现是采用rom查表法的方式,用rom eab模块实现。
由于adpcm语音编解码算法最终要在fpga上实现,simulink的浮点值必须转换成定点值并能在目标硬件实现。硬件中表示定点值的位数以及小数点的位置不但会影响构成硬件系统的资源利用率,还影响系统的特性。本设计中根据信号的应用范围判定小数点的位置,并根据实际需要改变小数点右侧的位数,以节省硬件资源,灵活地应用总线控制库中的模块来对总线进行截位、增位、位提取或进行数据类型转换等操作,以达到所需求的精度。
3.3 g.726算法模型的仿真过程
利用matlab/simulink和dsp builder工具进行基于fpga的dsp设计需要进行一系列的仿真。在simulink中设计的模型首先要在simulink中仿真,不仅是验证模型的正确性,而且因为用于modelsim仿真的testbench文件中的输入信号激励是由signalcompiler根据simulink的仿真结果产生,并且只有仿真后利用signalcompiler转换产生的vec文件才有效。在simulink中完成仿真验证后,使用signalcompiler将模型进行设计转换。对于设计转换后产生的vhdl文件,必须进行rtl级仿真。因为simulink中模型仿真是算法级的,而生成的vhdl描述是rtl级的,两者描述的情况可能不完全符合,因此需要对生成的rtl级vhdl代码进行功能仿真。仿真可通过在modelsim中运行转换过程所生成的tcl脚本文件。最后可以利用转换过程生成的vec文件,在quartus ii软件中进行时序仿真。本设计对上述建模的语音编码器完成了仿真,simulink的仿真结果与modelsim的仿真结果基本一致,表明两者描述相符合;quartus ii的时序仿真结果表明所设计的语音编码器达到了预期的结果。
3.4 编解码器模块在sopc系统中的综合
编码器模型在quartus ii综合和编译后,可以使用sopc builder将其作为外围设备添加到nios ii系统中。signalcompiler生成的ptf配置文件可用于将设计自动地输给sopc builder工具。所设计的编码器出现在sopc builder的模块池中,将其添加到所创建的系统中即可。所建sopc系统元件页如图5所示,图5中只列出了语音记录系统的一部分组件。利用sopc builder即可生成一个完整的系统,最后生成编程文件,进行硬件的下载,完成g.726语音编码器在sopc中的设计。

图5 sopc系统元件页 由于dsp builder中的dsp基本模块以算法级的描述出现,而且采用simulink图形化界面,因此设计非常直观,实现了自顶向下的开发流程。与传统dsp开发相比,大大缩短了创建dsp设计的硬件的开发周期。设计的编解码器可作为nios ii系统的外围设备,通过sopc builder很方便地综合到sopc系统中。同时,由于设计是在基于fpga的sopc上实现,因此可以根据实际需求更改设计,对系统进行重配置,具有很高的灵活性。本g.726语音编解码器的性能基本上达到了设计要求。
评论