假设将WAV或AIFF文件中的浮点样本归一化是否正确?

杰里米·弗里斯纳

假设我有一个程序可以读取.WAV或.AIFF文件,并且文件的音频被编码为浮点样本值。我的程序假设任何格式正确(基于浮点数)的.WAV或.AIFF文件仅包含[-1.0f,+ 1.0f]范围内的样本值,是否正确?我在WAV或AIFF规范中找不到解决此问题的任何内容。

如果这不是一个有效的假设,那么人们如何知道文件中音频的整个动态范围是什么呢?(我可以读取整个文件,并找出文件的实际最小样本值和最大样本值是多少,但是有两个问题:(1)如果文件很大,那将是一个缓慢/昂贵的操作,并且(2 ),它将丢失信息,因为如果文件的创建者希望文件具有一定的“净空”,以免在dbFS的最大响点上播放,则我的程序将无法检测到该信息)

用户名

如您所说,公共可用文档没有详细介绍用于浮点的范围。但是,从过去几年的行业实践以及作为浮点文件存在的实际数据来看,我认为这是一个正确的假设。

这是有实际原因的,而且对于彩色,音频,3D等高精度数据的标准化范围非常普遍。

范围在[-1,1]范围内的主要原因是它快速且容易缩放/转换为目标位范围。您只需要提供目标范围并相乘即可。

例如:

如果要以16位播放,则可以这样做(伪,假定带符号的舍入为整数结果):

sample = in < 0 ? in * 0x8000 : in * 0x7fff;

或24位:

sample = in < 0 ? in * 0x800000 : in * 0x7fffff;

或8位:

sample = in < 0 ? in * 0x80 : in * 0x7f;

等等,而无需以任何方式调整原始输入值。-1和1表示转换为目标(1x = x)时的最小值/最大值。

如果您使用[-0.5,0.5]的范围,则首先(或在某些时候)必须调整输入值,因此转换为例如16位将需要额外的步骤-这不仅会增加成本,这是额外的步骤,但也可以像我们在浮点域中那样工作,因为浮点域的计算量很大(后者可能有点遗留原因,因为如今浮点处理非常快,但无论如何)。

in = in * 2;
sample = in < 0 ? in * 0x8000 : in * 0x7fff;

将其保持在[-1,1]范围内,而不是在某些预先缩放的范围内(例如[-32768,32767]),也可以使用更多位进行精度(使用IEEE 754表示法)。

更新2017/07

测验

根据评论中的问题,我决定通过使用三个文件(正弦波为1秒)进行测试来进行三重检查:

A)浮点限幅
B)浮点最大值0dB,
C)整数限幅(从A转换)

然后,在data块和大小字段之后开始扫描文件的正值<= -1.0和> = 1.0 ,以使最小值/最大值反映音频数据中的实际值。

结果证实,当未削波时(非真实<= 0 dB),该范围确实在[-1,1]包含范围内

但这也揭示了另一个方面-

保存为浮点WAV文件允许值超过0 dB的范围内。这意味着对于通常会剪切的值,该范围实际上超出了[-1,1]。

对此的解释可能是由于动态范围的损失很小,因此浮点格式旨在用于生产设置中,因为动态范围的损失很小,将来的处理(增益分段,压缩,限制等)可以使值恢复(无损失)。处于最终和正常的-0.2-0 dB范围内;因此,将这些值保持原样。

结论

使用浮点的WAV文件将在不进行裁剪时(<= 0dB)将值保存在[-1,1]中,但确实允许将被裁剪的值

但是,当转换为整数格式时,这些值裁剪到由整数格式的位范围缩放的等效[-1,1]范围。由于每个宽度可以容纳的范围有限,因此很自然。

因此,播放器/ DAW /编辑软件将通过标准化数据或简单地回切为[-1,1]来处理剪切的浮点值。

文件1
注意:所有文件的最大值直接从样本数据中测量。

文件2
注意:产生为削波浮点(+6 dB),然后转换为有符号16位并返回浮点

文件3
注意:削波至+6 dB

文件4
注意:削波至+12 dB

简单的测试脚本和文件可以在这里找到

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章