我想知道从C++放大WaveForm音频的正确公式是什么。
假设有一个16位的波形数据: 0x0000 0x2000,0x3000,0x2000,0x0000,(负数部分),...
由于声学原因,仅将数字加倍不会产生像这样的两倍大的音频: 0x0000 0x4000,0x6000,0x4000,0x0000,(加倍的负数部分),...
如果有谁知道音频修改,请让我知道。
发布于 2011-05-18 06:43:12
如果你将所有的样本值加倍,它肯定会听起来“两倍大”,也就是说,6dB的声音。当然,你需要小心避免由于剪辑而引起的失真-这就是为什么今天所有的专业音频处理软件都内部使用浮动样本的主要原因。
当最终输出声音数据时,您可能需要返回到整数。如果你只是在为某个DAW写一个插件(如果你想编写简单而有效的声音效果),它将为你做所有这些事情:你只需要得到一个浮点数,用它做一些事情,然后再次输出一个浮点数。但是,例如,如果您想要直接输出一个.wav文件,则需要首先限制输出,以便将高于0dB (在通常的浮点流中为+-1 )的所有内容裁剪为仅为+-1。然后,您可以乘以所需的整数类型可以达到的最大值-1,然后将其强制转换为该类型。好了。
无论如何,你肯定是对的,因为按对数而不是线性缩放音量旋钮是很重要的(许多消费级程序不是这样做的,这太愚蠢了,因为大多数时候你最终会使用非常接近旋钮范围左端的值),但这与放大计算本身无关,只是因为我们在对数刻度上感知到信号的响度。尽管如此,响度本身是由声压的恒定因子的简单乘法确定的,该恒定因子又与模拟电路中的电压和任何DSP中的数字采样值成比例。
另一件事:我不知道你打算走多远,但如果你想真正正确地做到这一点,你不应该只是修剪超过0dB的峰值(修剪听起来非常刺耳),而是实现一个适当的压缩器/限制器。然后,这将通过降低最响亮部分的电平来自动防止剪裁。你也不想过度这样做(流行音乐通常都是过度压缩的,因此很多动态的音乐表达都会丢失),但它仍然是一种“不太危险”的提高音频级别的方法。
发布于 2011-05-18 18:16:41
我每次都使用线性乘法,它从来没有失败过。例如,它甚至适用于淡出。
所以
float amp=1.2;
short sample;
short newSample=(short)amp*sample;如果您希望淡入淡出是线性的,那么在样本处理循环中需要这样做
amp-=0.03;如果你想成为对数,在一个样本处理循环中
amp*=0.97;直到放大器达到某个较小的值(amp < 0.1)
发布于 2011-05-18 06:44:49
这可能只是一个感知问题。你的耳朵(和眼睛--抬头看伽马w.r.t.视频),不要在对输入的线性响应中感知到响度。一个很好的模型是,当音量增加n时,你的耳朵会对ln(n)的增加做出反应。查找线性pots和音频pots之间的区别。
无论如何,我不知道这在这里是否重要,因为你的输出放大器可能会解释这个问题,但如果你想让它被感知到两倍的音量,你可能必须把它的音量调到e^2倍。这可能意味着你现在已经进入了裁剪的领域。
https://stackoverflow.com/questions/6037947
复制相似问题