主要内容

Vorbis译码器

这个例子展示了如何实现一个Vorbis解码器,这是一个免费的、开源的MP3标准替代品。这种音频解码格式支持将编码数据分割成小数据包,以供网络金宝app传输。

Vorbis基础知识

Vorbis编码格式[1]是一种开源的有损音频压缩算法,类似于MPEG-1 audio Layer 3,更常被称为MP3。Vorbis有许多与MP3相同的功能,同时增加了灵活性和功能。Vorbis规范只定义了位流的格式和解码算法。这允许开发人员随时间改进编码算法,并与现有解码器保持兼容。

编码首先将原始信号分割成重叠的帧。Vorbis允许不同长度的帧,因此它可以有效地处理平稳和瞬态信号。每一帧乘以一个窗口,使用改进的离散余弦变换(多层螺旋ct).然后将框架分解为一个粗略的近似,称为地板上,余数称为残留

Vorbis格式的灵活性通过使用不同的方法来表示和编码信号的底部和剩余部分来说明。该算法引入了模式作为一种机制来指定这些不同的方法,从而以不同的方式编码不同的框架。

Vorbis使用Huffman编码压缩包含在地板和剩余部分的数据。Vorbis使用动态概率模型而不是MP3的静态概率模型。具体来说,Vorbis为音频信号构建自定义代码本,它可以根据“楼层”和“剩余”以及帧与帧之间的不同而不同。

Huffman编码完成后,帧数据被位打包成一个逻辑包。在Vorbis中,一系列这样的包的前面总是有一个头。报头包含正确解码所需的所有信息。此信息包括一组完整的代码本、表示底层和剩余的方法的描述,以及多通道支持的模式和映射。金宝app标题还可以包括一般信息,如比特率,采样率,歌曲和艺术家的名字,等等。

Vorbis提供了自己的格式,称为“Ogg”,将逻辑数据包封装到传输流中。Ogg格式提供了帧、同步、定位和错误校正等机制,这些机制对于网络上的数据传输是必要的。

问题概述和设计细节

本例中的Vorbis解码器实现了Vorbis I格式的规范,该格式是Vorbis的一个子集。示例模型解码任何包含单声道或立体声音频信号的原始二进制OGG文件。该示例模型具有实时解码和回放多种Vorbis音频文件的能力。

您可以使用任何Vorbis音频文件或包含的音频文件来测试这个示例汉德尔文件。要将文件加载到模型中,请将模型顶层注释代码中的文件名替换为您想要测试的文件的名称。完成此步骤后,单击注释代码以加载新的音频文件。如果由于输入数据的更改而改变了输出采样率,则该模型被配置为通知您。在这种情况下,需要用新的采样率重新启动模拟。

为了在Simulink®中实现Vorbis解码器,您必须处理可变大小的数据包。金宝app本例通过使用“OggS”同步模式捕获整个Ogg位流页面来处理大小可变的包。出于实际目的,假设页面不大于5500字节。在页面的开头获得一个分割表后,模型从页面的其余部分提取逻辑数据包。解码序列的异步控制是使用状态流程图“Decode All page of Data”来实现的。

最初,图表尝试检测“OggS”同步模式,然后遵循上面描述的解码步骤。使用Simulink函数“decodePage”对页面进行解码,然后模金宝app型立即返回到检测下一个“OggS”序列。状态'ResetPageCounter'与上面描述的statflow算法并行添加,以支持无限次迭代的压缩输入文件的循环。金宝app

数据页包含不同类型的信息:标题、码本和音频信号数据。Simulink函数中的'decodePage'中的'Read Setup Info', 'Read The Header'和'Decode Audio'子系统负责处理这些不同种类的信息。金宝app

解码过程采用MATLAB函数块实现。示例中的大多数位解包例程是用MATLAB代码实现的。

重组地板上残留随后的逆MDCT (IMDCT)也用MATLAB函数块使用快速实现imdct音频工具箱的功能。在函数块的输入和输出处使用固定大小的最大长度框架,并在函数块代码和紧挨着函数块的Selector块中使用窗口长度参数来考虑可变帧长度。

IMDCT将帧转换回时域,准备乘上合成窗口,然后通过重叠加运算进行组合。

模型顶层的输出块将解码块的输出提供给系统上的音频播放设备。将解码信号的有效部分输入到音频设备的作家块。

参考文献

[1] Vorbis解码器标准的完整规范https://xiph.org/vorbis/doc/Vorbis_I_spec.html