我的代码以前从未用于处理签名值,而且这样的字节 - >短转换错误地处理了符号位。正确地解决了这个问题。
我正在尝试更改PCM数据流的音量。我可以从立体声文件中提取单通道数据,通过跳过/复制它们/插入零/等对样本做各种愚蠢的实验效果但我似乎找不到以任何方式修改实际样本值的方法并得到一个合理的产出。
我的尝试非常简单: http://i.imgur.com/FZ1BP.png
(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...
我正试图让样品更安静。我想,使幅度变小(样本* 0.9)会产生更安静的文件,但上面的4和5都显然无效。有a similar question on SO MusiGenesis说他用'sample * = 0.75'类型的代码得到了正确的结果(是的,我确实尝试了除0.9和1.1之外的其他值)。
问题是:我做了一些愚蠢的事情,还是整个想法乘以一个不变的错误?我希望最终结果是这样的: http://i.imgur.com/qUL10.png
答案 0 :(得分:9)
你的第四次尝试绝对是正确的方法。假设您的样本范围以0为中心,则将每个样本乘以另一个值是您如何更改信号的音量或增益。
在这种情况下,我猜想当你将一个int乘以一个浮点数并回流到int时,幕后发生了一些有趣的事情。很难说不知道你正在使用什么语言,但这可能是造成问题的原因。