如何将 32 位浮点数转换为 16 位整数是流音频世界中非常普遍的愿望......在这里,我们将 32 位浮点数缓冲区(数组)的元素转换为有损(32 位不适合成 16 位)无符号 16 位整数 ... 输入浮点数从 -1 变化到 +1
my_16_bit_unsigned_int = ((input_32_bit_floats[index] + 1.0) * 32768) - 1;
在这个最直接的层面上播放音频数据时,您会面临许多基本的设计决策:
- 是浮点的输入音频波,从 -1 到 +1,或 -0.5 到 +0.5,或从 0 到 +1 或其他变化
- 我希望我的输出 16 位 PCM 是有符号还是无符号(通常是无符号)
- 我处理的是大端还是小端字节顺序,这在通过线路(通常是小端)发送内存缓冲区时很重要,尤其是当您可能需要将 16 位整数缓冲区折叠成字节流时
了解这些问题并在考虑上述方程的数据后得到答案确实假设音频波的输入 32 位浮点表示在 -1.0 到 +1.0(典型值)之间变化
你问那个值 32768 是从哪里来的? ...好吧 16 位整数有 2^16 个不同的值,范围从 0 到 ( 2^16 - 1 ) 所以如果您的输入浮点数从 -1 到 +1 变化,我们首先添加 1 使其从 0 变化到 +2这使得我们的输出无符号(没有负数),然后我们将该范围内的值乘以 32768,然后减去 1 以适应 0 的起始下限,这样整数的输出范围从 0 变化到(2^16 - 1).. . 或 0 到 65537,总共有 2^16 个不同的整数值
让我们用具体的例子来分解它
- 这次输入的 32 位浮点数从 -1.0 到 +1.0 不等……实际上范围是 -1
示例 A
inputA = -0.999 # close to minimum possible value
outputA = int((input_32_bit_floats[index] + 1.0) * 32768) - 1;
outputA = int(( -0.999 + 1.0) * 32768) - 1;
outputA = int( 0.001 * 32768) - 1;
outputA = int( 32.768) - 1;
outputA = 33 - 1;
outputA = 32; # close to min possible value of 0
示例 B
inputB = 0.999 # almost max possible value
outputB = int((input_32_bit_floats[index] + 1.0) * 32768) - 1;
outputB = int((0.999 + 1.0) * 32768) - 1;
outputB = 65503 - 1;
outputB = 65502 # close to our max possible value of 65537
您可以通过向左位移来替换它来加快乘法 32768 ...您移动的位位置取决于您的移位操作要替换的 2 的幂...
outputA = int((input_32_bit_floats[index] + 1.0) * 32768) - 1;
会变成
outputA = ( int(input_32_bit_floats[index] + 1.0) << 15) - 1;