本文系微信公众号和知乎专栏《MediaStack》原创文章,欢迎大家关注,随时进行交流。

上一篇介绍了OGG音频文件格式,其中涉及到Vorbis编解码,有网友反馈需要介绍一下,所以就查找了一些资料,本文做一下相关内容介绍。
介绍
Ogg Vorbis 是由 Xiph.Org 基金会开发的一种音频压缩格式,该基金会是一家致力于互联网多媒体技术领域的非营利组织。Ogg 本身是多个多媒体项目的大型框架,包括 Vorbis(音频)和 Tarkin(视频)。Vorbis 是 Ogg 系列中第一个针对音频压缩/解压缩的项目。
 Ogg Vorbis的编码和解码可以分为6大阶段。Vorbis 编码器将原始音频数据视为重叠但连续的短时间段,并分析音频数据以找到最佳的小表示。这个阶段称为分析。之后,它将音频数据编码为上一步中确定的更小的数据表示形式。这个阶段称为编码。然后原始数据包将被打包成流,称为流式传输。在另一端,解码器从流中提取原始数据包序列;该阶段称为流式分解。然后,它尝试从这些数据包中重建声音信号表示,称为解码。最后,音频信号将从合成阶段的解码表示中重新生成。
解码
在我们的项目中,只有解码器部分令人感兴趣(见图 1)。解码比编码简单且简单。解码器将 Ogg 流中的 Vorbis 数据包分解出来。然后,Vorbis 数据包在解码阶段进行处理,以提取底数、残差并进行通道解耦。频域中的音频信号被恢复、逆MDCT变换回时域并去重叠以形成输出音频信号。
在过去一段时间中,ogg vorbis 解码器被设计和实现为针对不同软核处理器的嵌入式系统。 例如网上资料用于 Motorola DSP56002的Ogg Vorbis 解码器、用于 DSP 处理器的嵌入式系统中的 Ogg/Vorbis 以及用于 LEON SoC 平台的片上系统音频播放器设计,以及microblaze 处理器(实现具有特定硬件的 ogg vorbis 解码器)。
下图显示了某公司提出的 ogg vorbis 解码器的架构,主要由 Microblaze 处理器、AC97 声音设备控制器和作为 IMDCT 硬件实现的 ogg vorbis 解码器部分组成。称为 Tremor 的定点解码器(由 Vorbis I 规范的创建者 Xiph.Org 开发)将被移植到 MicroBlaze 处理器,并且将开发 Ogg Vorbis 播放器。
提到Vorbis编码,就不得不说一下MDCT了。

MDCT
MDCT (Modified Discrete Cosine Transform) 变换是一种在信号处理和音频编码领域广泛应用的数学变换方法,是从DCT(离散余弦变换)演化而来,旨在提供更好的频谱分辨率。
核心原理:
MDCT变换通过将输入信号分割成重叠的时间段,并对每个时间段应用DCT变换来获得频域表示。其关键特点之一是窗函数的使用,常用的窗函数包括长短序列窗(Long-Short Sequence Window)或者加权平滑窗(Weighted Overlapped Segmental Averaging)。这些窗函数有助于减小频率泄露,并保持频谱的平滑性。
主要作用:
音频压缩:MDCT变换在音频编码中被广泛应用,如MPEG音频编码标准(如MP3、AAC)中的核心算法之一。它能够将音频信号从时域转换到频域,实现高效的数据压缩,并且保留了人耳对声音的感知特性,以达到高质量的音频重建。
语音和音乐分析:MDCT变换也用于语音和音乐信号的分析。通过将信号分解为频域表示,可以提取关键的频谱特征,如音高、音色、谐波结构等。这对于语音识别、音乐信息检索和音频信号处理等应用具有重要意义。
MDCT是线性正交重叠变换,由princen在论文中引入。到目前为止,MDCT广泛应用于最先进的音频编解码器中,例如MP3、AAC、Ogg vorbis。令x(k)为时域中的样本,n为块的大小。xt(k), k = 0..n-1 是用于计算块编号 t 的频域样本 Xt(k)k = 0..n/2-1 的样本。MDCT的方程为:
IMDCT公式如下:
具体内容参考https://media.taricorp.net/eusipco_corrected.pdf
MDCT 的详细描述可参见T. Sporer、K. Brandenburg 和 B. Edler 撰写的论文《使用多速率滤波器组进行高质量数字音频编码》 。

应用

Vorbis 是一种通用感知音频编解码器,旨在实现编码器的最大灵活性,从而使其能够在极其广泛的比特率范围内进行竞争性扩展。在高质量/比特率端(CD 或 DAT 速率立体声,16/24 位),它与 MPEG-2 和 MPC 处于同一联盟。同样,1.0 编码器可以以低于 48kpbs 的速率对高质量 CD 和 DAT 速率立体声进行编码,而无需重新采样到更低的速率。Vorbis 还适用于更低和更高的采样率(从 8kHz 电话到 192kHz 数字母带)和一系列通道表示(单声道、和弦、立体声、四声道、5.1、Ambisonic 或最多 255 个离散通道)。
解码器配置
解码器设置由多个独立组件抽象的配置组成,这些组件抽象在解码管道中执行特定功能。特定类型的每个不同组件实例在语义上是可以互换的;解码器配置包括内部组件配置以及将特定实例安排到解码管道中。组件排列大致如下:

解码过程

所有音频数据包的解码和合成过程基本相同:
(1)解码器读取 Vorbis 比特流的标头。该标头包含有关音频格式的信息,例如采样率、位深度和通道数。
(2)解码器读取码本,用于解码音频数据。码本被打包到比特流中,并且在使用之前必须将它们预解码到缓存中。
(3)解码器逐帧解码音频数据。每个帧包含一组样本,解码器使用码本从编码数据重建样本。
(4)解码器输出解码后的音频数据。
特别注意:Vorbis 解码过程相对简单,但计算量较大。这是因为码本被打包到比特流中,并且在使用它们之前必须将它们预解码到缓存中。
以下网址提供一个比较好理解的图,可以自行查阅:
https://www.mathworks.com/help/audio/ug/vorbis-decoder.html
关于更多Vorbis的详细解释和介绍,可以参考官网:
https://xiph.org/vorbis/doc/

我是一枚爱跑步的程序猿,维护公众号和知乎专栏《MediaStack》,有兴趣可以关注,一起学习音视频知识,时不时分享实战经验。
继续阅读
阅读原文