gpt4 book ai didi

floating-point - 假设 WAV 或 AIFF 文件中的浮点样本将被规范化是否正确?

转载 作者:行者123 更新时间:2023-12-03 20:48:53 24 4
gpt4 key购买 nike

假设我有一个读取 .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 block 和大小字段以使最小/最大值反射(reflect)音频数据中的实际值。
结果证实,当不削波(非真 <= 0 dB)时,该范围确实在 [-1, 1] 范围内。
但这也揭示了另一个方面——
保存为浮点的 WAV 文件确实允许超过 0 dB 范围的值。这意味着对于通常会裁剪的值,范围实际上超出了 [-1, 1]。
对此的解释可能是浮点格式旨在用于生产设置中的中间使用,因为动态范围的损失很小, future 的处理(增益分级、压缩、限制等)可以带回值(没有损失)在最终和正常的 -0.2 - 0 dB 范围内;并因此保留原样的值。
综上所述
使用浮点的 WAV 文件将在不削波 (<= 0dB) 时将值保存在 [-1, 1] 中,但确实允许被认为是削波的值
但是,当转换为整数格式时,这些值将剪辑到由整数格式的位范围缩放的等效 [-1, 1] 范围,无论如何。这是很自然的,因为每个宽度可以容纳的范围有限。
因此,播放器/DAW/编辑软件将通过规范化数据或简单地剪辑回 [-1, 1] 来处理剪辑的浮点值。
file1
注意:所有文件的最大值均直接从样本数据中测量。
file2
注意:产生为削波浮点 (+6 dB),然后转换为有符号 16 位并返回浮点
file3
注:削波至 +6 dB
file4
注:削波至 +12 dB
简单的测试脚本和文件可以找到 here .

关于floating-point - 假设 WAV 或 AIFF 文件中的浮点样本将被规范化是否正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29761331/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com