g723源码详细分析-18-丢包补偿

g723对网络丢包行为了一些处理
涉及的函数为Comp_Info Regen

Comp_Info:负责计算插值依据
它的四个参数
Word16 *Buff:激励数组,包含之前的145个激励
Word16 Olp:当前帧的基音周期
Word16 *Gain:输入增益(归一化的)
Word16 *ShGain:输出增益的缩放位移
返回值是激励插值的延后

现在来看Comp_Info函数
道先做一个归一化处理,得到能量的归一化所需要位移位数
/* Normalize the excitation */
*ShGain = Vec_Norm( Buff, (Word16) (PitchMax+Frame) ) ;

在基音周期附近(Olp-3,Olp+3)这个范围内寻找自相关最大的120个样点取值,

代码片段如下:
for ( i = (int)Olp-3 ; i <= (int)Olp+3 ; i ++ ) { //lsc 在基音周期附近搜索自相关最大的一个索引

Acc0 = (Word32) 0 ;
for ( j = 0 ; j < 2*SubFrLen ; j ++ )
Acc0 = L_mac( Acc0, Buff[PitchMax+Frame-2*SubFrLen+j],
Buff[PitchMax+Frame-2*SubFrLen-i+j] ) ;

if ( Acc0 > Acc1 ) {
Acc1 = Acc0 ;//lsc Acc1保存基音周延后自相关最大的
Indx = (Word16) i ;
}
}
找出来的基音延后序列我们记录 x[n-Indx]

计算最后120个样点的能量 Tenr 这个是x[n]的能量(最后120个样点)
/* Compute target energy */ //lsc 计算最后120个样点的能量
Acc0 = (Word32) 0 ;
for ( j = 0 ; j < 2*SubFrLen ; j ++ )
Acc0 = L_mac( Acc0, Buff[PitchMax+Frame-2*SubFrLen+j],
Buff[PitchMax+Frame-2*SubFrLen+j] ) ;
Tenr = round( Acc0 ) ;
*Gain = Tenr;

计算最佳基音延后的能量 Enr 这个是x[n-Indx]的能量(连续120个)
/* Compute best energy */ //lsc 计算基音周期延后的能量Acc0
Acc0 = (Word32) 0 ;
for ( j = 0 ; j < 2*SubFrLen ; j ++ )
Acc0 = L_mac( Acc0, Buff[PitchMax+Frame-2*SubFrLen-(int)Indx+j],
Buff[PitchMax+Frame-2*SubFrLen-(int)Indx+j] ) ;

得到能量以相基音延后的自相关之后,
就可以判断x[n-Indx] x[n]的相似度了
x[n-Indx] x[n]相关,在代码中是Ccr

(Enr * Tenr)/16 < Ccr^2 就认为这两个序列是相关的,
当丢包时,插值依据就是x[n-Indx],否则取x[n]
代码片段:

Ccr = round( Acc1 ) ;

if ( Ccr <= (Word16) 0 )
return (Word16) 0 ;

Enr = round( Acc0 ) ;

Acc0 = L_mult( Enr, Tenr ) ;//lsc Enr 为基音周期最佳延后的能量 Tenr为最后120个样点的能量
Acc0 = L_shr( Acc0, (Word16) 3 ) ;

Acc0 = L_msu( Acc0, Ccr, Ccr ) ;//lsc Ccr为最佳基音延迟自相关

if ( Acc0 < (Word32) 0 )//lsc Acc0小 说明相关性大 可能会作为插值的依据,否则插值的依据就是前面的120个点
return Indx ;
else
return (Word16) 0 ;


再来看Regen,它负责在出现丢包时,做插值
是否丢包,是由调用Decod时传的一个参数crc来触发
Regen( DataBuff, Temp, DecStat.InterIndx, DecStat.InterGain,
DecStat.Ecount, &DecStat.Rseed ) ;

DecStat.InterIndx就是Comp_Info计算得到的基音延后Temp保存145个历史解码激励,
DataBuff为输出的插值激励
其中DecStat.InterGain是由以前帧得到的
如果没有丢包,取中间两子帧的平均,
丢包则按0.75的衰减取值
/*
* In case of no erasure, update the interpolation gain memory.
* Otherwise compute the interpolation gain (Text: Section 3.10)
*/
if ( DecStat.Ecount == (Word16) 0 ) {
DecStat.InterGain = add( Line.Sfs[SubFrames-2].Mamp,
Line.Sfs[SubFrames-1].Mamp ) ;
DecStat.InterGain = shr( DecStat.InterGain, (Word16) 1 ) ;//lsc 取中间两帧增益的平均,作为丢包时的插值增益
DecStat.InterGain = FcbkGainTable[DecStat.InterGain] ;
}
else
DecStat.InterGain = mult_r( DecStat.InterGain, (Word16) 0x6000 ) ;//lsc 丢包时,按0.75衰减

Regen的函数过程
如果错误次数超为6,则不做插值
错误次数小于6,按DecStat.InterIndx是否为0,
DecStat.InterIndx不为0,取相应的基音延后历史激励插值
/* Voiced case */
for ( i = 0 ; i < Frame ; i ++ )
Buff[PitchMax+i] = Buff[PitchMax-(int)Lag+i] ;//lsc 利用基音延后,构造一个周期激励
for ( i = 0 ; i < Frame ; i ++ )
DataBuff[i] = Buff[PitchMax+i] = mult( Buff[PitchMax+i],
(Word16) 0x6000 ) ;//lsc 做一个0.75的衰减

如果为0,认为处于清音段,用随机激励插值
/* Unvoiced case */
for ( i = 0 ; i < Frame ; i ++ )
DataBuff[i] = mult( Gain, Rand_lbc( Sd ) ) ;//lsc 模拟一个随机激励
/* Clear buffer to reset memory */
for ( i = 0 ; i < Frame+PitchMax ; i ++ )
Buff[i] = (Word16) 0 ;


下一章节将分析基音后置滤波与共振峰后置滤波
林绍川
2012.01.16于杭州


【信息科学与工程学】计算机科学与自动化——第三十五篇 调度理论和调度算法01——资源调度算法 算法逻辑 阅读详情

相关推荐

给PCM/G721/G723/G726 raw文件加wav头

给PCM、G721、G723、G726 raw文件加wav头 测试过8k8bit的pcm 包含测试文件: 55_711_8k3bitMono.g723 55_711_8K4bit32K.g721 55_711_8K4bit32K.g726 55_711_8k4bitMono.g721 55_711_8k4bitMono.g726 55_711_8K5bit40K.g723 55_711_8k8bit64k.pcm RAW 2 WAV usage eg:WaveFileGen

g723源码分析注释

笔者在分析g723时产生的注释,希望对语音感兴趣朋友有用 email: lsccsl@tom.com

G711_G721_G723编解码源码

G711 Alaw,Ulaw, G721, G723编解码的典型源码,很有参考价值

VoIP技术(4)-G.729-G.723-iLBC-语音编码

4.4 算法—G.729分析 在VoIP系统中应用最广泛的就是G.729和G.723.1两种。G.729编码是LPC参数编码,线性预测采用的是前馈型前向自适应技术,并使用预视提高合成模型的精度。预测模型系数根据当前帧和部分下一帧话音数据进行更新,G.729帧长为10ms,由2个子帧组成,预视5ms。由于采用的是前向型自适应技术,因此除了传送激励信号外,还需传送预测器系数。为了降低复杂度,G.72

飞翔de刺猬 5648

g723源码详细分析(二) lpc转lsp

3 lpc系数转成lsf系数 AtoLsp 首先解释一下为什么需要lsf(lsp)系数 A(z)在形式上不是以因式分解给出的,如果直接设一个lpc码本表, 对lpc系数进行矢量量化,则某个lpc系数的误差对信号整个频域的影响, 为了消除这种误差影响,我们自然地想到了利用A(z)

飞天大蟾蜍的专栏 4174

G.729与G.723语音编码介绍及优化

语音编码分成波形编码、参数编码和混合编码.波形编码就是语音信号形成的波形进行处理和加工,参数编码是以语音信号产生的数字模型为基础,求出其模型参数,然后按照这些参数还原数字模型,合成语音。混合编码是综合了波形编码和参数编码的长处,在4-16kbps的速率上进行高质量的语音合成。例如多脉冲激励线性预测编码(MPLPC),码本激励线性预测编码(CELP)都是混合编码。 人耳的听觉范围在20-20KHZ

魔都凯凯的专栏 2682

speech codec (G.711, G.723, G.726, G.729, iLBC)

各种各样的编解码在各种领域得到广泛的应用,下面就把各种codec的压缩率进行一下比较,不正确之处望各位同行指正。 Speech codec:     现主要有的speech codec 有: G.711, G.723, G.726 , G.729, ILBC                                            QCELP, EVRC, AMR, SMV ...

weixin_34010949的博客 844

g723编解码简述

<br />先写个简单的吧,过段时间再把g723代码详细分析<br /> <br />g723针对8k采样,16bit量化的pcm信号进行编码,30ms的延迟,意味着每个数据块是240个采样<br /> <br />首先对信号进行低通滤波,为的是去掉低频分量<br />接下来是l

飞天大蟾蜍的专栏 4071

g723编解码之自我总结

其实,很多关于编解码的音视频例子,都是通过文件来进行操作的。 自己做过的(ffmpeg视频编解码、g726编解码、g723编解码)都是从网上找的例子来进行修改的。其中,最难的地方就是在于把文件读取改为缓存读取。 需要编解码的音视频流,都是通过回调函数回调上来的,一般有用的是两个参数:指针和流的大小长度。这里总结一下g723的方法。 g723是通过读取一个字节,而不是通过读取流的一定长度,来进

那年晴天的博客 3721

音频:G723

G.723.1是一个数据通信标准,以8kHz的速率采样,每秒可以对5.3或6.3千位的数据进行压缩的16位脉冲编码调制(PCM)方式。编码在30毫秒的帧中完成。超前时间是7.5毫秒,所以总延迟时间是37.5毫秒。压缩率达到12比1。它与语音触发检测(VAD)共同提供了非常窄的信号带宽。   G.723.1为多信道操作提供全工和半工传输能力,这在综合处理数字信号的多媒体系统中是非常有用的。在语音

阿丹的彩蛋 1866

深入剖析iLBC的丢包补偿技术(PLC)

    丢包补偿技术(Packet Loss Concealment——PLC)是iLBC Codec中非常重要的一项技术,更是VOIP Codec应用中不可缺少的组成部分。iLBC的PLC只是在解码端进行封包补偿处理。在解码端根据收到的bitstream逐帧进行解码的过程中,iLBC decoder首先拿到每帧的 bitstream 要判断当前帧是否完整,如果没有问题则按照正常的iLBC 解码流

王贵平的专栏—分享学习的快乐,感悟人生的真谛! 8330

丢包补偿技术调查

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://silversand.blog.51cto.com/820613/166161 摘要 调查显示了用于IP网络语音应用的各种丢包补偿技术。丢包补偿技术可以分为两类:基于发送端补偿和基于接受端补偿。基于发送端补偿包括前向差错纠正、交织和重传技术;基于接受端补偿包括了多种错

3835

丢包补偿技术概述

基于接收端的丢包补偿技术(Receiver-Based techniques)   基于波形修复的技术 waveform-based concealment   基于建模修复的技术 model-based concealment基于发送端的丢包补偿技术 (Sender-Based techniques)   交织(interleaving)   Media - Independent t...

dg0418的博客 401

G711 编码解码及丢包隐藏处理(PLC)

G.711是一种由国际电信联盟(ITU-T)制定的音频编码方式,又称为ITU-T G.711

kai157346113的专栏 3425

g723源码详细分析-14-感知加权滤波器补充

在分析解码后置滤波器时 重找了一些感知加权的资料 补充一些对共振峰感知加权的理解 先来看感知加权滤波器的系统函数(itu 723文档中的式11) 10 1 - Σ a[j] * (z * γ1)^(-j) j=1 W(z) = ------------------------------ 10 1 - Σ a[j] * (z * γ2)^(-j) j=1 这个形...

touchinsert 241

G.711编解码原理

wiki上关于G.711的介绍以及A-law和mu-law原理解释 http://en.wikipedia.org/wiki/G.711 自带的中文不能打开,google不知道为啥翻译不了,用了个bing将就着看吧 http://www.microsofttranslator.com/bv.aspx?from=&to=zh-CHS&a=http%3A%2F%2Fen.wikipedia.

xiao2macf的专栏 5958
上一篇: Oracle Flashback之Flashback Query
下一篇: Android xml资源文件中@、@android:type、@*、?、@+含义和区别
wapysun
博客等级 码龄19年 14粉丝 3原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值