我想知道放大WaveForm音频的正确公式来自C ++。
假设有一个16位波形数据: 0x0000 0x2000,0x3000,0x2000,0x0000,(负面部分),...
由于声学原因,只需加倍数字就不会产生两倍大的音频: 0x0000 0x4000,0x6000,0x4000,0x0000,(加倍负面部分),...
如果有人对音频修改有所了解,请告诉我。
答案 0 :(得分:6)
如果你将所有样本值加倍,它肯定会发出“两倍大声”的声音,即声音大6dB。当然,你需要小心避免因剪辑造成的失真 - 这就是为什么今天所有专业音频处理软件都在内部使用浮动样本的主要原因。
最终输出声音数据时,您可能需要返回整数。如果你只是为一些DAW编写一个插件(正如我建议的那样,你想要编写简单而有效的声音FX),它会为你做所有这些:你只需要浮点数,用它做点什么,以及再次输出一个浮点数。但是,如果您想直接输出.wav文件,则需要先限制输出,使0dB以上的所有值(通常的浮点流中为+ -1)被剪切为+ -1。然后,您可以乘以所需的整数类型可以达到-1的最大值,然后将其转换为该类型。完成。
无论如何,你肯定是对的,因为重要的是以对数方式而不是线性来扩展你的音量旋钮(很多消费级程序都没有,这只是愚蠢的,因为你最终会使用非常接近左端的值大部分时间的旋钮范围都很大,但这与放大计算本身无关,只是因为我们在对数刻度上感知信号的响度。然而,响度本身是由声压常数因子的简单乘法决定的,而声压常数因子与模拟电路中的电压和任何DSP中的数字样本的值成正比。
另一件事:我不知道你打算走多远,但如果你想要做到这一点真的你应该不要只剪掉超过0dB的峰值(剪辑)听起来非常苛刻),但实施适当的压缩机/限制器。然后,这将通过降低最大声部分的电平来自动防止削波。你也不想过度使用(流行音乐通常过度压缩,因此很多动态音乐表达都会丢失),但它仍然是一种提高音频水平的“不太危险”的方式。 / p>
答案 1 :(得分:1)
我每次都使用线性乘法,它永远不会失败。它甚至可以用于淡出例如......
所以
float amp=1.2;
short sample;
short newSample=(short)amp*sample;
如果您希望淡出为线性,请在样本处理循环中执行
amp-=0.03;
如果你想成为对数,那么在一个样本处理循环中做
amp*=0.97;
直到amp达到一个小值(amp <0.1)
答案 2 :(得分:0)
这可能是一个感知问题。你的耳朵(和眼睛 - 查看伽玛w.r.t.视频),在输入的线性响应中不会感知响度。一个很好的模型是你的耳朵响应感知ln(n)增加音量增加。查看线性电位器和音频电位器之间的区别。
无论如何,我不知道这是否重要,因为你的输出放大器可能会解释这个问题,但是如果你想让它被感知到两倍大声,那么你可能要把它放大两倍。这可能意味着你现在正处于剪裁领域。