Audio 使用浮点数时,用于表示音频样本的值的范围是多少

Audio 使用浮点数时,用于表示音频样本的值的范围是多少,audio,floating-point,sampling,representation,Audio,Floating Point,Sampling,Representation,我了解什么是浮点数,以及使用浮点数表示声音样本的优点。但是,阅读介绍性文档或我无法找到存储和内部处理通常使用的确切规模 因此,当使用浮点数时,样本*通常存储在: 在[0.0,-1.0]范围内,0.0对应于0dBFS 在[1.0,-1.0]范围内,0.0对应于0dBFS 在[1.0,0.0]范围内,1.0对应于0dBFS 还有别的吗 似乎没有什么能完全匹配2的补码有符号整数范围的不对称性质 *从@fdcpp的评论中排除超出比例的样本,“浮点音频在[-1.0,1.0]范围内”。请注意,边界是包

我了解什么是浮点数,以及使用浮点数表示声音样本的优点。但是,阅读介绍性文档或我无法找到存储和内部处理通常使用的确切规模

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

  • 在[0.0,-1.0]范围内,0.0对应于0dBFS
  • 在[1.0,-1.0]范围内,0.0对应于0dBFS
  • 在[1.0,0.0]范围内,1.0对应于0dBFS
  • 还有别的吗
似乎没有什么能完全匹配2的补码有符号整数范围的不对称性质


*从@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的补码有符号整数时,负值总是比正值多一个。因此,使用简单的除法(或乘法)不能同时:

  • 将完整整数范围映射到(分别从)到完整[-1;+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)

我让您测试其他位的大小。但是除以
(1在浏览文章时,这一点显然不清楚,但通常浮点音频在[-1.0,1.0]范围内.分贝满标度,是相对于最大振幅的振幅单位,其中0 dBFS是绝对最大值。这本身令人困惑,因为dB通常是响度的测量值。注:从维基百科dBFS文章中,单位dB FS或dBFS在AES标准AES17-1998、[13]IEC 61606、[14]和ITU-T P.38x、[15][16]中定义使满标度正弦波的RMS值指定为0 dB FS。这意味着满标度方波的RMS值为+3 dB FS。[17][18]感谢您@fdcpp的评论!我认为您的第一条评论是对我问题的明确回答。因此,请毫不犹豫地发布它。关于您的第二条评论,这解释了为什么最大振幅的方形信号实际上会被截断。在D/a转换期间,由于某些谐波(全部?),信号无法重建可能需要超过0dBFS限制。或者我误解了你的报价?老实说,+3dBFS的概念在你考虑它的时候是非常奇怪的。这个报价只是希望表明这有一个标准,无论它是否合理。你对方波的看法是对的。数字信号中的完美方波正在开启从谐波序列重构意味着频率内容超过奈奎斯特。所以,你应该总是在数字域中看到一些。
>>> 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
>>> [(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]