Solved
我的代码以前从未用于处理有符号值,因此字节 -> 短转换错误地处理了符号位。这样做正确地解决了问题。
问题是...
我正在尝试更改 PCM 数据流的音量。我可以从立体声文件中提取单通道数据,通过跳过/复制它们/插入零/等方式对样本进行各种愚蠢的实验效果,但我似乎找不到一种方法以任何方式修改实际样本值并获得合理的输出。
My attempts are really simple: https://i.stack.imgur.com/CDJzi.png https://i.stack.imgur.com/CDJzi.png
- 源音频数据
- 值 - 10000
- 值 + 10000
- 值 * 0.9
- 值 * 1.1
(值=-值工作正常——反转波浪,听起来是一样的)
执行此操作的代码同样简单(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...
我正在努力让样本变得更安静。我想象减小振幅(样本 * 0.9)会产生更安静的文件,但上面的 4. 和 5. 显然都是无效的。有SO 上有类似的问题 https://stackoverflow.com/questions/1149092/how-do-i-attenuate-a-wav-file-by-a-given-decibel-valueMusiGenesis 说他使用“sample *= 0.75”类型的代码得到了正确的结果(是的,我确实尝试了除了 0.9 和 1.1 之外的其他值)。
The question is: am I doing something stupid or is the whole idea of multiplying by a constant wrong? I'd like the end result to be something like this: https://i.stack.imgur.com/Wspe9.png https://i.stack.imgur.com/Wspe9.png
您的第四次尝试绝对是正确的方法。假设您的样本范围以 0 为中心,则可以将每个样本乘以另一个值来更改信号的音量或增益。
但在这种情况下,我猜当你将 int 乘以 float 并转换回 int 时,幕后会发生一些有趣的事情。在不知道您使用的语言的情况下很难说,但这可能就是导致问题的原因。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)