g.729 spirit dsp定义:
音频压缩编码
1、什么是语音编码技术?其发展与现状是怎样的?
答: 语音信号的数字化传输,一直是通信的发展方向之一。采用低速率语音编码技术进行语音传输比语音信号模拟传输有诸多优点,现代通信的发展趋势决定了语音编码技术的两大突出优势:
编码的过程首先用一组脉冲采样时钟信号与输入的模拟音频信号相乘,相乘的结果即输入信号在时间轴上的数字化。然后对采样以后的信号幅值进行量化。最简单的量化方法是均衡量化,这个量化的过程由量化器来完成。对经量化器A/D变换后的信号再进行编码,即把量化的信号电平转换成二进制码组,就得到了离散的二进制输出数据序列x ( n ),n表示量化的时间序列,x ( n )的值就是n时刻量化后的幅值,以二进制的形式表示和记录。
3、数字音频的技术指标有哪些?
答:
1)采样频率:采样频率是指一秒钟内采样的次数。采样频率的选择应该遵循奈奎斯特(Harry Nyquist)采样理论(如果对某一模拟信号进行采样,则采样后可还原的最高信号频率只有采样频率的一半,或者说只要采样频率高于输入信号最高频率的两倍,就能从采样信号系列重构原始信号)。
根据该采样理论,CD激光唱盘采样频率为44kHz,可记录的最高音频为22kHz,这样的音质与原始声音相差无几,也就是我们常说的超级高保真音质。通信系统中数字电话的采用频率通常为8kHz,与原4k带宽声音一致的。
2)量化位数:量化位是对模拟音频信号的幅度轴进行数字化,它决定了模拟信号数字化以后的动态范围。由于计算机按字节运算,一般的量化位数为8位和16位。量化位越高,信号的动态范围越大,数字化后的音频信号就越可能接近原始信号,但所需要的存贮空间也越大。
3)声道数:有单声道和双声道之分。双声道又称为立体声,在硬件中要占两条线路,音质、音色好,但立体声数字化后所占空间比单声道多一倍。
4)编码算法:编码的作用其一是采用一定的格式来纪录数字数据,其二是采用一定的算法来压缩数字数据以减少存贮空间和提高传输效率。压缩算法包括有损压缩和无损压缩;有损压缩指解压后数据不能完全复原,要丢失一部分信息。压缩编码的基本指标之一就是压缩比,它通常小于1。压缩越多,信息丢失越多、信号还原后失真越大。根据不同的应用,应该选用不同的压缩编码算法。
5)数据率及数据文件格式:数据率为每秒bit数,它与信息实时传输有直接关系,而其总数据量又与存储空间有直接关系。
我自己对音频编码一些理解
语音编码分成波形编码、参数编码和混合编码.波形编码就是语音信号形成的波形进行处理和加工,参数编码是以语音信号产生的数字模型为基础,求出其模型参数,然后按照这些参数还原数字模型,合成语音。混合编码是综合了波形编码和参数编码的长处,在4-16kbps的速率上进行高质量的语音合成。例如多脉冲激励线性预测编码(MPLPC),码本激励线性预测编码(CELP)都是混合编码。
人耳的听觉范围在20-20KHZ,根本抽样定律要保证声音不失真,就必须用44KHZ左右采样频率,但是人说话的范围在300-3400HZ,所以就用8KHZ主要对人声采样。
波形编码前,首先对模拟语音信号进行采样,然后对采样结果进行幅度量化,再进行二进制编码。
参数编码则是对数字模型的参数进行求值,目前常用的是无损声管离散时间模型,该模型综合了人声的最重要三个因素:声门,激励和辐射。这三个因素都可以用数学函数表达。再加上在语音信号的非均匀性和相关性,非均匀性表现在小幅度信号出现的概率较大,相关性表现在相邻的两个样本点相关和相隔基音周期之间的两个样本点也相关。线性预测就时利用了相关性从原来的语音信号计算出现在的信号。而且人在正常的交谈中有50%的时间是静音,只在听对方讲话,语音检测VAD就是用来判断是否是静音,而柔和噪声再生CNG就是用来产生一个“好听”的静音传给对方,
G.729与G.723是ITU制定的适用于IP电话语音编码,因为其高质量,低码率而得到广泛应用,下面分别做介绍:
G.729是ITU制定通过的8kbps的语音编码协议,换算成字节才1k,它采用共轭结构的算术码激励线性预测(CS-ACELP)。
G.723也是ITU制定的,不过它是双速率语音编码,它可以工作在5.3kbps和6.3kbps两个方式上,相应分别采用代数码激励线性预测(ACELP)和多脉冲最大似能量化(MP-MLQ)。
在ITU上注册一个帐号便可以下载现实的C源代码和描述文档,在VC 6下编译并运行,却发现编码效率太低,编码时间基本上是优化后5-6倍。ITU的源代码中采用的是最基本的运算,而且没有做过任何优化,所以效率极度低下。在优化之前先推荐一款调试软件DevPartner Studio Professional,它能进行错误分析和性能分析,功能强大,操作简单。
通过DevPartner对源代码进行分析发现无论是G.729还是G.723大部分运算都集中在basic_op.c的函数中,basic_op.c里面都是些基本运算,L_mac(),L_mult(),L_add()和sature()又占用basic_op.c中的绝大部分运算。所以优化也应该集中在这几个函数中。在basic_op.c有个溢出标志位overflow,很多基本函数多对其判断浪费了很多时间,其实可以直接去掉,使用时直接判断结果时候为最大值即可知道是否溢出,对basic_op.c的函数采用MMX指令优化,使用其饱和特性可以减掉很多判断溢出的操作,
下面给出一个加法的例子
Word16 add(Word16 var1,Word16 var2)
{
_asm{
movd mm0,var1;
movd mm1,var2;
paddsw mm0,mm1;
movd eax,mm0;
emms;
}
}
源代码中太多的函数调用,比如L_mac就调用了L_mult和L_add函数,如果直接把L_mult和L_add代码填入L_mac中则可以省去很多函数调用浪费的时间,ITU的代码中为了详细的描述算法有很多类似循环没有合并,将其合并也可以提高效率,并且有些在循环体内的运算也可以提到循环体外,对于用For()控制的循环次数最好使用参数,这样编译器可以将循环解开。
因为本人能力和精力有限,仅仅是在源代码的层面上对G.729和G.723进行优化,不过也取得了相当可观的效果,优化后的效率比优化前提高了一倍,如果再做更深层次的算法优化相信会有更高的提升。以上是用wffy的分析方法,当然用vtune分析也是这个结果,有时间试下DevPartner Studio Professional。
g729a 程序结构分析