【问题标题】:What is the maximum (and minimum) 16-bit double value?16 位双精度值的最大值(和最小值)是多少?
【发布时间】:2021-05-20 14:59:04
【问题描述】:

我正在处理音频数据处理(来自/到WAV 文件,16 位),表示具有double 值(64 位)的样本。

由于我正在处理大量幅度域卷积,所以很多时候我的结果样本的(正或负)值“高于”可以用 16 位表示的“最大数据”,并且结果是它们被截断了。

所以我需要先规范化我的数据,然后再将其写入WAV 文件。

但我不清楚可以在 16 位上表示的最大(和最小)double 值是多少。

注意:这里我指的最小值是16位能表示的最大负双精度数。

编辑:16-bits double 我指的是从 16 位 WAV 文件中读取的数据,作为 double 值存储在我的代码中。经过幅度卷积后,这个数据发生大于1或小于-1。

【问题讨论】:

  • @Ted Lyngmo 感谢您的回答,我需要澄清一下:如何再次将其转换为 double ?我需要在 wav 文件中写入双精度值。一个简单的static_cast<double> result; 可以吗?
  • -32,768 到 +32,767 是 16 位有符号整数的范围。把它变成双精度不应该改变这一点。 https://ideone.com/ZnbKfR
  • 这是一个描述 16 位浮点位布局的 Wikipedia 条目:IEEE 16-bit floating point

标签: c++ audio double wav


【解决方案1】:

16 位双精度值的最大值(和最小值)是多少?

不清楚您所说的“16 位双精度”是什么意思。

C++ 中有一个数字类型double。它是一个浮点类型。 C++ 语言没有定义其最大或最小可表示值(尽管它确实定义了一个最小范围,实现可能会超过该范围),但可以使用std::numeric_limits 检查这些限制。

但是,在大多数系统上,double 是 64 位类型,即 IEEE-754 标准中指定的“双精度”浮点类型。


一个 16 位类型最多可以表示 216 个不同的值。

如果用来表示无符号整数,范围为[0, 216)。

如果用于表示有符号整数,则范围将取决于符号的表示方式。在最常见的 2 补码表示中,范围为 [-216-1, 216-1)

WAV 文件

在 Microsoft WAVE 格式中,16 位样本是 2 的补码有符号整数。有关它们的取值范围,请参见上一段。

【讨论】:

  • 我编辑了这篇文章以阐明我对 16 位双精度的含义。
  • 次要观点:C++(通过 C)确实定义了floatdouble 类型的最小 所需范围。就像整数类型一样,这些都是通过描述类型的 C 宏来实现的。因此,例如,FLT_MAXDBL_MAXLDBL_MAX 必须至少为 1E+37。
【解决方案2】:

简单的答案是您的分母(用于规范化 16 位数据)是 2^15(假设已签名 PCM)。

将所有传入的 16 位数据除以 32767 是我的标准化解决方案。或许32768可以做个案例,数据范围是-32768到32767,但我一直用32767。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-14
    相关资源
    最近更新 更多