语音编解码研究与分析
笔者目前正在分析g系列(g723 g729) speex语音编解码算法,希望与志同道合者交流
飞天大蟾蜍
这个作者很懒,什么都没留下…
展开
-
speex源码分析-5-解码简要说明
看了一下speex窄带的解码,在默认的方式下,解码的过程相对简单。这里大致做一个文字说明(忽略不常用的代码逻辑以及丢包处理等)先解码lsp系数,基本就是查表,与直流分量相加,得到反量化的lsp系数解码原始激励的平均增益 ol_gain,这个增被用于计算固定码本激励的增益然后是解码自适应激励,编解码双方都要保存历史解码的激励,所以直接根据最佳延后查原创 2012-11-06 17:12:34 · 1897 阅读 · 0 评论 -
speex源码分析-4-固定码本激励
完成自适应激励后,激励的剩余成分可以认为是随机信号了所以各种celpc编码器的第二级码本都是一个伪随机的码本speex的也不例外.speex首先会做一个类似归一化的操作.具体地说,先把real_exc减去自适应解码激励,得到随机激励 /* FIXME: Make sure this is save from overflows (so far so g原创 2012-11-02 16:51:07 · 2532 阅读 · 0 评论 -
speex源码分析-3-自适应激励
本节来分析speex的自适应激励,与g723 729一样,自适应激励最主要的课题就是基音周期的搜索,这个自然是通过自相关算法来解决的.而自适应码本则是由固定码本不断迭代计算出来的首先来看一下,开环基音增益ol_gain.直观地解释这个变量的含义,就是搜索出自适应激励码本后,要根据这个增益做一个比例缩放.如我们在之前章节中提到的ol_gain是由原原创 2012-11-01 10:06:49 · 2497 阅读 · 0 评论 -
speex源码分析-2-lsp量化
完成了lpc 分析,并转成lsp之后,接下来就是要对lsp进行量化 lsp_quant_nbspeex lsp的量化是采用欧式距离最短的方法,在码本表里搜索分成三级首先扣减直流分量 for (i=0;i qlsp[i]=SUB16(qlsp[i],LSP_LINEAR(i));//lsc 做一个类似扣减速直流分量的操作,(lsp的取值范围大约是原创 2012-10-30 14:57:23 · 2186 阅读 · 0 评论 -
speex源码分析-1-lpc分析
本文简要地分析一下speex窄带的编码算法算法实现主要在nb_celp.c这个文件里,看名字,大概可以猜出其它编码框架与g723等算法是极其类似的在分析前,先来看一下怎么用speex编解码算法 //初始化编解码器:void *st;void *dec;SpeexBits bits;st = speex_encoder_init(spee原创 2012-10-29 22:44:15 · 5081 阅读 · 0 评论 -
g729源码分析-11-后置滤波处理(二)
g729的长时后置滤波,最后还有一些细节处理会再次升抽样,用一个129的样点对激励进行升抽样,并与search_del的升抽样进行比较,哪个相关大选取哪个 /* Filtering with long filter */ compute_ltp_l(ptr_sig_cadr, ltpdel, phase, ptr_sig_pst0,原创 2012-07-05 19:59:35 · 2155 阅读 · 0 评论 -
g729源码分析-10-后置滤波处理(一)
后置滤波处理后置滤波处理,大致有以下几个步骤step 1: 长时预测这段代码的主要目的是利用语音的长时相关来加强当前的语音信号做法是在基音延迟附近搜索最佳基音延迟,利用历史解码出来的激励信号对当前的激励信号做一个加权step 2:共振峰感知加权,这个不用说了,加强共振峰处的能量step 3:倾斜被偿,修正因为共振峰感知加权引入的频谱倾斜原创 2012-06-05 21:02:09 · 2385 阅读 · 0 评论 -
g729源码分析-9-g729-解码
现在来分析g729的解码.从g729的测试代码看出来,解码的过程被清晰地分成了两个部分.第一部分,就解码出lpc预测系数与激励,合成语音.第二部分,进行感加权,倾斜补偿这些与g723的处理是极其类似的,少了静音压缩,这样就少了一大块要分析的代码了先来看第一部分,也就是合成语音的部分Decod_ld8k 函数名的意思就是长延时8k解码器原创 2012-05-27 23:32:03 · 3488 阅读 · 0 评论 -
g729源码分析-8-内存更新打包
得到g729和自适应码本增益与固定码本增益后,就可以根据两者解码出当前帧的激励,然后存放在历史激励数组当中即更新自适应激励码本代码片段: for (i = 0; i { /* exc[i] = gain_pit*exc[i] + gain_code*code[i]; */ /* exc[i] in Q0 gain_原创 2012-05-23 07:31:27 · 1664 阅读 · 0 评论 -
g729源码分析-7-增益量化
现在来分析g729的增益量化,这里包含两个增益,一个是自适应码本的增益gp,一个是固定码本的增益gc由于自适应码本与固定码本已经被搜索出来了,就可以根据这两级码本,与反量化的Az系数进行卷积,得到解码的语音信号(包含未知变量gc与gp)利用这个解码的语音信号与目标语音信号方差最小为准则,在增益码本里做搜索,搜索出最佳增益即itu文档中的3.9节,公式63.原创 2012-05-03 17:59:54 · 1739 阅读 · 5 评论 -
g729源码分析-6-固定码本搜索
g729自适应激励部分在基音周期中分析了.g729固定码本搜索和g723极其类似,相应的算法可以参考g723的算法.但作为编码的一个重要环节,又不得不提一下.考虑到笔者那已经少得可怜的脑细胞,就一笔带过吧.首先有这么一行: gain_pit = G_pitch(xn, y1, g_coeff, L_SUBFR);gain_pit 其实是自适应码原创 2012-04-18 10:17:49 · 1725 阅读 · 0 评论 -
g729源码分析-5-基音周期搜索(下)
前面两节讲完了g729基音周期搜索的基本流程与依据这里结合代码,进一步讲述这一过程整数基音周期搜索比较简单分成三段搜索,每段的权值不同,这在之前分析过了,不详述了分数基音周期搜索是针对每个子帧进行的每个子帧在开环基音周期附近,搜索闭环基音周期首先构造出冲激响应 W(z)/A(z) 即感知加权滤器和综合滤波器串联而成的系统代码片段:原创 2012-04-17 14:53:05 · 2578 阅读 · 0 评论 -
g729源码分析-4-基音周期搜索(中)
上一节对分数基音周期搜索作了文字说明,笔者画了几幅图,对分数基音周期搜索里的升抽样进一步说明图1:表示一个带限的离散时间信号的傅里叶变换,它必然是以2 pi为周期的函数.图2:当我们用 t[n]=1当n%3==0 对语音信号进行抽样时,t[n]的频谱图如图2所示,图3:图1与图2的卷积,因为t[n]的频谱是一连串的冲激串,相当于将语音原创 2012-04-16 13:38:14 · 1762 阅读 · 0 评论 -
g729源码分析-3-基音周期搜索(上)
基音周期搜索,是自适应码本搜索的一个重要依据,自适应码本的搜索就是在基音周期附近进行的.和g723的基音周期搜索不同,g729的基音周期搜索搜索也更为精细g729把基音周期的搜索分成3段,取了每一段中自相关的极值,三段区间分别为[20,39] [40,79] [80,143]这三个区间的权值是不一样的,以0.85递减这个选取归规则可以从itu的文档里看出来,原创 2012-04-11 23:08:41 · 2018 阅读 · 0 评论 -
g729源码分析-2-共振锋感知加权
不同于g723固定系数的共振峰感知加权g729的共振峰感知加权是自适应的.perc_var 这个函数来对共振峰感加权进行估值我们先看itu的文档 3.3节 的式30,这是一个判断语音频谱是否平坦的一个条件.因为人类语音的频谱有个特点,越高频的共振峰的能量会越弱.而共振峰感知加权要注意这个现象,如果频谱倾斜了(高频共振峰能量弱),要加强加权系数根据原创 2012-04-11 14:05:52 · 2241 阅读 · 0 评论 -
g729源码分析-1-lpc分析
g729编码分析了大部分,编码总体框架和g723有些类似.均是基于lpc分析的码本激励编码.g729提供了更低的编码延迟(10ms)g729的第一步Pre_Process照样是高通滤波,滤除低频噪声.Coder_ld8k 为编码主体函数Autocorr 第一步,计算自相关,根据lpc预测阶数10,从R(0)算到R(10),(类似g723) Lag_w原创 2012-04-11 11:07:45 · 3431 阅读 · 0 评论 -
g729分析笔记
分析g729的一些零碎笔记,原来随手扔在新浪微博,太零碎了,这里做一个汇总。729感知加权的问题,同723一样,仍然对高频分量做一个估值,高频低,则认为频谱是倾斜的。要感知加权的时候应做适当的补偿。因为人类的语音信息,在前两个共振峰能量较大,高频共振峰幅度则会依次回落。对比723,729引入了感知加权自适应机制,即,两个共振峰的位置如果太接近了,带宽扩展有可能导原创 2012-03-28 14:14:27 · 2578 阅读 · 2 评论 -
g729源码分析-开篇
完成了g723,打算先看看g729.大致扫了一篇编解码框图.都是基于10阶线性预测(10e lpc)看到了熟悉的莱文森德宾递推,基音周期搜索等。感知加权滤波器的设计有所不同。自适应激励与固定码本激励部分基本都差不太多。g729的处理的数据块为10ms,80个采样,相对g723编码时延更低。g729的高通滤波也比较纠结,阶数比g723的更高,让笔者不能原创 2012-01-30 23:28:03 · 6111 阅读 · 1 评论 -
g723-21-编解码流程总结
编码过程:首先对信号进行低通滤波然后是lpc分析,并转成lsp量化(莱文森德宾递推公式)判断是否为静音帧感加强权,加强共振峰,以便得到的残差信号周期性更强根据自相关来搜索基音周期如果是静音帧,根据需要,生成sid报,舒适噪声生成如果非静音进行谐波噪声整形滤波,去除信号中的噪声长时相关性对量化的lsp参数进行反量化插值,逆向滤波,得到残原创 2012-01-19 16:32:39 · 2399 阅读 · 0 评论 -
g723源码详细分析-20-共振峰后置滤波器
现在来分析最后一块g723中最后一个未分析模块共振峰后置滤波器涉及函数 Spf Scale观察itu 3.8 式49.3: 10 1 - Σ ai * λ1^i * z^(-i) i=1F(z)= --------------------------- (1 - 0.25 * k * z^(-i))原创 2012-01-19 15:52:25 · 2330 阅读 · 0 评论 -
g723源码详细分析-19-基音后置滤波器
现在来分析g723基音后置滤波器根据基音周期间,激励信号的相关性,来对激励信号做一个增强处理相应的函数分别是 Comp_Lpf Filt_LpfComp_Lpf 负责计算最佳的基音延后,具体地说,是在基音周期延迟附近,找出最匹配当前子帧激励的60个连继激励e[i].使用的方法自然找自相关最大的.找到之后,对e[i]进行加权,与当前子帧的激励相加,这样就能达到增加音效原创 2012-01-18 10:37:59 · 1547 阅读 · 0 评论 -
g723源码详细分析-18-丢包补偿
g723对网络丢包行为了一些处理涉及的函数为Comp_Info RegenComp_Info:负责计算插值依据它的四个参数Word16 *Buff:激励数组,包含之前的145个激励Word16 Olp:当前帧的基音周期Word16 *Gain:输入增益(归一化的)Word16 *ShGain:输出增益的缩放位移返回值是激励插值的延后现在来看Comp_In原创 2012-01-16 12:30:09 · 1489 阅读 · 0 评论 -
g723源码详细分析-17-舒适噪声解码
Dec_Cng舒适噪声解码知道舒适噪声如何生成,解码就简单了.sid会传递滤波参数(在滤波器相似度不高时,sid报文会被发送)解出报文里的lpc参数与增益估值代码片段: /* * SID Frame decoding */ DecCng.SidGain = Dec_SidGain(Line->Sfs[0].Mamp);原创 2012-01-13 13:45:03 · 1690 阅读 · 0 评论 -
g723源码详细分析-16-舒适噪声生成
Cod_Cng这个函数,先利用当前子帧的自相关系数和,即:R[i]= Rsub0[i] + Rsub1[i] + Rsub2[i] + Rsub3[i]i = 0 ~ 10Rsub0[i]表示第一个子帧的自相关系数利用这组自相关系数,通过莱文森德宾算法,估算当前帧的残差能量即在德宾算法的最后一轮迭代产生的分母,就是残差能量的估值代码片段 */ //lsc Co原创 2012-01-13 00:44:20 · 3341 阅读 · 0 评论 -
g723源码详细分析-15-静音检测
现在来分析静音检测语音通话,基本上是一方听,一方说,采用静音检测可以起到节省一半带宽的作用网络上有很多静音检测的代码,基本的思路,都是构造一个自适应的能量探测试,低于阀值时,就认为出现静音g723的思路基本与此相同Comp_Vad 这个函数负责静音栽决,看代码吧,这里笔者只分析算法,不再纠结定点数运算引起的数值缩放的问题了g723的静音检测,检测了当前帧的1原创 2012-01-05 16:23:29 · 4215 阅读 · 1 评论 -
g723源码详细分析-14-感知加权滤波器补充
在分析解码后置滤波器时重找了一些感知加权的资料补充一些对共振峰感知加权的理解先来看感知加权滤波器的系统函数(itu 723文档中的式11) 10 1 - Σ a[j] * (z * γ1)^(-j) j=1 W(z) = ---------------------------原创 2011-12-28 15:43:59 · 1848 阅读 · 0 评论 -
g723源码详细分析-13-解码
这里大致介绍解码的过程本文先暂时跳过静音压缩与舒适背景噪声,以及丢包处理等基本上掌握了编码原理,理解解码过程是非常快的,很多函数都在编码时分析过了Line_Unpk 按itu定义这个是解网络数据包Lsp_Inq 这个是反量化lsp系数,在编码的时候原创 2011-10-11 19:55:10 · 1413 阅读 · 0 评论 -
g723源码详细分析-12-更新内存与打包等
完成声道参数与激励编码后,需要将这些信息打包成帧,并且要更新相应的内存,如保存当前激励成为之后编码的自适应激励码本等在Find_Fcbk之后,即完成了所有编码,接下来更新内存状态Decod_Acbk里解码自适应激励,这个函数在编码自适应激励时描述过了,即根据基音周原创 2011-10-09 20:55:00 · 1084 阅读 · 0 评论 -
g723源码详细分析-11-多脉码激励编码
上一节分析了g723低速率下的固定码本搜索,在高速率下面,对去了自适应激励成份后的语音信号,g723采用的是多脉冲编码方式.本文现做一个简要的闸述在分析代码之前,仍然是要做一些公式推导,否则不易读懂代码过程其实与固定码本搜索时的方式类似.多脉冲激励的定义:激励是由有限个经过最优估值的脉冲构成(每个脉冲的位置与增益都是经过最优估值的)那么很容易得出相应的误差公原创 2011-10-07 12:31:05 · 1585 阅读 · 0 评论 -
g723源码详细分析-10-固定随机码本搜索
在上一节中讲的是自适应码本搜索,经过自适应码本搜索后,语音信号的时域相关性被极大地去除了,剩下的残差信号接近于随机信号.g723的第二级搜索,是按编码速率的不同,按两种方式进行的在高速率的情况下,g723第二级搜索是按多脉冲编码方式进行的,即对残差信号用N原创 2011-10-03 15:27:35 · 4744 阅读 · 0 评论 -
g723源码详细分析-9-自适应码本搜索
各种语音压缩算法的前半部分,即lpc部分是大同小异的,均是假设声道是一个十阶的全极点滤波器,通过自适应算法,求出10个lpc系数,然后就是编码残差信号,即激励信号,各种算法不同之处,在于对激励信号编码方式以及码本结构。有各种不同的激励信号的编码,如自适应码本编原创 2011-08-23 09:45:00 · 1758 阅读 · 0 评论 -
g723源码详细分析-8-计算冲激响应与振铃减法
Comp_Ir 计算冲激响应前面已经介绍了如何将量化的lsp转成4组lpc系数,得到量化后的lpc系数,相应的得到了逆向滤波器(这里称它为滤波器A吧).这时要做的就是根据这些滤波器,在激励码本表里找出合适的激励源,也就是对激励进行编码了,接下去的都是跟激励编码相关的.比较各种语音压缩算法,在lpc分析这一阶段,基本是大同小异的,不同之处,在于对激励的编码算法现在来看看g723的激励编码算法的总体是原创 2011-06-27 17:08:00 · 1706 阅读 · 0 评论 -
g723源码详细分析-7-lsp反量化与插值
Lsp_Inq Lsp_Int lsp反量化与插值这两个函数完成的功能是将量化的lsp系数反量化由于参与量化的lsp系数是4个子帧中的最后一帧,另外3个子帧的lsp系数是由之前的帧的lsp系数(PrevLsp)与当前的lsp经过加权比例混合得到的.这4组lsp被转化成为4组lpc系数后,构成一个滤波器,利用此滤波器得到残差信号,这样就可以对残差信号进行自适应编码与固定码本编码了先来看Lsp_Inq原创 2011-06-23 15:21:00 · 2112 阅读 · 1 评论 -
g723源码详细分析-6-谐波噪声整形
6 Comp_Pw 谐波噪声成形过滤讯号中之杂讯的类周期性 --- 这段代码的作用,摘自可能是一位台湾网友的技术博客我们来看一下系统函数P(z) = 1 - b * z^(-L)其b是一个跟自相关与能量比值有关的系数, L取值大约是基音周期我们可以大致画出这个原创 2011-06-01 21:15:00 · 1403 阅读 · 0 评论 -
g723源码分析-(五)-基音周期补充
关于基音周期搜索,分子是自相关,但还做了一个与能量相除的操作,笔者最近一直在思考谐波噪声成形的问题,偶然情况下对基音周期的这个搜索算法有了点心得,实际上这个算法跟自适应有点关系. 我们先来看723对基音周期搜索的条件,笔者在之前的文章中描述过,同学们也可以去下载itu的文档,如下: n=119 n=119( (Σ原创 2011-05-28 09:49:00 · 1168 阅读 · 0 评论 -
g723源码详细分析(四) 感知加权与基音周期搜索
<br /><br />5 感知加权与基音周期<br /> <br />Mem_Shift<br />这个函数的作用是<br />把先前保存的120个输入信号,与当前的240信号值,整成一个360的缓冲区buf,<br />并把当前的最后120个输入信号存入PrevData,<b原创 2011-05-16 22:25:00 · 1949 阅读 · 1 评论 -
g723源码详细分析(三) lsp量化
<br /><br />4 lsp系数量化<br /> <br />现在来分析这个<br /> <br />10 lsp系数已经计算出来了,由于lsp的性质,可以将它们分成若干段,分别量化<br />它们将会被分成 3,3,4这三个分矢量<br />每个矢量都会有一个256的码本原创 2011-05-15 15:14:00 · 1769 阅读 · 0 评论 -
g723源码详细分析(二) lpc转lsp
3 lpc系数转成lsf系数 AtoLsp 首先解释一下为什么需要lsf(lsp)系数A(z)在形式上不是以因式分解给出的,如果直接设一个lpc码本表,对lpc系数进行矢量量化,则某个lpc系数的误差对信号整个频域的影响,为了消除这种误差影响,我们自然地想到了利用A(z)原创 2011-05-06 11:53:00 · 4034 阅读 · 0 评论 -
g723源码详细分析(-)
完成了g723源代码的分析,现作一些整理1 信号高通滤波 Rem_Dc:这个函数做高通滤波用的.将低频噪声滤除滤波器的系统函数为H(z)=(1-z^(-1)) / (1 - (127/128)*z^(-1))将 单位圆上的值代入(即:sin(a) + cos(a)*i)可以看出这原创 2011-04-15 10:43:00 · 3826 阅读 · 0 评论 -
莱文森-德宾递推公式证明
首先从lpc系数的求解开始说吧我们假定 s[n]是输入的语音信号s`[n]是10阶预测信号s`[n] = a10 * s[n - 10] + a9 * s[n - 9] + ... + a1 * s[n - 1]我们取s`[n] 与 s[n] 方差最小值(s[n] - s`[n]原创 2011-04-07 11:46:00 · 5286 阅读 · 0 评论