现在来分析g729的解码.

从g729的测试代码看出来,解码的过程被清晰地分成了两个部分.

第一部分,就解码出lpc预测系数与激励,合成语音.
第二部分,进行感加权,倾斜补偿

这些与g723的处理是极其类似的,少了静音压缩,这样就少了一大块要分析的代码了

先来看第一部分,也就是合成语音的部分
Decod_ld8k 函数名的意思就是长延时8k解码器

D_lsp(parm, lsp_new, bfi);
这个函数解码出lsp系数保存至lsp_new,解码过程与g723类似,查码本表,
也g723一样,采用的是差分量化,之前帧的lsp系数要保留下来,才能得到完整的
量化值

Int_qlpc(lsp_old, lsp_new, A_t);
lsp插值,两个子帧,只有第二子帧的lsp系数被量化,而第一子帧的lsp系数是经过
插值得到的.

经过这一系列操作,就解码出了系统函数A(z).
更新lsp_old为下一帧解码Az系数做准备

接下来,就是解码激励了

Pred_lt_3(&exc[i_subfr], T0, T0_frac, L_SUBFR);
这个函数在编码时分析过了.
从网络报文里得到了TO 与 TO_fac(基音延迟与分数基音延迟)
这就是解码出不含增益的自适应激励(包含升抽样,这在编码时候分析过了原理与算法了)

Decod_ACELP(parm[1], parm[0], code);
这个解出固定码本,同样,对基音延迟小于帧长的情况,对应编码时的处理,做一个循环补充:
    if(sub(T0, L_SUBFR) <0 ) {
        for (i = T0; i < L_SUBFR; i++) {
          code[i] = add(code[i], mult(code[i-T0], j));
        }
    }

Dec_gain(index, code, L_SUBFR, bfi, &gain_pitch, &gain_code);
解码增益,注意到增益中有一个成分是不经过网络报文传输的,而是在编解码双方同步算出来的.
参考编码时的处理

解码出了自适应激励与固定码本激励以及它们对应的增益.
做个乘法加法运算,我们就可以得到解码的激励了

Syn_filt(Az, &exc[i_subfr], &synth[i_subfr], L_SUBFR, mem_syn, 0);
做个卷积,合成出语音,完毕!

Copy(&old_exc[L_FRAME], &old_exc[0], PIT_MAX+L_INTERPOL);
内存更新,保存当前解码出来的激励,作为下一帧的自适应码本

笔者将在下一章节分析感知加权与倾斜补偿,其实这些处理同g723基本是大同小异.
读者们有兴趣,也可以自行对比g723的源码分析来理解这一块代码.

敬畏:在先哲面前,懂得自身的渺小
求知:程序员的本能
不懈:自律者的品质

g729源码分析-9-g729-解码相关推荐

  1. Wangle源码分析:编解码Handler

    2019独角兽企业重金招聘Python工程师标准>>> 前言 编解码是协议相关的,如果没有编解码Handler,那么在处理网络的粘包.拆包时会变得很复杂.除了http之类的公有协议之 ...

  2. g729源码分析-5-基音周期搜索(下)

    前面两节讲完了g729基音周期搜索的基本流程与依据 这里结合代码,进一步讲述这一过程 整数基音周期搜索比较简单 分成三段搜索,每段的权值不同,这在之前分析过了,不详述了 分数基音周期搜索是针对每个子帧 ...

  3. Wangle源码分析:Service

    2019独角兽企业重金招聘Python工程师标准>>> 前言 Wangle中的Service代表一个远程服务(方法),熟悉RPC的朋友肯定知道这就是一个简单的RPC,当然,和一些常见 ...

  4. Wangle源码分析:ClientBootstrap

    2019独角兽企业重金招聘Python工程师标准>>> ClientBootstrap介绍 ClientBootstrap是wangle作为Client端的一个快速启动辅助类,在经过 ...

  5. Wangle源码分析:ServerBootstrap

    2019独角兽企业重金招聘Python工程师标准>>> ServerBootstrap介绍       ServerBootstrap,顾名思义,它是作为Wangle服务端的一个启动 ...

  6. Wangle源码分析:EventBaseHandler、AsyncSocketHandler

    2019独角兽企业重金招聘Python工程师标准>>> 前言 前面的Wangle源码分析系列文章详细的分析了Pipeline.Handler等实现原理,细心的读者可能发现,每次在构造 ...

  7. Wangle源码分析:Pipeline、Handler、Context

    2019独角兽企业重金招聘Python工程师标准>>> 基本概念 Wangle中的Pipeline和Netty中的Pipeline是很相似的,既可以将它看为一种职责链模式的实现也可以 ...

  8. 源码分析Dubbo系列文章

       本系列文章主要针对Dubbo2.6.2(dubbox2.8.4)版本,从源码的角度分析Dubbo内部的实现细节,加深对Dubbo的各配置参数底层实现原理的理解,更好的指导Dubbo实践,其目录如 ...

  9. Dubbo篇:基于Netty实现Dubbo协议编解码源码分析

    Dubbo协议解析 Dubbo协议设计参考了TCP/IP协议,包括协议头和协议体两部分.16字节报文头主要携带了魔法数(0xdabb,用于分割两个不同请求),以及当前请求报文是否是Request.Re ...

  10. WebRTC[1]-WebRTC中h264解码过程的源码分析

    目录 前言 正文 <WebRTC工作原理精讲>系列-总览_liuzhen007的专栏-CSDN博客_webrtc 原理前言欢迎大家订阅Data-Mining 的<WebRTC工作原理 ...

最新文章

  1. 批标准归一化(Batch Normalization)解析
  2. NutzWk 5.2.4 发布,Java 微服务分布式开发框架
  3. 编程之美-24点游戏方法整理
  4. 蓝凌ekp开发_新华教育集团战略升级,携手蓝凌量身定制数字化办公平台
  5. 字典统计排序python123_按值对字典进行排序Python(3级Dict)
  6. 现在做Android开发有前途吗?复习指南
  7. 克服密集恐惧症,目标检测代你实现钢筋精准计数
  8. AT89C51/AT89S51/STC89C51单片机烧录程序的区别
  9. NodeJS运行时抛出: Error: listen EADDRINUSE :::3000
  10. 去除CSDN 博客页广告的历程
  11. vue+node项目部署上线
  12. 德国IT行业薪酬水平大揭秘 v1.0
  13. Oracle Dataguard基于rac主库搭建rac备库
  14. 用来判断当前python语句在分支结构中是_【单选题】哪个选项是用来判断当前 Python 语句在分支结构中?...
  15. SAS学习笔记(二)排序、打印和汇总数据
  16. Android bug日志/错误收集
  17. html如何删除网页边框,如何从HTML表中完全删除边框
  18. Android-Universal-Image-Loader三大组件DisplayImageOptions、ImageLoader、ImageLoaderConfiguration详解
  19. BootStrap表格详解
  20. ssh-agent与ssh-sshd,开启ssh服务

热门文章

  1. 直播类 APP 项目开发实战(原理篇)
  2. 扫描仪支持linux驱动,开源扫描仪驱动sane支持的扫描仪列表
  3. 基于JAVA和MySQL的离散数学题库管理系统
  4. Android混淆篇 ijkplayer混淆
  5. 诺基亚3090微信java,适合Asha系列,微信登陆诺基亚S40平台
  6. 8Uftp连接服务器错误
  7. “三区三线”永久基本农田划定实用工具
  8. 兄弟连php课程大纲,LAMP兄弟连PHP课程学习笔记 第四天 流程控制分支语句
  9. 传感器i2c与arduino连接_ARDUINO的I2C通信详解 - arduino读取I2C总线上连接设备的地址...
  10. 嵌入式 Linux 入门 环境篇(一、开发板初体验)