Audio uwp音频记录器将32位转换为16位pcm

Audio uwp音频记录器将32位转换为16位pcm,audio,uwp,pcm,Audio,Uwp,Pcm,我需要将录音从麦克风传送到缓冲区,然后从缓冲区传送到扬声器(我通过网络发送缓冲区)。 我的配置:麦克风->音频帧输出->网络->音频帧输入->扬声器 我需要记录在16位/样本PCM(用于网络)。 AudioGraph的文档提到它只支持32位浮点格式。 如何将32位录音转换为16位,然后播放录音 谢谢, Tony如何将32位浮点转换为16位整数是流式音频世界中的一个非常普遍的愿望。。。这里我们将32位浮点缓冲区(数组)中的一个元素转换为有损(32位不适合16位)无符号16位整数。。。输入浮点从-1

我需要将录音从麦克风传送到缓冲区,然后从缓冲区传送到扬声器(我通过网络发送缓冲区)。 我的配置:麦克风->音频帧输出->网络->音频帧输入->扬声器

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

谢谢,
Tony

如何将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是有符号的还是无符号的(通常是无符号的)
  • 我是在处理big-endian还是little-endian字节顺序,这在通过线路发送内存缓冲区(通常是little-endian)时很重要,特别是当您可能需要将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<值<1

示例A


示例B

您可以将乘法速度提高32768,方法是将其替换为左移位。。。移位操作所取代的2的功率决定了移位的位数

outputA = int((input_32_bit_floats[index] + 1.0) * 32768) - 1;
将成为

outputA = ( int(input_32_bit_floats[index] + 1.0)  << 15) - 1;

outputA=(int(输入32位浮点数[index]+1.0)您是否需要工具或逻辑/代码将32位浮点数转换为16位整数?我指的是逻辑/代码
outputA = int((input_32_bit_floats[index] + 1.0) * 32768) - 1;
outputA = ( int(input_32_bit_floats[index] + 1.0)  << 15) - 1;