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于杭州

g723源码详细分析-18-丢包补偿相关推荐

  1. g723源码详细分析(-)

    完成了g723源代码的分析,现作一些整理 1 信号高通滤波 Rem_Dc: 这个函数做高通滤波用的.将低频噪声滤除 滤波器的系统函数为 H(z)=(1-z^(-1)) / (1 - (127/128) ...

  2. g723源码详细分析-15-静音检测

    现在来分析静音检测 语音通话,基本上是一方听,一方说,采用静音检测可以起到节省一半带宽的作用 网络上有很多静音检测的代码,基本的思路,都是构造一个自适应的能量探测试, 低于阀值时,就认为出现静音 g7 ...

  3. g723源码详细分析-11-多脉码激励编码

    上一节分析了g723低速率下的固定码本搜索, 在高速率下面,对去了自适应激励成份后的语音信号, g723采用的是多脉冲编码方式.本文现做一个简要的闸述 在分析代码之前,仍然是要做一些公式推导,否则不易 ...

  4. LinkedHashMap 源码详细分析(JDK1.8)

    1. 概述 LinkedHashMap 继承自 HashMap,在 HashMap 基础上,通过维护一条双向链表,解决了 HashMap 不能随时保持遍历顺序和插入顺序一致的问题.除此之外,Linke ...

  5. linkedhashmap 顺序_LinkedHashMap 源码详细分析(JDK1.8)

    1. 概述 LinkedHashMap 继承自 HashMap,在 HashMap 基础上,通过维护一条双向链表,解决了 HashMap 不能随时保持遍历顺序和插入顺序一致的问题.除此之外,Linke ...

  6. FBReader源码详细分析 序言

    2019独角兽企业重金招聘Python工程师标准>>> FBReader源码详细分析 -- 序言 有关FBReader源码的分析,网络上已经有一位叫做"谋哥"的大 ...

  7. HashMap 源码详细分析(JDK1.8)

    1. 概述 本篇文章我们来聊聊大家日常开发中常用的一个集合类 - HashMap.HashMap 最早出现在 JDK 1.2中,底层基于散列算法实现.HashMap 允许 null 键和 null 值 ...

  8. android view 源码分析,Android ViewPager源码详细分析

    1.问题 由于Android Framework源码很庞大,所以读源码必须带着问题来读!没有问题,创造问题再来读!否则很容易迷失在无数的方法与属性之中,最后无功而返. 那么,关于ViewPager有什 ...

  9. vboot源码详细分析-1

    最近一直在研究bootloader之vboot,vboot短小精悍,如果只是用来进行系统的引导,而不要提供其他复杂的功能时候,我认为这是绝佳的上选.这里以MINI2440开发板配套的源码进行分析.这个 ...

最新文章

  1. http 里面的post和get区别
  2. 配置库用户_GEE学习笔记 六十八:【GEE之Python版教程二】配置Python开发环境
  3. VS2005混合编译ARM汇编代码
  4. 记一次 .NET 某电商交易平台Web站 CPU爆高分析
  5. prefix.pch文件的一些简单使用
  6. C语言 函数指针和指针函数区别 - C语言零基础入门教程
  7. python编程代码执行漏洞_代码执行漏洞 - 安全先师的个人空间 - OSCHINA - 中文开源技术交流社区...
  8. 都是远程办公惹的祸!搜狗输入法为错误推送地震预警信息致歉
  9. php 5.5 编译安装,php5.5.38编译安装
  10. Aptana 添加jQuery提示
  11. 找到你真正喜欢做的事情,坚持下去,坚持多深入一些(转)
  12. idea 使用中文汉化包教程
  13. 国密标准Ukey在Web登录认证流程
  14. HMC510LP5ETR资料
  15. java 蓝桥杯 分机号
  16. 洛谷P3899 [湖南集训]谈笑风生
  17. python 小数乘法_TMS320C55xDSP应用系统设计
  18. mysql 基于ssl认证
  19. 人事管理系统哪个好用?人事管理系统推荐!
  20. 数据分析行业分析:四个模型

热门文章

  1. windowsNT系统
  2. Mysql 创建管理数据库内容上的打字练习
  3. 使用Git下载指定分支
  4. 【UE4教程】陀螺仪使用
  5. Kubernetes 学习总结(34)—— 如何理解编排
  6. 2.软件工程—E-R图
  7. ios触摸超出_iOS开发笔记之多点触控(一)处理触摸的4个方法
  8. pytorch 中的 checkpoint 是干嘛的?
  9. Flutter轻松实现Adobe全家桶Logo列表功能
  10. Google Nexus 5X 8.1 Root 安装Xposed Https代理教程