主要内容

Vorbis译码器

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

Vorbis基础知识

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

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

Vorbis格式的灵活性体现在它使用不同的方法来表示和编码信号的底层和剩余部分。算法介绍模式作为一种机制来指定这些不同的方法,从而对不同的帧进行不同的编码。

Vorbis使用霍夫曼编码来压缩地板和剩余部分中包含的数据。Vorbis使用动态概率模型,而不是MP3的静态概率模型。具体来说,Vorbis为音频信号构建了自定义代码本,这些代码本可能因“地板”和“残留物”以及帧与帧之间的差异而不同。

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

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

问题概述和设计细节

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

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

为了在Simulink®中实现Vorbis解码器,必须对可变大小的数据包进行寻址。这个例子通过使用“OggS”同步模式捕获Ogg位流的整个页面来处理可变大小的数据包。出于实际目的,假定一个页面不大于5500字节。在页面开始处获得分段表后,模型从页面剩余部分提取逻辑数据包。对解码序列的异步控制是使用状态流图“解码所有数据页”实现的。

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

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

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

的重组地板上而且残留以及后续的逆MDCT (IMDCT)也用MATLAB函数块实现,该函数块使用了fastimdct音频工具箱功能。在函数块的输入和输出处使用固定大小的最大长度帧,并通过在函数块代码和紧跟在函数块后面的选择器块中使用窗口长度参数来考虑可变帧长。

IMDCT将帧转换回时域,准备与合成窗口相乘,然后使用重叠添加操作进行组合。

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

参考文献

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

Baidu
map