gpt4 book ai didi

audio - 使用 float 时,用于表示音频样本的值的范围是多少

转载 作者:行者123 更新时间:2023-12-03 01:29:09 25 4
gpt4 key购买 nike

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

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

  • 在[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; +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

    我让您测试其他位大小。但是,当使用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上进行更好的解释,但是似乎没有一个完善的约定将声音样本从有符号整数映射到浮点数再返回。而不同的硬件制造商或软件开发商似乎做出了不同的选择。

    关于audio - 使用 float 时,用于表示音频样本的值的范围是多少,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58952722/

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