【问题标题】:uwp audioGraph convert 32 bit to 16 bit pcmuwp audioGraph 将 32 位转换为 16 位 pcm
【发布时间】:2017-02-19 01:01:59
【问题描述】:

我需要将录音从麦克风传递到缓冲区,然后从缓冲区传递到扬声器(我通过网络发送缓冲区)。 我的配置:Mic->AudioFrameOutput->Network->AudioFrameInput->Speakers。

我需要录制为 16 位/样本 PCM(用于网络)。 AudioGraph 的文档中提到它只支持 32 位浮点格式。 如何将 32 位录音转换为 16 位然后播放录音?

谢谢, 托尼

【问题讨论】:

  • 您是否需要将 32 位浮点数转换为 16 位整数的工具或逻辑/代码?
  • 我的意思是逻辑/代码

标签: audio uwp pcm


【解决方案1】:

如何将 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;

【讨论】:

    猜你喜欢
    • 2014-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-07
    • 1970-01-01
    • 1970-01-01
    • 2013-10-12
    相关资源
    最近更新 更多