如何更改PCM数据流的音量(实验失败)

Gil*_*ead 10 audio pcm

解决了

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

问题是......

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

我的尝试非常简单: http://i.imgur.com/FZ1BP.png

  1. 源音频数据
  2. 值 - 10000
  3. 值+ 10000
  4. 值*0.9
  5. 值*1.1

(value = -value工作正常 - 反转波并听起来相同)

执行此操作的代码同样简单(I/O使用0-65535范围内的无符号值) < - 这就是问题,读取正确签名的值可以解决问题:

// 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...
Run Code Online (Sandbox Code Playgroud)

我想让样品更安静.我想,使幅度变小(样本*0.9)会产生更安静的文件,但上面的4和5都显然无效.在SO上有一个类似的问题,MusiGenesis说他用'sample*= 0.75'类型的代码得到了正确的结果(是的,我确实尝试了除0.9和1.1之外的其他值).

问题是:我做了一些愚蠢的事情,还是整个想法乘以一个不变的错误?我希望最终结果是这样的: http://i.imgur.com/qUL10.png

Chi*_*ura 9

你的第四次尝试绝对是正确的方法.假设您的样本范围以0为中心,则将每个样本乘以另一个值是您可以如何更改信号的音量或增益.

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

  • 固定的。感谢您确认乘以一个值是正确的方法——问题在于将字节流转换为 shorts(确实是一个愚蠢的错误;))。另外@Justin 建议值应该已经签名指出了这个缺陷。 (2认同)