iLBC语音编解码器的研究与实现.doc_第1页
iLBC语音编解码器的研究与实现.doc_第2页
iLBC语音编解码器的研究与实现.doc_第3页
iLBC语音编解码器的研究与实现.doc_第4页
iLBC语音编解码器的研究与实现.doc_第5页
免费预览已结束,剩余14页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

一、引言二、iLBC算法研究一般将编码速率低于4.6kbps的语音编码器称为低比特率编码器,而把编码速率介于4.6kbps24kbps的编码器称为中比特率编码器。按照这个划分标准,iLBC编码器属于中比特率编码器。iLBC算法基于码本激励线性预测这种参数编码方式,因此本章首先对基于码本激励线性预测算法的中比特率语音编解码器的组成结构及工作原理进行研究和探讨,在此基础上对iLBC算法进行研究,重点介绍其算法原理及特点。2.1中低速率语音编解码算法研究 3)iLBC算法简介参照ilbc白皮书自VoIP技术面世以来,业界对现存的低比特率编解码器标准的关注一直不断。VoIP应用主要在包交换的IP网络上进行传输,无法避免IP网络的丢包、延时、抖动等实时传输问题。2000年,Global IP Sound(GIPS)公司决定开发一种能够满足VoIP产业需求的编解码器,目标是利用GIPS内部的专业能力开发一款免授权费、专为数据包通信而设计,而且在理想无错情况和丢包情况下都能提供高音质的编解码器,并把它引入不同的标准化机构以符合互操作性的要求。这就是iLBC(Internet Low Bit Rate Codec)编解码器诞生的缘起。目前大多数的语音编码都是基于码本激励线性预测(Code Excited Linear Prediction, CELP)编码模型的,例如ITU G.729、G.723.1和3GPP-AMR。CELP一直都被视为在交换网络中以低比特率电路获得高质量的一种非常成功的方法。这种编码方法具有高效性,主要是由于它利用了连续语音片段之间的互相依赖性,因此CELP编码的性能主要取决于前面编码的历史。CELP编码器是基于存储器的,故丢包或延迟所造成的误差会扩散开来,结果是单个丢包会影响到随后多个数据包的质量,这显然是数据包通信的一大缺陷。iLBC本质上式一种基于帧的线性预测编码方法,是对CELP的一种发展,其独有的动态码本更新技术、语音增强技术和丢包掩蔽技术使其在VOIP中应用时有更好的性能。iLBC是专为提供文件的IP语音通信而开发的语音编解码器,以窄带语音为色合计基础,具有8kHz的采样率。iLBC支持两种基本的帧长度:13.3kbps比特率下编码帧长度为30ms;15.2kbps比特率下编码帧长度则为20ms。编码前帧长编码后比特率格式1采样率:8kHz16bits/sample20ms(2560bits)304bits15.2kbps格式230ms(3840bits)400bits13.3kbpsiLBC的帧格式采用iLBC算法可以获得一个具有丢包相应控制的语音编码系统。iLBC对每一个数据包的处理都能够独立于其他数据包来进行,是数据包通信的理想选择。即使IP丢包和/或延迟现象的恶化,这种编解码器的语音质量下降情况也不会太差。这与基于CELP模型的一般编解码器的行为不同,这类编解码器最先是为交换电路网络或无线网络而设计的,是设计来恢复位错误而非丢包的。2.3.1编码器参照ilbc标准iLBC编码器本质上式一种基于帧的线性预测编码方法。编码器的输入为采样率为8kHz ,每个样点为16bit的单声道PCM语音数据。该数据被分为若干帧,每帧包含有160/240(20ms/30ms)个样点。iLBC编码器主要进行以下操作:1)将每帧分为4/6个子帧,每个子帧包含40个样点。对30ms的帧,进行两次10阶的线性预测编码(LPC)分析,得到相应的LPC系数。对于20ms的帧,进行一次10阶LPC分析。2)将每次分析得到的LPC系数转化为线谱对(LSF)系数,并对LSF系数进行量化、内插得到每个子帧的LSF系数。通过该量化内插后的LSF系数得到对应的LPC系数,即得到各子帧对应的线性预测分析器,通过对各个子帧的线性预测,得到各个子帧的残差。3)选择残差中能量最大的两个连续子帧。这两个连续子帧的首部57/58(20ms/30ms)个样点被选定为本次处理的初始状态。对于浊音语音,这样的选取方式将至少包含一个基音脉冲。4)对初始状态进行基于DPCM的标量量化,其结果作为编码输出的一部分。同时,将初始状态存入码本存储区,以构成动态码本的初始值,用于对本帧剩余样点进行矢量量化。5)对于剩余的残差,矢量量化将按以下顺序进行:包含有初始状态的两个连续子帧中剩余的23/22个样点;时间轴上位于初始状态之后的各个子帧;时间轴上位于初始状态之前的各个子帧。对于此矢量量化,每次的搜索码本范围是动态码本,动态码本中存储了已经被编码的对象,并随着最新的解码结果,该动态码本被更新。6)对编码结果进行打包处理。下图为iLBC编码器原理图。2.3.1.1 预处理在某些应用当中得到的语音数据包含直流或者50、60Hz的噪声,可以在信号输入编码器之前通过高通滤波器来消除这些信号ilbc语音算法研究及dsp实现,参考文献10。通常使用截止频率为90Hz的1阶极点/零点滤波器,其一般定义如下:其中,a、b均为常数。2.3.1.2 LPC系数计算、量化及内插进入LPC分析模块的数据是刚刚经过预处理的数据流。8k采样率16bit表示的PCM数据流输入编码器,被分割成帧长为160/240个样点的一系列帧,每个帧又被分为4/6个连续的子块,每个子块包含40个样点。对于30ms的帧,编码器将做两次阶数为10的LPC分析。第一次分析一个对称平滑窗,重心在第二个子块上。第二次分析一个非对称平滑窗,重心在第五个子块上。对于20ms的帧,仅存在一次LPC分析,采用的平滑窗重心在第三个子块上。每次分析都是通过自相关法以及Levinson-Durbin算法得到10阶线性滤波器的系数。每一次LPC分析,得到线性滤波器的系数之后都需要将其映射到一个LSF(Line Spectral Frequencies)集合,量化内插后得到LSP(Line Spectral Pair)集合。之所以这样是因为线谱对系数更利于量化和内插,即对量化误差不敏感,具有良好的鲁棒性。线谱对系数的量化利用的是三级分割矢量量化技术,10个系数分量被分割成3、3、4的子集,然后每个子集分别通过常规的矢量量化方式得到量化结果。量化完毕后,需要对LSF系数进行重排序,按照下标顺序依次从小到大,目的是最终结果反映出来的滤波器具有稳定性。LPC分析方法是目前低比特率语音编码技术的基础,在实现时主要基于10阶线性预测(Linear Prediction)滤波器ilbc语音算法研究及dsp实现,参考文献11。滤波器的定义如下:其中,是量化后的LP系数。1. 自相关系数计算LPC分析的第一步就是使用窗口化语音采样来计算自相关系数。我们以30ms帧为例,它包含了两个自相关系数集合,因此每个自相关系数的计算都要通过不同的窗口化操作。自相关系数的第一个窗口采用的是标准对称汉明窗,由两部分组成,其数学函数如下:其中=240/300(分别对应20ms帧和30ms帧),为存放语音采样点的数组。自相关系数的第二个窗口采用的是非对称窗口,其定义如下:通过对预处理后的数据进行加窗处理后进行自相关运算得到自相关系数。2. 计算LPC系数由两组11个平滑的自相关系数acf1和acf2,根据Levinson-Durbin算法可以计算出两组11个LPC系数lp1和lp2。为了达到平滑频谱峰值的目的,可以 通过以下函数来修正LPC系数,其定义如下:其中,是0到1之间的实数,推荐使用0.9。3. LSF系数的计算及量化将计算出的LPC系数转化为线谱频率(Line Spectral Frequencies,LSF)系数。然后使用三级分割矢量量化技术对LSF系数进行量化,10个系数分量被分割成3,3,4的子向量,每一个子向量都可以使用常规的标量量化进行量化。量化结束后,在向量分割的边界对LSF系数进行重排序,以保证编码器和解码器使用相同的LSF表示。4. LSF系数插值对于每一帧语音采样计算出两个LSF系数集合,通过一个10阶的FIR滤波器插值每个子块可以得到不同的LSF。每一个子块的LSF系数插值后可以转化为LPC系数。未量化的和量化后的LPC系数分别来自两个滤波器,子块的未量化的分析滤波器定义如下:子块的量化后的分析滤波器定义如下所示:2.3.1.3. 计算残差信号通过LPC分析滤波器系数的量化和插值来计算残差信号。尤其对于每一个40采样的子块来说,LPC分析滤波器被用来过滤相同采样的子块。每个子块的过滤存储被带到下一个子块的LPC滤波器。每个LPC分析滤波器的输出信号组成对应子块的残差信号。为了使得输出的残差信号更加平滑,通常添加一个感知加权滤波器来平滑频谱。在iLBC算法中,为了降低算法的复杂度,定义感知权重滤波器如下:其中,是由子块未量化但插值后的LSF系数所得到的滤波器。2.3.1.4 起始态确认及量化从能量上衡量残差信号中最大的两个连续子块将被视为起始态的粗略位置。起始态就是这两个连续子块的前57/58个样点或后57/58个样点。最终选择决定于哪一端的能量更大。针对选中作为起始态的这些样点,需要对其做归一化处理。在归一化之前用一个全通滤波器对其做相位杂散处理,这样做是的在残差信号序列中,样点的分布规律更具偶对称特性。滤波通过时域中的圆周卷积来完成,从滤波后的响应序列当中选出幅度最大的样点,对数化后进行64级标量量化。以量化值作为依据导出归一化因子。如下图所示,对归一化后的起始态样点值做感知加权,目的是使得语音频谱不因为归一化操作而变得过于尖锐。加权后的样点经过差分PCM量化编码完成最后的起始态编码。其中为感知加权滤波器,为全通滤波器。起始态样点的DPCM量化2.3.1.5 码书编码对于除去起始态的那些样点,余下的样点需要通过动态码书来编码。编码基于一个自适应的码书,已编码的语音数据在编码端临时解码得到LPC激励信号,将它们缓存在一块固定的内存中,按照一定的规则选取这块内存中的样点序列,就能得到用于编码下一块数据的自适应码书。这样做是利用了语音信号的短时平稳性。具体编码过程主要包括以下几部分:首先,对目前已编码的残差信号进行解码,用没有感知加权处理的码书。码书内存建立:利用刚解码出来的数据填充缓冲内存,为创建自适应码书做准备。需要注意的是在起始态前面和后面的不同子块在内存中相应的排序时相反的。感知加权滤波:对码书内存中的数据和目标残差信号进行感知加权滤波。查找匹配码书:在码书中查找和目标残差信号最匹配的码字,进而计算出优化的增益并对此增益进行量化。目标更新:从感知加权内存中选出的变量乘以计算出来的增益得到一个预测残差,从感知加权过后的目标残差中减去此预测残差得到所谓更新了的目标残差信号。该过程反复两次。基本流程大致如下图所示:编码器端码书检索流程2.3.1.6 打包对编码结果按照规定的格式来打包。对于20ms的帧,使用304bit表示编码结果,数据速率为15.2kbps;对于30ms的帧,使用400bit表示编码结果,数据速率为13.3kbps。编码器编码的比特流的分配情况如下表所示:编码比特流分配表参数比特分配20ms帧30ms帧线谱对参数(LSF)2040初始状态位置标号23初始态起始位置11初始状态比例因子66初始状态标量量化17117422/23采样块码本搜索212122/23采样块增益1212码本子块索引4694子块增益2448空帧指示位11总和3044002.3.2解码器 iLBC解码器使用分析合成方法,解码过程就是参数重建的过程。首先对LSF系数进行内插并经过稳定性检查后得到重建的LPC滤波器系数;再重建起始状态,剩余的残差信号首先重新建立码书,再直接根据提取得到的码书索引,查到码书中每一级译码的残差信号。根据参数重构语音后,iLBC解码器还会进行重构后处理,由于算法针对每一帧独立编码,因此非常适合使用PLC(丢包掩蔽)。另外,对解码重构后的激励信号进行语音增强来提高接收语音的质量。通过运行综合滤波器过滤解码语音块或丢包掩蔽处理过的LP(线性预测)激励块就可以得到解码后的语音。因为增强器造成了延迟,使得这一步滤波器的系数产生移位,对20ms模式移位40个样点,对30ms模式移位80个样点。对包丢失的情形,使用最后一次正确接收的LP系数。最后对语音信号通过截止频率为65Hz的高通滤波即可输出。解码流程如下图所示:iLBC解码流程图2.3.2.1 参数解码1. 线性预测滤波器重建线性预测器的解码是非常直接的,给出3或6个下标系数(分别对应20ms和30ms模式),通过查表可以很容易得出相应的LSF向量ilbc语音算法研究及dsp实现,参考文献19。对于每一个LSF向量,它的三个独立的分隔向量通过组合可以得到量化后的LSF系数。将LSF系数进行插值并经过稳定性检查后就可以得到LPC系数。2. 构造起始状态进行起始状态解码,解码结果一方面可以作为激励信号暂存,另一方面存入码本存储区,以构成动态码本的初始值。为了弥补早期过滤操作的失真,解码过程中使用全通滤波器来过滤子块。3. 构建残差信号解码残差信号时首先解码起始状态之前的子块,然后解码起始状态之后的子块,直到所有的子块解码结束,并使用解码结果更新动态码本。对于每个子块的解码采用了多级自适应码本技术,它依赖于自适应码本解码时构建的自适应码本存储,用来在残差信号域生成一个合成信号并最终用来生成合成语音。2.3.2.2 重构语音后处理1. 丢包隐藏iLBC编解码器使用动态抖动调整缓冲来判断数据包是正确接收还是丢失。如果接收到的数据包正常,就执行解码操作,并把该包的LPC滤波器系数和完整的激励信号保存在解码状态结构中;否则使用丢包隐藏技术(Packet Loss Concealment,PLC)处理丢包。PLC根据前一个块的解码状态信息,针对不同情况分别处理:1)如果前一个包和当前包都正确接收到,PLC模块保存当前包的参数。2)如果当前包没有收到,那么替代这个包的激励信号基于基音同步,重复前一个正确收到的报,将混入一个随机的激励信号以避免出现不悦耳的嗡嗡声,前一个正确接收到的包的状态仍然保留。3)如果前面的包没有正确收到,而当前包正确收到,那么需要找到当前包激励信号和前一个正确的激励信号相位重叠的位置,使语音平滑过渡。2. 语音增强由于解码重构得到的激励信号还不能直接用于激励LPC滤波器,必须采用语音增强措施,因此解码器包含了一个语音增强单元,用来对重构的激励信号进行操作。它通过减少语音段的噪声增加了重构语音的感知音质。与其它解码器不同的是,它可以很细微的修改激励信号。虽然语音增强改善了语音质量但增加了浊音信号的周期长度。所以,必须使用限定条件的语音增强。增强的标准时已增强的激励信号和没有增强的激励信号之间的差别不大,用公式表示如下:而 其中,“”表示点乘,表示斜度周期同步序列向量。语音增强的具体步骤如下:首先计算激励信号自相关,大致确定基音周期;然后对样点做4倍上采样,再得到精确到1/4采样周期的基音周期和基音同步序列;最后计算平滑激励,如果线性组合和原序列差别过大则重新计算增强后的序列,该序列将是未增强信号和平滑信号的线性组合。3. 高通滤波 为了消除合成语音中的低频率语音信号,在解码器中添加了一个截止频率为65Hz的高通滤波器,并让合成后的语音通过高通滤波器过滤。4) iLBC的关键技术(可选,凑字数)2.4.1语音增强部分2.4.2差错隐藏部分5)几种语音算法对比,iLBC的优势。iLBC是一种窄带语音编解码器,使用了整个4kHz频带,而大多数标准低比特率编解码器只利用了从300Hz到3400Hz的频带。这一点对音质的影响是相当明显的。此外,iLBC语音编解码器的频谱特性精确模拟了原始信号的特性,其语音比标准低比特率编解码器的更自然清晰。GIPS公司和一些独立实验室对编解码器的若干性能进行了评测。2002年,Dynastat公司对iLBC实施了正式的听力测试。2003年,AT&T的音质评估实验室(Voice Quality Assessment Lab, VQA)也对iLBC编解码器进行了广泛的测试。下图所示为Dynastat的评估结果,其根据现有编码标准G.729A和G.723.1对iLBC的30ms模式进行了标准测试。结果明显表明,用于实际环境时,iLBC的性能卓越,即使在恶劣的网络条件下,其固有的数据包网络属性也能提供很高的质量。(MOS的解释,iLBC语音算法研究及DSP实现, p30) 对iLBC、G.729A、G.723.1进行比较的结果在网络中出现丢包的情况下,iLBC采用丢包掩蔽技术对丢失的数据进行恢复,使得其在此种情况下仍能保持较好的性能。下图为在丢包情况下iLBC与G.729和G.723解码器在丢包情况下的性能比较。对iLBC、G.729、G.723在丢包情况下进行比较的结果下图的测试还显示了iLBC不仅在丢包条件下的性能显著优于目前的标准编解码器(G.729、G.723.1、G.728、GSM等),而且还等于甚至优于理想信道(无丢包)条件下的标准编解码器。丢包和理想信道情况下几种编解码器的性能比较 AT&T的测试结果也显示,在iLBC中,20ms和30ms模式之间没有显著的性能差异。而在丢包情况下,20ms模式甚至表现出更好的丢包稳健性。AT&T VQA实验室也表示,iLBC在存在背景噪声时的性能十分优秀,可媲美信道无丢包的G.729.E。总而言之,在相同的包交换通信条件下,iLBC的语音质量效果比G.729、G.723.1以及G.711更好,声音更加圆润饱满,且丢包率越高,iLBC在语音质量上的优势就越明显。iLBC算法为数据包网络实现了尖端的固定比特率编码,在质量与比特率之间取得了非常出色的平衡。三、基于MIPS的嵌入式开发平台3.1 嵌入式处理器嵌入式系统的核心是各种类型的嵌入式处理器。嵌入式处理器的体系结构经历了从CISC(复杂指令集)至RISC(精简指令集)和Compact RISC的转变,位数则由4位、8位、16位、32位逐步发展到64位。目前常用的嵌入式处理器可分为低端的嵌入式微控制器、中高端的嵌入式微处理器、用于计算机通信领域的嵌入式DSP处理器和高度集成的嵌入式片上系统。目前全世界嵌入式处理器已经超过1000多种,流行的体系结构有30多个系列,其中以MIPS、ARM、PowerPC、MC68000等使用的最为广泛。3.2 MIPS32 24KEc处理器MIPS是世界上很流行的一种RISC处理器。MIPS的意思是“无内部互锁流水级的微处理器”(Microprocessor without interlocked piped stages),其机制是尽量利用软件办法避免流水线中的数据相关问题。它是在80年代初期由斯坦福大学Hennessy教授领导的研究小组研制出来的基于双mips平台的嵌入式多媒体通信终端设计,参考文献29。MIPS处理器的用途很广,在通用方面,MIPS R系列微处理器用于构建SGI的高性能工作站、服务器和超级计算机系统。在嵌入式方面,MIPS K系列微处理器也获得了广泛的应用。目前世界上72%的VoIP设备、76%的电缆机顶盒、70%的DVD刻录机、95%的电缆调制解调器都是基于MIPS体系结构的。MIPS32 24KEc微处理器内核是MIPS32 24KE处理器族的成员,是一款面向SoC应用设计的高性能、低功耗、32位RISC处理器内核,其结构如下图所示:MIPS32 24KEc微处理器内核结构MIPS32 24KEc微处理器内核具有如下特性:1. 采用32位MIPS指令集合,同时支持MIPS16E指令压缩技术。MIPS32 24KEc处理器采用MIPS32 Release 2架构,支持32位数据以及地址操作,具有硬乘加/乘减单元。2. 五级流水线结构。MIPS架构是为流水线而造。只要CPU运行时使用Cache,每条MIPS指令的执行就分为取指、执行、内存操作、对齐和写回五个阶段,每个流水段花费一个固定的时间。这段时间通常是一个处理器始终周期。所有指令严格定义以保证能按照相同的流水段顺序,甚至于这条指令在某个阶段什么也不做。结果是只要Cache保持命中,CPU平均每个时钟周期执行一条指令。3. Cache结构24KEc处理器采用大小可配(064KB)的指令Cache和数据Cache,用于在处理器与主存储器之间存放当前被使用的主存部分的内容,以减少访问主存的等待时间。处理器取指令或操作数时,首先在Cache中进行地址比较,一旦命中便不再访问主存,极大减少了处理器等待时间。4. 可编程内存管理单元(MMU)24KEc处理器采用32位地址,寻址空间可达4GB。MIPS处理器对地址的使用方式同传统的CISC处理器有些细微不同。在24KEc CPU里,程序中的地址永远不会是芯片真正访问的物理地址,因而分别叫:程序(虚拟)地址和物理地址。对于MIPS的内存管理单元最重要的是MIPS处理器没有x86处理器的实模式,MIPS CPU是通过TLB(Translation Lookaside Buffer)来转译所有CPU产生的虚拟地址。24KEc处理器包含了一个4通道的指令TLB和一个4通道的数据TLB,以及一个能容纳32个页面的JTLB,在大部分情况下可以无须访问页表直接获得访问的物理地址。5. JTAG/EJTAG24KEc处理器内建了调试单元,可以方便地通过边界扫描协议操纵各引脚的状态。还可以通过EJTAG方式实现断点、单步等调试功能,方便开发。3.3 嵌入式Linux操作系统嵌入式操作系统是一种支持嵌入式系统应用的操作系统软件,它是嵌入式系统极为重要的组成部分,通常包括与硬件相关的底层驱动软件、系统内核、设备驱动接口、通信协议、文件系统等。嵌入式操作系统具有通用操作系统的基本特点,如能够有效管理越来越复杂的系统资源;能够把硬件虚拟化,使得开发人员从繁忙的驱动程序移植和维护中解脱出来;能够提供库函数、驱动程序、工具集以及应用程序。与通用操作系统相比较,嵌入式操作系统在系统实时高效性、硬件的相关依赖性、软件固态化以及应用的专用性等方面具有较为突出的特点。到目前为止,已经有上百种嵌入式操作系统面世。Linux是一套以Unix为基础发展而成的操作系统。自1991年诞生至今,Linux在很多方面已经赶上甚至超过了许多商用的Unix系统。它充分利用了x86 CPU的任务切换机制,实现了真正的多任务、多用户环境。Linux对硬件的配置要求相当低,能够在4M内存的386机器上很好的运行。而且可以支持很多种处理器芯片。此外更为重要的是,很多研究人员愿意在Linux上开发程序,并且随时对Linux的开放内核进行升级和修补,很多bug可以很快得到检测和修复。3.4 uclibc gcc编译器四、iLBC算法的工程实现本文中所采用的iLBC语音压缩编解码算法制定者只给出了一个基于C语言的浮点算法参考代码,而MIPS32 24KEc芯片是定点处理器芯片。其内部的RAM容量受到芯片面积的限制,因此应使代码尺寸尽可能的小。另外由于该算法主要应用在视频通话中,对语音的实时性要求比较高。所以对最终代码的要求为:定点算法、尺寸尽可能小、实时性高。综合以上几点,在应用的过程中,要实现以下两种代码转换:1把参考的浮点C语言代码转化为定点C语言代码,用定点处理器实现浮点运算,可以通过Q值定标的方法来实现。2. 把修改后的定点C语言算法移植到基于MIPS处理器的开发平台上。由于MIPS处理器的开发平台有着空间和时间的双重限制,所以首先需要通过合适的优化方法优化代码尺寸,然后对代码性能进行测试,如对代码的运行速度等进行优化,保证代码的实时性。4.1浮点算法的定点化4.1.1 Q格式定标在数字硬件里,数据是以二进制字的形式存储的。一个二进制字是一个固定长度的比特串(0,1串)。硬件单元或软件功能模块如何解释这一串0,1序列是由数据类型定义的。二进制数据可以表示定点数据或浮点数据。在定点DSP芯片中,采用定点数进行数值运算,一个定点数据的特性由字长、二进制小数点的位置和是否有符号位决定,二进制小数点的位置决定了二进制数值的度量和解释。由于MIPS32 24KEc芯片是定点处理器芯片,参与运算的数都是整形数,而iLBC的编解码过程中需要大量的小数运算,这种情况下运算的关键就是由编程者自己确定小数点的位置,这就是数的定标。通过设定小数点在数中的位置就可以表示不同大小和精度的小数。一般来说小数的定标方法采用Q格式表示法,同时数值的最高一位作为该数的符号位,“1”表示负数,“0”表示整数。对一个用Qn表示的小数,其小数点的位置在从右数第n位上。可以看出,即使是同一个数据,如果定标位不同,其数值大小就不同。在数值动态范围较大的场合,必须牺牲数值精度来满足动态范围;相反在数值精度要求比较高的场合,必须牺牲动态范围来满足精度的要求。例如Q0的动态范围在-32768,32767之间,其精度为1,此时定点数在数值上等于浮点数;Q15的动态范围在-1,0.9999695之间,其精度为1/32768=0.00003051。因此,动态范围与精度是一对矛盾,在实际的定点算法中为了达到最佳的性能,必须充分考虑从而选择适当的定标。Q格式表示法的数值范围表【iLbc语音增强模块算法29】如下。M,N表示法中,M表示了整数的位数,N表示了小数的位数,Qn与M,N表示法表达的定点数格式是等价的。表4-1 数值的Q值与其数值范围Q值M,N表示法数值范围Q151,15Q142,14Q133,13Q124,12Q115,11Q106,10Q97,9Q88,8Q79,7Q610,6Q511,5Q412,4Q313,3Q214,2Q115,1Q016,0如果数据的值超出了Q0值所能表示的范围,可以用整数位扩展的双精度数或者多精度数来表示,即二进制总长度为32位或以上。类似的,如果Q15不足以满足变量的精度要求,可以用小数位扩展的双精度数来表示。Q值的估算通常有两种方法,理论分析法和统计分析法。对于某些变量,动态范围可以通过理论分析法确定。对于理论上无法确定范围的变量,一般采用统计分析的方法来确定其动态范围,即用足够多的输入信号的样本值来确定程序中变量的动态范围。下图是iLBC算法中主要变量的动态范围与定标值。表4-2 iLBC算法中主要变量的动态范围与定标值数据所在模块数据名数据物理意义数据理论范围定标值备注data输入语音帧-32768,3276716,0数据输入自相关系数计算lpc_winTbl加密函数-1,11,15r自相关函数-232,23232,0经放缩Dubin算法aLPC系数-16,164,12K反射系数-1,11,31双精度T1临时变量-32,325,27双精度带宽扩展运算chirp扩展因子-1,11,15LPC系数转为LSFlsf线谱频率参数0,pi3,13p中间多项式参数-32,325,11q中间多项式系数-32,325,11grid搜索表格-1,11,15ylow,yhigh切比雪夫多项式值-16,164,12LSF矢量量化lsfdeq量化后的LSF系数0,pi3,13dist矢量的距离-32,325,27稳定性检测eps保证稳定性的增量-1,11,15LSF内插coef内插系数-1,11,15T0中间变量-8,83,29LSF转化为LPCf1中间多项式系数-64,646,26f2中间多项式系数-64,646,26分析滤波器L_tmp中间变量-16,164,28初试状态选取sampEn_win加权系数-1,11,15fssqEn前向能量值-232,23232,0经放缩bssqEn后向能量值-232,23232,0经放缩码本搜索residual残差值-215,2151,15gain增益值-4,42,144.1.2 浮点函数到定点函数的转换为了能够最终在MIPS32 24KEc芯片上实现算法,需要将标准参考代码中的浮点C代码转换成定点C代码,将原本的浮点函数用相应的定点函数来代替,把一些基本的运算,如双精度乘法,正弦函数求值,求余弦值及求指数对数运算等进行定点的实现。表4-3中列出了程序中需要修改为定点的运算函数。表4-3 定点化函数的实现函数返回值功能说明Add(Word16, Word16)Word16单精度加法Sub(Word16, Word16)Word16单精度减法L_add(Word32, Word32)Word32双精度加法L_sub(Word32, Word32)Word32双精度减法Saturate (Word 32)Word16舍入运算Mult(Word16, Word16)Word16整数惩罚L_mult(Word16, Word16)Word32小数乘法L_mac(Word32, Word16, Word16)Word32乘累加L_msu(Word32, Word16, Word16)Word32乘累减Shl(Shr)(Word16, Word16)Word1616位左(右)移位L_shl(L_shr)(Word32, Word16)Word3232位左(右)移位norm_s(Word16)Word1616位归一化(使符号位只有一位)norm_l(Word32)Word3232位归一化(使符号位只有一位)Pow2(Word16, Word16)Word32以2为底的指数函数Sqrt(Word32)Word32开平方函数下面的代码是单精度加法函数的定点化实现:Word16 Add (Word16 var1, Word16 var2) Word16 var_out; Word32 L_sum; L_sum = (Word32) var1 + var2; var_out = Saturate (L_sum); return (var_out);其中,Saturate函数完成舍入运算,将32位整数舍入到16位整数,即返回值的范围为-32768,32767。4.1.3信号缩减在浮点算法转换为定点算法后,信号会有发生溢出的可能,所以,在语音信号编码之前,需要进行信号缩减以减小实现定点算法时发生溢出的可能。信号缩减就是在发送端将输入信号除以2,然后再进行其它处理。在接收端,将解码后得到的信号乘以2,以恢复原始信号用于输出。 4.2 MIPS平台的移植4.2.1 Linux平台下交叉编译本文采用的嵌入式开发平台基于Linux操作系统,为了将iLBC编解码器移植到MIPS开发平台下,需要对代码进行交叉编译。交叉编译这个概念的出现和流行是和嵌入式系统的广泛发展同步的。我们常用的计算机软件,都需要通过编译的方式,把使用高级计算机语言编写的代码(比如C代码)编译(compile)成计算机可以识别和执行的二进制代码。比如,我们在Windows平台上,可使用Visual C+开发环境,编写程序并编译成可执行程序。这种方式下,我们使用PC平台上的Windows工具开发针对Windows本身的可执行程序,这种编译过程称为native compilation,中文可理解为本机编译。然而,在进行嵌入式系统的开发时,运行程序的目标平台通常具有有限的存储空间和运算能力,为了解决这个问题,交叉编译工具就应运而生了。通过交叉编译工具,我们就可以在CPU能力很强、存储控件足够的主机平台上(比如PC上)编译出针对其他平台的可执行程序。在本文中,采用mipsisa32r2-uclibc-gcc交叉编译器可以在主机上编译生成在MIPS平台上的可执行程序,实现代码从主机到MIPS嵌入式开发平台的移植。4.2.2 大小端转换大端模式,是指数据的低位保存在内存的高地址中,而数据的高位保存在内存的低地址中;小端模式是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中。DEC (Digital Equipment Corporation,现在是Compaq公司的一部分)和Intel的机器(X86平台)一般采用小端。IBM, Motorola(Power PC), Sun的机器一般采用大端。本文采用的主机(PC机)是Intel X86平台,是小端模式,而MIPS嵌入式开发平台是大端模式,所以需要将代码进行从小端到大端的转换。由于语音信号用16bit数据表示,即在MIPS平台上,数据的高8位(MSB)存放在内存的低地址,而数据的低8位(LSB)存放在内存的高地址。16位数据从小端到大端的转换代码如下所示:Word16 swap(Word16 data) Word16 tmp; tmp = (data8) & (0x0000ffff); data = (data8) & 0xffff0000) | tmp; return data;4.2.3 地址对齐处理现代计算机中内存空间都是按照字节划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这就需要各种类型的数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。由于各个硬件平台对存储空间的处理上有很大的不同,一些平台对某些特定类型的数据只能从某些特定的地址开始存取。比如有些架构的CPU在访问一个没有进行对齐的变量的时候会发生错误,那么在这种架构下编程必须保证字节对齐。其它平台可能没有这种情况,但是如果不按照适合其平台要求对数据存放进行对齐,会在存取效率上带来损失。在MIPS平台下,每次读取都是从偶地址开始,如果一个int型存放在偶地址开始的地方,那么一个读周期就可以读出这32bit,但如果存放在奇地址开始的地方,则需要两个读周期,并对这两次读出结果的高低字节进行拼凑才能得到该32bit的数据,显然在读取效率上下降很多。备选:语音增强算法和差错隐藏算法的展开说明五、结果测试、误差分析、优化 在iLBC的编码模块和解码模块都由浮点算法转换为定点算法后,首先需要对编解码模块的正确性进行测试。iLBC编解码器的测试与G.729编解码器的测试不同,后者有官方的测试序列,只要转换后的代码通过了测试序列,就说明代码正确无误。iLBC编解码器没有标准的测试序列,所以测试主要是以浮点算法为基准,当输入相同的语音数据时,若定点代码的结果与浮点代码的结果一

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论