g729源码分析-9-g729-解码
来源:互联网 发布:淘宝卖什么东西最赚钱 编辑:程序博客网 时间:2024/05/20 06:26
现在来分析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的测试代码看出来,解码的过程被清晰地分成了两个部分.
第一部分,就解码出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的源码分析来理解这一块代码.
敬畏:在先哲面前,懂得自身的渺小
求知:程序员的本能
不懈:自律者的品质
0 0
- g729源码分析-9-g729-解码
- g729源码分析-9-g729-解码
- g729源码分析-开篇
- g729源码分析-开篇
- G729
- g729源码分析-1-lpc分析
- g729源码分析-1-lpc分析
- G729编解码
- g729源码分析-7-增益量化
- g729源码分析-8-内存更新打包
- g729源码分析-7-增益量化
- g729源码分析-8-内存更新打包
- g729分析笔记
- g729分析笔记
- g729编解码的总结
- g729源码分析-2-共振锋感知加权
- g729源码分析-3-基音周期搜索(上)
- g729源码分析-4-基音周期搜索(中)
- Eclipse快捷键 10个最有用的快捷键
- Linux开发环境搭建与使用——Linux必备软件之SSH
- g729源码分析-7-增益量化
- Windows Server2008R2、2012R2重置系统开机登陆密码
- g729源码分析-8-内存更新打包
- g729源码分析-9-g729-解码
- 用 css 美化滚动条
- JAVA No suitable driver found for jdbc:microsoft:sqlserver://localhost:1433/xxxxxx 解决办法
- 事件委托
- Windows8.1 64位 安装 Ruby Sass Compass
- ZooKeeper Quota's Guide
- thinkphp缓存设置
- cocos2d-x集成友盟消息推送SDK(ios版)
- iOS 检测版本更新