2019-11-15 09:33:17
3725
大家都知道无线对讲机可以分为模拟通信技术的模拟对讲机(也就是常见的传统对讲机)以及采用数字技术进行设计的数字对讲机。数字对讲机有许多优点,首先是可以更好地利用频谱资源。与蜂窝数字技术相似,数字对讲机可以在一个频点上承载更多用户,提高频谱利用率。其次是提高通话质量,数字对讲机可以在一个范围更广泛的信号环境中,实现更好的语音音频质量。基于这些特点,使数字对讲机成为对讲机发展的必然趋势。
数字对讲机语音编码算法的关键技术实现问题可以分为算法实现和硬件平台实现。算法实现主要是指将低速率语音编码算法应用于数字对讲机,而硬件平台实现主要是指将改进后的算法正确有效地在硬件平台上运行。
1
数字对讲机SELP语音编码算法
●算法概述:
SELP算法是建立在传统的线性预测模型的基础上,即通过线性预测分析分离激励贡献和声道贡献,激励信号则由清音成分和浊音成分在不同时间和不同频率上的混合组成的,混合信号经过一个慢时变的幅度调制得到激励信号,其中清音成分用白噪声很好的拟合,浊音成分在每个谐波处用一个频率变化的正弦信号合成,整个激励的浊音部分由一组不同幅度的正弦波信号叠加而成。
●编码器原理
SELP声码器算法属于参数声码器的范畴,此模型描述了5个语音参数,分别是:线性预测(Linear Prediction)系数、清浊音参数、激励能量参数、基音周期参数和余量谱幅度参数,5 个参数均为每帧提取一次。如下图所示,是SELP语音编码器的编码分析端框图。
●激励模型
假设Pn表示浊音成份,Vn表示清音成份, Hn 表示合成滤波器的冲击响应。则最终的合成语音Xn 可以表示成:
其中 ⊗ 表示卷积运算。
合成滤波器Hn通常采用极点模型来表示。假设Hn用M阶的极点模型来表示,其相应的Z变换为:
语音信号中的浊音成份Pn具有周期性,可以看成是一系列正弦波经过幅度调制后相互叠加的结果:
●解码器原理
所有参数都经过量化编码传输到解码端,解码端经过反量化后得到5个参数:线性预测系数、基音周期参数、能量参数、清浊音参数和10维谱幅度参数。采用分析端提取清浊音时的分带方式,在各个子带内分别合成激励。每个子带中,采用正弦信号合成浊音与白噪声信号模拟的清音信号叠加,通过合成滤波器后得到合成语音。解码器的合成框图如图所示:
2
数字对讲机简化SELP语音编码算法
●低复杂度正弦波模型
SELP 算法里将谱幅度参数固定为10维矢量,采用矢量量化传输此参数。为了降低编码器的复杂度,同时节省码本的存储资源,简化后的语音编码器采用了一种简单正弦波幅度模型,避免了参数提取和矢量量化过程。
●分子帧参数提取
为了保证低复杂度下的语音合成质量,采用分子帧的方法提取参数。在每个子帧内分别提取基音周期、清浊音信息和能量参数。而线性预测参数仍然在160点整帧内提取,阶数设定为10阶。
采用自相关方法求取基音周期,每次提取的窗长为200个点,其组成如下图所示。与整帧基音提取相同,子帧的基音周期也对应于自相关函数的极大值。预留子帧内5个极大值点作为备选基音周期,同时前瞻两个子帧,通过动态规划方法得到最终的基音周期。然后将窗向右移动80个点继续提取下一子帧的基音周期。
基音周期窗
子帧能量参数是基于余量信号进行提取的。语音信号经过LPC逆滤波器后得到余量信号 r(n) ,将余量信号在时间上分为前后子帧,分别计算其能量参数的。
●参数插值
编码器参数中的线性预测系数、清浊音信息和谱幅度参数,在帧间采用线性插值得到。设过去帧参数记为 par/old ,当前帧参数记为 par/new,则在合成第 k 点语音信号的参数值计算公式如式⑥所示。
对于对数域能量参数,首先将其转换到线性域按照式⑥进行插值,然后进行激励的合成。对于基音周期,则按(式⑦)进行插值。
通过帧间插值,保证了帧间语音参数的平稳过度,从而保证了语音的合成质量。
●基于分子帧方法的激励信号合成
激励由清浊音信号叠加而成,SELP 算法采用子带清浊音度对清浊音信号进行调制。清音信号由白噪声发生器产生,浊音信号由一组正弦谐波信号叠加生成,如式⑧所示。
得到清浊音两种激励信号后,分别通过由清浊度信息调制的5个带通滤波器,相加得到合成激励信号:
其中 ⊗ 表示卷积运算,hi(n) 表示5个子带带通滤波器的冲激响应e/p(n)和e/n(n)分别表示浊音激励和清音激励。
将两种经过增益调制后的信号分别通过由清浊度信息调制的带通滤波器相加,即得到合成激励信号。合成激励信号激励合成滤波器即得到合成语音。
数字对讲机语音编码算法的硬件平台实现
●对代码进行优化的必要性
程序中运算量最大的部分往往是循环,因此对循环的优化效果直接决定整个程序的运算量。如果一条指令需要前一条指令的执行结果,而这时前一条指令的结果还未达到有效状态,那么处理器就会等待。可以通过调整指令顺序的方法来避免流水线等待。另一方面,在函数调用时以及循环体内部这两个最耗费流水线资源的地方存在大量跳转语句,而跳转时会清空处理器的水线,所以在一个循环体内部,应尽可能少出现或者不出现跳转指令。
●对代码进行优化的方法
首先是 C 语言级别上的优化,主要的优化方法有:
1、循环的调整。对循环的调整主要是进行循环的展开。由于采用循环则意味着判断和跳转,从而耗费大量指令周期,直接采用顺序结构虽然使代码量有所增加,但指令周期数明显减少。
2、一些函数接口的调整。为了节省寄存器资源,而需要减少传递的参数个数。可以直接把一些常用的参数固定在被调函数中,既节省运算量又节省了寄存器。对汇编代码的优化则牵涉到 ARM 汇编本身的细节:
①期指令,虽然指令数增加了,但总的机器周期数可以减少。
②利用指令顺序的调整来解决流水线互锁的问题。这种方法在循环的优化中大量应用。
③充分利用通用寄存器,尽量避免内存读写,从而能够提高程序的运行速度。
④利用 ARM 提供的条件执行机制消除部分条件跳转指令。
2
数字对讲机码率控制算法
图 1、2、3 分别是“foreman”,“mobile”,“news”各序列使用本文算法和JVT-G012所产生的比特率的比较图,从各图中可以看出本文算法在码流输出算法更加的平稳。
针对数字对讲机的应用环境,改进的低复杂度的 2.4 k 低速率语音编码算法,对算法进行了简化,并在 ARM 嵌入式平台上对目标代码的实现进行优化。通过采用低复杂度的正弦波模型以及帧间内插等方法降低了算法复杂度,又通过分子帧的参数提取方式以及分子帧的激励信号合成保证了语音质量;另一方面通过对程序代码的优化,使得算法能够在 ARM 嵌入式平台上达到实用化。通过试验证明,经过优化后的客观语音测试结果略微有变化,而主观听音效果几乎未发生改变,但算法的复杂度得到了极大的下降。