使用浮点数时,用于表示音频样本的值的范围是什么

问题描述 投票:0回答:1

我了解floating点号是什么,以及使用它们表示声音样本的优点。但是,在阅读介绍性文档thisthat时,我无法确切找到存储和内部处理常用的比例尺。

因此,当使用浮点数时,通常会存储样本*

  • 在[0.0,-1.0]范围内,其中0.0对应于0dBFS
  • 在[1.0,-1.0]范围内,其中0.0对应于0dBFS
  • 在[1.0,0.0]范围内,其中1.0对应于0dBFS
  • 还有其他东西吗?

似乎没有完美匹配2的补码有符号整数范围的不对称性质。


*,不包括超出比例的样本
audio floating-point sampling representation
1个回答
0
投票

[来自@fdcpp的评论,“浮点音频在[-1.0,1.0]范围内”。注意边界是包容的。

当涉及从有符号整数转换为有符号整数时,这使事情变得异常复杂。问题是对于16位带符号整数,最大正值为32767,但最小值为-32768:

>>> int.from_bytes(b"\x7F\xFF", 'big', signed=True)
32767
>>> int.from_bytes(b"\x80\x00", 'big', signed=True)
-32768

无论位长是多少,当使用2的补码有符号整数时,总会有一个负值,即正值。因此,使用简单的除法(resp。乘法),您同时cannot

  • 将完整的整数范围映射到[[;; + 1]的完整范围]
  • 将int(0)映射到float(0.0)。

对于保留0-> 0.0映射的简单实现,请看下面的代码:

FLOAT32 = 'f'
FLOAT64 = 'd'

def simple_conv_test(nbits, floatFormat):
    """ Map the full scale of nbit signed integers to float
        and back to int. Display if the process is transparent
        (i.e. there is no loss of precision)
    """
    input = array('l', [-(1<<nbits-1), -1, 0, 1, (1<<nbits-1)-1])
    for factor in -input[0], input[-1]:
        print('Factor=', factor)
        int2float = array(floatFormat, [i/factor for i in input])
        float2int = array('l', [int(i*factor) for i in int2float])
        print(input)
        print(int2float)
        print(float2int)
        print("Transparent?", float2int == input)

您可以看到是否使用两个明显的因子(16位的32768或32767)中的任何一个,我们在浮点表示中不使用[-1; +1]范围满量程:

>>> simple_conv_test(16, FLOAT32)
Factor= 32768
array('l', [-32768, -1, 0, 1, 32767])
array('f', [-1.0, -3.0517578125e-05, 0.0, 3.0517578125e-05, 0.999969482421875])
array('l', [-32768, -1, 0, 1, 32767])
Transparent? True
Factor= 32767
array('l', [-32768, -1, 0, 1, 32767])
array('f', [-1.000030517578125, -3.0518509447574615e-05, 0.0, 3.0518509447574615e-05, 1.0])
array('l', [-32767, 0, 0, 0, 32767])
Transparent? False

Bjorn Roche我让您测试其他位大小。但是当使用float32中间表示形式时,除以(1<<nbits-1)-1最多仅透明至24位。

要将全范围映射到全范围,您必须牺牲0到0.0的映射:

>>> [(v+0.5)/(32767.5) for v in [-32768, -1, 0, 1, 32767]]
[-1.0, -1.5259021896696422e-05, 1.5259021896696422e-05, 4.5777065690089265e-05, 1.0]

选择一种解决方案要比其他解决方案全都需要权衡。最好在blog post by Bjorn Roche上进行解释,但是似乎没有一个完善的约定将声音样本从带符号整数映射到浮点数并返回。并且不同的硬件制造商或软件开发人员似乎做出了不同的选择。

© www.soinside.com 2019 - 2024. All rights reserved.