Audio 如何更改PCM数据流的体积(实验失败) 解决了的

Audio 如何更改PCM数据流的体积(实验失败) 解决了的,audio,pcm,Audio,Pcm,我的代码以前从未用于处理有符号值,因此字节->短转换错误地处理符号位。这样做很好地解决了问题 问题是。。。 我正在尝试更改PCM数据流的音量。我可以从立体声文件中提取单通道数据,通过跳过/复制/插入零等方式对样本进行各种愚蠢的实验效果,但我似乎找不到任何方式修改实际样本值并获得合理输出的方法 我的尝试非常简单: 源音频数据 价值-10000 价值+10000 数值*0.9 数值*1.1 (value=-value工作正常--反转波形,声音相同) 执行此操作的代码同样简单(I/O使用范围为0-65

我的代码以前从未用于处理有符号值,因此字节->短转换错误地处理符号位。这样做很好地解决了问题

问题是。。。 我正在尝试更改PCM数据流的音量。我可以从立体声文件中提取单通道数据,通过跳过/复制/插入零等方式对样本进行各种愚蠢的实验效果,但我似乎找不到任何方式修改实际样本值并获得合理输出的方法

我的尝试非常简单:

  • 源音频数据
  • 价值-10000
  • 价值+10000
  • 数值*0.9
  • 数值*1.1
  • (value=-value工作正常--反转波形,声音相同)


    执行此操作的代码同样简单(I/O使用范围为0-65535的无符号值)您的第四次尝试肯定是正确的方法。假设您的采样范围以0为中心,将每个采样乘以另一个值可以改变信号的音量或增益


    不过,在这种情况下,我猜当你将一个int乘以一个float并返回int时,在幕后发生了一些有趣的事情。不知道你在使用什么语言很难说,但这可能是导致问题的原因。

    谢谢奇美拉,这意味着我在某个地方有一个愚蠢的bug。当我发现有什么问题时,我会再发一次。代码是Java.Fixed格式的。感谢您确认乘以一个值是正确的方法——问题在于将字节流转换为短字节(实际上是一个愚蠢的bug;)。此外,@Justin建议这些值应该已经签名,这也指出了这个缺陷。
    // NOTE: INVALID CODE
    int sample = ...read unsigned 16 bit value from a stream...
    sample -= 32768;
    sample = (int)(sample * 0.9f);
    sample += 32768;
    ...write unsigned 16 bit value to a stream...
    
    // NOTE: VALID CODE
    int sample = ...read *signed* 16 bit value from a stream...
    sample = (int)(sample * 0.9f);
    ...write 16 bit value to a stream...