写在最前
之前分享了G719代码的集成,见链接,最近还在集成过程中,具体效果还没具体体验过,回家没事,看了看编解码的数学理论,这里也简单分析下。
在看代码和文档的过程中,简单搜了一下,这块的博客还是比较少的,中文相关只搜到一些论文,这也是为什么我会记录一下的原因。
关于G719的最好的文档,自然是源码附带的英文文档,看了一下,算法描述和代码几乎能对应的大差不差,十分推荐。
但是,由于附带的文档是英文,有些人(比如我)可能需要一些简单的翻译,因此可以参考一些论文。相关的论文可以看一下这篇硕士论文,第二章的算法描述还算是详细,很多原算法都涉及到,对算法的理解还是很有用的,不过对于算法某些细节的描述还是比较模糊,甚至歪曲了原有的意思。建议还是用个翻译软件阅读原文,少走弯路。
当然,这里也穿插一些外行的翻译,便于理解和记录。
编码器
音频分为编码器和解码器,相对来说,编码器内容较多,理解了编码器,也对解码器的研究更加顺畅,比较两者是一个相反的操作。
G719编码器的结构图:
摘自G719文档。
音频信号首先经过一个瞬态稳态检测器,检测当前帧是稳态信号还是瞬态信号,然后根据瞬态稳态信息进行离散余弦变换,对变换得到的频谱系数分组成不同的带宽,经过增益估计、归一化频谱系数、频谱包络量化编码、增益加权调整、比特分配,编码、噪声调整、频带扩展等步骤生成最终数据。其中会使用霍夫曼编码对量化增益调整后的差分索引值以及归一化的频谱系数索引进行编码。(具体描述见原文。)
解码器
G719解码器结构图:
解码器的输入是编码数据,输出是48k的音频信号。
经过瞬态标志解码,接下来就是频谱包络解码,使用与编码相同的比特精确、分配,解码各频带增益,经过噪声调整、频带扩展等步骤重建,获取到全频带频谱系数后反变换得到时域信号,时域信号经过加窗等可以进行重建时域信号了。
算法延时
算法的输入和输出都是20ms,其中在窗处理的部分使用了连续两帧 的数据,也就是40ms,重叠部分50%,因此有效的提前缓冲区是20ms,理论延时40ms。
算法复杂度
文档中也提供了编解码器的平均复杂度和最高复杂度,可以看出,随着码率提高,复杂度也会相应提高,最高码率128k的时候WMOPS只有21,和其他算法相比,复杂度较低。WMOPS(Weighted Millions of Operations Per Second, 每秒加权数百万次操作)
具体原理分析
原理分析夹杂这一些代码的解读,这里分成多次更新: